【发布时间】: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 破解确实需要产生因子,所以基本上你问错了问题。