博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Miller-rabin判素数
阅读量:4690 次
发布时间:2019-06-09

本文共 740 字,大约阅读时间需要 2 分钟。

用Miller-rabin判素数之前,先要知道一个叫费马小定理的东西。

费马小定理:如果p是质数,那么任意和p互质的数的p-1次方对p取模都等于一。

即:任意gcd(a,p)==1,那么a^(p-1)≡1(mod p)

既然我们用费马小定理又得到了一个新的质数的性质,那么我们就可以用这个性质来判定素数。

为了判定p是不是质数,我们随机检验一些a检验a^(p-1)mod p是否为1

但是这样判定一个素数并不是百分百正确的,有一些数不是素数,但依据费马小定理还是会判定成素数。

例如:p=561=3*11*17,无论如何取a,都满足费马小定理的素数性质。

于是我们就需要利用二次探测的思想:

p是质数,则x^2≡1(mod p)仅有两个解,x1=1,x2=p-1(很显然,(p-1)^2=p^2-2p+1),我们这样计算a^(p-1):

  1.我们令p-1=2^s * t(因为p是质数,p-1一定是偶数,偶数一定可以表示成2^s * t)

  2.然后我们来分解2^s * t,设x0=a^t,xi=x(i-1)^2,最后我们可以得到xs=a^(p-1)(等比数列)

  3.如果|xi|!=1,且x(i+1)=1,那么p显然不是质数(因为该方程只有两个解,如果出现这种情况就是有另解,为合数)。

上面介绍了算法原理,下面是算法流程:

  1.按照上面的方法计算a^(p-1)(如果p不是质数,那么此时有可能直接返回)

  2.检查a^(p-1)≡1(mod p)

  3.当a是2~p-1的随机数时,如果p返回是合数,那他就是一定合数,如果返回是质数,则有一半的机会是质数

转载于:https://www.cnblogs.com/gshdyjz/p/7273745.html

你可能感兴趣的文章
[解题报告] 100 - The 3n + 1 problem
查看>>
Entity Framework 学习高级篇1—改善EF代码的方法(上)
查看>>
Mybatis逆向工程配置文件详细介绍(转)
查看>>
String类的深入学习与理解
查看>>
不把DB放进容器的理由
查看>>
OnePage收集
查看>>
Java parseInt()方法
查看>>
yahoo的30条优化规则
查看>>
[CCF2015.09]题解
查看>>
[NYIST15]括号匹配(二)(区间dp)
查看>>
json_value.cpp : fatal error C1083: 无法打开编译器生成的文件:No such file or directory
查看>>
洛谷 P1101 单词方阵
查看>>
Swift DispatchQueue
查看>>
C#和JAVA 访问修饰符
查看>>
集合框架
查看>>
小甲鱼OD学习第1讲
查看>>
【转】简述生成式对抗网络
查看>>
HDU-1085 Holding Bin-Laden Captive-母函数
查看>>
php提示undefined index的几种解决方法
查看>>
轻量级原生 ajax 函数,支持 get/array post/array post/json
查看>>