首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >素性检验算法

素性检验算法
EN

Stack Overflow用户
提问于 2010-01-13 16:16:46
回答 7查看 1.8K关注 0票数 5

素性检验可能是数学中的“那些”难题之一。那么,检查大数的素性的最好和最快的算法是什么?最原始和最慢的方法可能是:

代码语言:javascript
复制
public static bool IsPrime(int i)
{
    for (var x = 2; x < i - 1; i++)
    {
         if (i % x == 0)
         {
             return false;
         }
    }
    return true;
}

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-01-13 16:24:49

在维基百科上查看primality tests,找到当前算法的指针

关于您的朴素实现,请注意,如果数字可以被2整除,那么您可以立即返回false,允许您只检查奇数。此外,如果你找不到一个因子,其中x <= sqrt(i),它是质数。这是因为如果您确实找到了一个大于sqrt(i)的因子,那么它必须与一个小于sqrt(i)的因子配对。因此,如果你没有首先找到那个较小的因素,你就完了。

在你不得不去https://mathoverflow.net/寻求帮助之前,还有几个技巧可以应用于一个朴素的算法:)

票数 10
EN

Stack Overflow用户

发布于 2010-01-13 18:07:49

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

所使用的因式分解算法是伦斯特拉的Number Field Sieve

你可以在这里阅读全文:Factorization of a 768-bit RSA modulus

票数 7
EN

Stack Overflow用户

发布于 2010-01-13 16:29:05

这应该会快得多:

代码语言:javascript
复制
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;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2055300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档