【问题标题】:Primality check algorithm素数检查算法
【发布时间】:2010-01-13 08:16:46
【问题描述】:

素数检查可能是数学中的“那些”难题之一。因此,什么是可用于检查大量数字的最佳和最快的算法。最粗暴最慢的方式大概是:

public static bool IsPrime(int i)
{
    for (var x = 2; x < i - 1; i++)
    {
         if (i % x == 0)
         {
             return false;
         }
    }
    return true;
}

最近我读到 768 位 RSA 算法已经被暴力破解,使用网格计算阵列。他们如何对一个巨大的素数执行蛮力?每个处理单元是否占用一系列数字,将其分解并检查该范围内的所有数字是否为素数?

【问题讨论】:

  • 难道你不只需要 for 循环到你要找的素数的一半吗?例如,如果你的数字是 100,那么 50 是可能影响它的最大数字,不是吗?
  • ceil(sqrt(i)) 是你需要检查的最大因素
  • 也许我很笨,但我认为 floor(sqrt(i)) 是您需要检查的最大因素?
  • int.MaxValue 在素数测试领域不算是“巨大的数字”。你的数字有多大?
  • 严格来说,您不需要检查任何因数来确定一个数是否为素数。对于我们关心的大数,椭圆曲线素性检验在实践中是最快的,而改进的 AKS 素性检验具有最低的可证明复杂性。我不认为它们中的任何一个实际上都会产生一个因素。 RSA 破解确实需要产生因子,所以基本上你问错了问题。

标签: algorithm cryptography


【解决方案1】:

查看 Wikipedia 上的 primality tests 以获取指向当前算法的指针

关于您的幼稚实现,请注意,如果数字可以被 2 整除,您可以立即返回 false,从而只检查奇数。此外,如果您没有找到 x 小于配对。因此,如果您没有首先找到较小的因素,那么您就完成了。

在你必须去https://mathoverflow.net/寻求帮助之前,你还可以将更多技巧应用于幼稚算法:)

【讨论】:

  • 嗯。不要去 mathoverflow.net 寻求帮助,因为这不是研究/学术主题。 (那里可能欢迎有关特定素性测试算法的具体问题)
【解决方案2】:

破解 RSA-768 并不直接涉及任何素数检查算法,而是需要一个因式分解算法:RSA-768 是两个非常大的素数的乘积,破解它需要找到这些素数。

使用的分解算法是 Lenstra 的 Number Field Sieve

您可以在此处阅读全文:Factorization of a 768-bit RSA modulus

【讨论】:

    【解决方案3】:

    这应该会快一些:

    public static bool IsPrime(int i) {        
        // only go up to the root of i 
        // +1 to be save from floating point rounding errors, ceil should work too.
        var max = sqrt(i) + 1;
    
        // skip numbers dividable by 2, except 2 itself
        if (i == 2) return true;
        if (i % 2 == 0) return false;
        for (var x = 3; x < max; x+=2)  {
             if (i % x == 0)  {
                 return false;
             }
        }
        return true;
    }
    

    【讨论】:

      【解决方案4】:

      我想存在某种工作负载分布,但我怀疑他们是否使用如此简单的算法进行素数测试。也许他们使用了number field sieveLenstra's elliptic curve factorization

      【讨论】:

        【解决方案5】:

        素数测试!= 分解。

        破解特定的 RSA 公钥并检索私钥,需要分解。

        构造 RSA 公钥/私钥对的过程包括素数测试。大多数不用于因式分解的素性测试不会产生 100% 确定的答案,而是probabilistic 具有任意高的概率(更多的测试迭代 = 更高的概率)。

        从技术上讲,您可以拥有一个快速的deterministic primality test,并且不涉及实际计算所讨论数字的任何因素。

        【讨论】:

          【解决方案6】:

          我建议使用Fermat's Little Theorem'x' 的值为素数 if ((a ^ (x-1)) % x) == 1强>。其中 'a' 是任意数字,'x' 不等于 1、0 或 2

          【讨论】:

            【解决方案7】:
            public static bool IsPrime(int i)
            {
                for (var x = 2; x < (i/2); x++)
                {
                     if (i % x == 0)
                     {
                         return false;
                     }
                }
                return true;
            }
            

            【讨论】:

              猜你喜欢
              • 2021-12-02
              • 2020-09-20
              • 2016-11-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-08-24
              相关资源
              最近更新 更多