Greatest common divisor 不用GCD方法求余素数

Greatest common divisor 不用GCD方法求余素数,greatest-common-divisor,Greatest Common Divisor,在不使用任何标准GCD算法的情况下,是否有可能知道两个给定的数字是否为同素数?我使用了欧几里德、二进制GCD和莱默算法。如果可能,建议一种比这些更快的方法。这两个数字可以大到10^5,因此生成Faray序列也没有用。您可能会发现这两种简单实现中的一种比您在注释中链接的函数更快。它是c#代码,但应该很容易转换为c或java。它们适合于unsigned int,但是为另一种类型编写版本应该很简单 public static uint Gcd(uint value1, uint value2) {

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

您可能会发现这两种简单实现中的一种比您在注释中链接的函数更快。它是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));
}

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