AKS算法是由来自 Indian Institute of Technology Kanpur 的三名计算机科学家发明,取其姓氏首字母命名。其内容为:
一个数n是素数,当且仅当多项式
展开后的所有系数都可以被n整除。
代码如下:
long long c[100];
void coef(int n)
{
int i, j;
if (n < 0 || n > 63) abort(); // gracefully deal with range issue
for (c[i=0] = 1; i < n; c[0] = -c[0], i++)
for (c[1 + (j=i)] = 1; j > 0; j--)
c[j] = c[j-1] - c[j];
}
int is_prime(int n)
{
int i;
coef(n);
c[0] += 1, c[i=n] -= 1;
while (i-- && !(c[i] % n));
return i < 0;
}
AKS算法可以在多项式复杂度内判定任何数,但系数增长过快,依然不够实用。
目前并没有产生随机大素数的有效方法。因此要产生一个大素数的方法是,随机选取一个足够大的奇数并检验它是否是素数,如果不是则重新选取一个继续检验直到某个奇数通过测试。该方法的缺点是通过检验的奇数可能仍然不是素数,但可以按照需要做到使得通过检验的奇数不是素数的概率尽可能接近0。常用的概率判断方法有 Fermat 小定理、Miller−Rabin 算法及Solovay−Strassen算法。
下一篇:c语言指数函数