Primality Check可能是数学中“那些”难题之一。所以,什么是最好和最快的算法可用于检查大量的素数。最原始和最慢的方式可能是:
public static bool IsPrime(int i)
{
for (var x = 2; x < i - 1; i++)
{
if (i % x == 0)
{
return false;
}
}
return true;
}
最近我读到使用网格计算阵列使用暴力破解了768位RSA算法。他们如何在巨大的素数上执行蛮力?每个处理单元是否占用一系列数字,将其考虑在内并检查该范围内所有数字的素数?
答案 0 :(得分:10)
查看维基百科上的primality tests以获取当前算法的指示
关于你的天真实现,请注意,如果数字可以被2整除,你可以立即返回false,这样你就可以检查奇数。另外,如果你没有找到x&lt; = sqrt(i)的因子,那么它就是素数。这是因为如果您确实找到大于sqrt(i)的因子,那么它必须与因子小而不是sqrt(i)配对。所以如果你没有先找到那个较小的因子,你就完成了。
在你必须前往https://mathoverflow.net/寻求帮助之前,还有一些技巧可以应用于天真的算法:)
答案 1 :(得分:7)
破解RSA-768没有直接涉及任何素性检查算法,而是需要的是因子分解算法:RSA-768是两个非常大的素数的产物,并且破解它涉及找到这些素数。
使用的分解算法是Lenstra的Number Field Sieve。
您可以在此处阅读完整文章:Factorization of a 768-bit RSA modulus。
答案 2 :(得分:5)
这应该快得多:
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;
}
答案 3 :(得分:3)
我认为存在某种工作负载分配,但我怀疑他们是否使用这么简单的算法来进行素性测试。也许他们使用了number field sieve或Lenstra's elliptic curve factorization。
答案 4 :(得分:1)
原始性测试!=分解。
中断特定的RSA公钥并检索私钥,需要进行分解。
构建RSA公钥/私钥对的过程包括素性测试。大多数素性测试不用于因子分解不能产生100%明确的答案,而是probabilistic具有任意高概率(更多的测试迭代=更高的概率)。
从技术上讲,你可以拥有一个快速的deterministic primality test,并且不涉及实际计算相关数字的任何因素。
答案 5 :(得分:0)
我建议使用Fermat's Little Theorem。如果((a ^(x-1))%x)== 1 < &#39; x&#39; 的值为素数 / EM> 即可。 &#39; a&#39; 是任何数字, &#39; x&#39;不等于1,0或2 。
答案 6 :(得分:-1)
public static bool IsPrime(int i)
{
for (var x = 2; x < (i/2); x++)
{
if (i % x == 0)
{
return false;
}
}
return true;
}