在不使用GCD方法的情况下查找共素数

时间:2014-03-13 21:27:43

标签: greatest-common-divisor

在没有使用任何标准GCD算法的情况下,是否可以知道两个给定的数字是否是共同素数?我使用过Euclidean,Binary GCD&莱默的算法。如果可能的话,建议一个比这些更快的方法。两个数字可以大到10 ^ 5,因此生成一个Faray序列也没用。

1 个答案:

答案 0 :(得分:3)

您可能会发现这两个简单实现中的一个比您在评论中链接的功能更快。它是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);
}

看起来由于模运算符会慢一些,但至少在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));
}