【问题标题】:Finding Co-prime numbers without using GCD method不使用 GCD 方法查找互质数
【发布时间】:2014-03-15 06:59:41
【问题描述】:

是否有可能在不使用任何标准 GCD 算法的情况下知道两个给定数字是否互质?我使用了欧几里得、二进制 GCD 和 Lehmer 算法。如果可能的话,建议一种比这些更快的方法。这两个数字可以大到 10^5,因此生成法雷数列也没有用。

【问题讨论】:

  • 需要多快?仅在 c# 中使用互质测试的基本 GCD 实现,对于最大范围为 32 位整数的随机整数平均只需要大约 110 纳秒。在你提到的范围内,时间会更短。
  • 我得到了一个数字数组,数组的大小可以达到 10^5 并且数组中的每个数字可以最大为 10^5。这就是我想避免 GCD 实现的原因
  • 我的观点是 GCD 在性能方面并没有那么糟糕。发布您迄今为止最快的代码。它可能不是 GCD,它可能是你的实现。有一些方法可以提高性能。例如,这个初始位旋转(x | y) & 1 可以过滤掉两个数字都是偶数的情况,这应该是给定随机输入的 25% 的时间,并且几乎不需要任何时间。
  • @hatchet ideone.com/uYCeiN 它只有 gcd 代码 sn-p

标签: greatest-common-divisor


【解决方案1】:

您可能会发现这两个简单实现之一比您在评论中链接到的函数更快。它是 c# 代码,但应该很容易转换为 c 或 java。这些是为 unsigned int 设计的,但为另一种类型编写版本应该很简单。

public static uint Gcd(uint value1, uint value2) {
    while (value1 != 0) {
        uint t = value2 % value1;
        value2 = value1;
        value1 = t;
    }
    return value2;
}

public static uint GcdR(uint value1, uint value2) {
    return (value1 == 0) ? value2 : GcdR(value2 % value1, value1);
}

由于模运算符,In 似乎会更慢,但至少在 c# 中,它比您链接的函数快两倍多(在将其转换为 c# 之后)。我发现第一个非递归版本稍微快一些。对于您使用的语言,您必须进行基准测试以查看是否比您拥有的更快。使用 Gcd 的 IsCoprime 是这样的

public static bool IsCoprime(this uint value1, uint value2) {
    // 25% of possible pairings are even num to even num so handle them
    // with a bit twiddle that's much faster than GCD function. If they
    // are both even, then they can't be coprime (2 is common divisor).
    return ((((value1 | value2) & 1) != 0)
            && (Gcd(value1, value2) == 1));
}

【讨论】:

    猜你喜欢
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多