您的位置:首页 > 其它

Miller-Rabin大数素性测试

2015-10-17 17:12 169 查看
素性测试是检验一个给定的整数是否为质数的测试。

对于确定型算法试除法,即尝试从2到√N的整数是否整除N,若N较大,则算法无法在如今大多数机器上一个可以忍耐的时间内结给出结果。使用随机化算法Miller-Rabin素性测试 则可以在极短的时间内得到一个较准确的结果,并且可以通过综合多次随机测试结果将错误概率降为可以忽略不计。

Miller-Rabin素性测试 基于费马小定理

费马小定理:假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p)。

即:假如a是整数,p是质数,且a,p互质(即两者只有一个公约数1),那么a的(p-1)次方除以p的余数恒等于1。

对于费马小定理,其近似逆命题

若a^(p-1)≡1(mod p),且a属于集合{1,2,3,…,p-1},则p为质数

几乎成立。

若能判断所有属于集合{1,2,3,…,p-1}的a都满足a^(p-1)≡1(mod p),即可确定p为质数,然而若p为合数,只有很少的a属于集合{1,2,3,…,p-1}会使a^(p-1)≡1(mod p)成立。据此可以设计算法:随机选取a属于集合{1,2,3,…,p-1},若a^(p-1)≡1(mod p)不成立,可 确定 p为合数,否则可以 几乎确定 p为质数,多次随机选取a增加判断的准确率。

算法实现:

int isPrime(long long x,int times){
/*  x为待测试数,times为测试次数   */
long long a,b,r;
for (srand(x+rand()); times--;){
a = ((x-2)*rand()*1./RAND_MAX)+2;
b = x - 1;
for (r = 1; b; b >>= 1){
b&1?r=r*a%x:0;
a=a*a%x;
}
if (r%x!=1) return 0;
}
return 1;
}


该算法实际运行时的准确率远高于预期,测试结果:

100000000内数据测试100000000次单次测试times设为1错误率0%
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: