Cryptography 密码系统素数的辅助查找
我是一名大学生,有一项作业要求寻找大素数。教授给了我下面的“简单”算法来寻找2个可能的素数Cryptography 密码系统素数的辅助查找,cryptography,primes,Cryptography,Primes,我是一名大学生,有一项作业要求寻找大素数。教授给了我下面的“简单”算法来寻找2个可能的素数 生成随机a和p,其中1
通过这次作业,我意识到计算素数绝非玩笑。我看到的上述算法的问题是,如果我猜测大数并用模幂运算测试它们,我可能会尝试将大数提升为大数。这使我产生了怀疑。我也研究过确定性有限自动机和埃拉托斯提尼筛。有人对改进给定的算法或提供任何帮助有什么建议吗?谢谢您的时间。不久前,我用C#编写了一些函数供个人使用。我希望这对你有好处 公共长tmp; public long[]tabnum=新长[1] 公共无效初始值(长数值) { 长时间休息; 长里索
// 2 is only number pair prime
tabnum[0] = 2;
for (tmp = 3; tmp <= NUM; tmp++)
{
if ((tmp % 2) == 0) continue;// if num it's pair is not prime
for (long Y = 0; Y < tmp; Y++)
{
riso = Math.DivRem(tabnum[Y], tmp, out Resto);
if (Resto == 0) break;
if(riso <= tabnum[Y])
{
Array.Resize(ref tabnum, tabnum.Length + 1);
tabnum[tabnum.Length - 1] = tmp;
List1.Items.Add(tmp.ToString("###,###"));
break;
}
}
}
//2是唯一的数对素数
tabnum[0]=2;
对于(tmp=3;tmp而言,您所遵循的算法称为。但是,您的解释存在几个问题:
- 你说“确认gcd(a,p)小于1”。这没有意义,因为gcd永远不会小于1。你可以检查的是gcd(a,p)==1。如果它不是1,那么p不是素数。这可以检测卡迈克尔数,但这样做的机会很小
- 测试的方法是,对于p的某个值,你选取a的几个随机值,并检查a^(p-1)%p==1。如果其中一个值不是1,那么p就不是素数。你选取的a值越多,你的精确度就越好
- 您当然不能像您所说的那样检查x的所有值,因为要检查的值太多了
- 有一种快速执行模幂运算的方法,即使对于大的基数和指数也是如此。请参阅。您仍然需要一种方法来对大整数执行乘法和模幂运算
- Eratosthenes筛只对寻找小素数有用
- 此测试可能会错误地确定Carmichael数是素数。其他算法(如)不存在此问题
用C#表示有点简单。我不知道它的速度是否会更快
bool IsPrime(long n)
{
if (n == 1)
{
return false;
}
if (n < 4)
{
return true;
}
if ((n % 2) == 0)
{
return false;
}
if (n < 9)
{
return true;
}
if ((n % 3) == 0)
{
return false;
}
long r = (long)Math.Floor(Math.Sqrt(n));
long f = 5;
while (f <= r)
{
if ((n % f) == 0)
{
return false;
}
if ((n % (f + 2)) == 0)
{
return false;
}
f += 6;
}
return true;
}
bool IsPrime(长n)
{
如果(n==1)
{
返回false;
}
if(n<4)
{
返回true;
}
如果((n%2)=0)
{
返回false;
}
if(n<9)
{
返回true;
}
如果((n%3)==0)
{
返回false;
}
long r=(long)Math.Floor(Math.Sqrt(n));
长f=5;
虽然(f)这对于寻找密码学所需规模的大素数没有用处。比另一个更糟。“比另一个更糟”。Thanx,但有效。这对大数不合适,我知道。你有其他最好的算法吗?:)-1:考虑到他们需要大素数,以及教授建议使用随机算法,这是完全不切实际的。-1:除了long中低端的数字外,它不会更快,而且不会回答问题,因为作业不允许选择较慢但更简单的算法测试。白痴:修改很简单格雷格:OP从来没有提到不能使用不同的算法。(但就像我说的,我不知道上面的算法有多高效。)Bignum类不是这里的问题。对于加密所需大小的素数,您可以让它运行数百万年,但它仍然不会返回。即使您将long
替换为bitineger
也没有用。对于非常小的素数,例如2^256,这需要大约2^128次迭代,这将花费非常长的时间。I与检测其他至少有3个素数因子的复合非卡迈克尔数相比,gcd测试无法更好地检测卡迈克尔数。它只是随机寻找公因子。由于gcd(a,p)!=1意味着a^(p-1)%p!=1,因此完全没有必要检查gcd(a,p)==1。如果您确实在寻找卡迈克尔数字,则可能必须进行此测试。
bool IsPrime(long n)
{
if (n == 1)
{
return false;
}
if (n < 4)
{
return true;
}
if ((n % 2) == 0)
{
return false;
}
if (n < 9)
{
return true;
}
if ((n % 3) == 0)
{
return false;
}
long r = (long)Math.Floor(Math.Sqrt(n));
long f = 5;
while (f <= r)
{
if ((n % f) == 0)
{
return false;
}
if ((n % (f + 2)) == 0)
{
return false;
}
f += 6;
}
return true;
}