【问题标题】:Sample code for fast primality testing in C# [duplicate]C# 中快速素性测试的示例代码 [重复]
【发布时间】:2011-05-13 07:24:00
【问题描述】:

可能重复:
Fastest algorithm for primality test

希望参考 C# 中快速素性测试的示例代码,最好使用 BigInteger 或其他可变大小类型。

【问题讨论】:

标签: c# algorithm primes


【解决方案1】:

这是 c# 中的 Miller Rabin 测试:

    bool MillerRabin(ulong n)
    {
        ulong[] ar;
        if (n < 4759123141) ar = new ulong[] { 2, 7, 61 };
        else if (n < 341550071728321) ar = new ulong[] { 2, 3, 5, 7, 11, 13, 17 };
        else ar = new ulong[] { 2, 3, 5, 7, 11, 13, 17, 19, 23 };
        ulong d = n - 1;
        int s = 0;
        while ((d & 1) == 0) { d >>= 1; s++; }
        int i, j;
        for (i = 0; i < ar.Length; i++)
        {
            ulong a   = Math.Min(n - 2, ar[i]);
            ulong now = pow(a, d, n);
            if (now == 1) continue;
            if (now == n - 1) continue;
            for (j = 1; j < s; j++)
            {
                now = mul(now, now, n);
                if (now == n - 1) break;
            }
            if (j == s) return false;
        }
        return true;
    }

    ulong mul(ulong a, ulong b, ulong mod)
    {
        int i;
        ulong now = 0;
        for (i = 63; i >= 0; i--) if (((a >> i) & 1) == 1) break;
        for (; i >= 0; i--)
        {
            now <<= 1;
            while (now > mod) now -= mod;
            if (((a >> i) & 1) == 1) now += b;
            while (now > mod) now -= mod;
        }
        return now;
    }

    ulong pow(ulong a, ulong p, ulong mod)
    {
        if (p == 0) return 1;
        if (p % 2 == 0) return pow(mul(a, a, mod), p / 2, mod);
        return mul(pow(a, p - 1, mod), a, mod);
    }

【讨论】:

  • 赛义德:非常感谢。我将代码转换为 BigInteger 类型。效果很好,速度极快。
  • 这很漂亮。我想知道您是如何得出ar 值的?我可以查找任何参考资料吗?
  • @Chris,看看序列A014233
  • 这不是质数测试,而是复合性测试。仅仅因为一个数字通过并不意味着它是素数。
  • @Dubslow,对于 ulong 范围,这是正确的素性测试,我想你没有注意到“ar”数组的用法。这不仅仅是米勒拉宾测试。如果没有任何数组排除一些重要的例外,而米勒拉宾找不到它们,那么你是对的。查看 miller rabin 失败的合数序列,并通过提供的算法对 ulong 范围进行比较。您可以在我上面的其他评论中找到序列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 1970-01-01
  • 2011-04-17
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
相关资源
最近更新 更多