Miller-Rabin素数快速检测
2024-08-25 02:21:52
【update 2017-03-26】http://www.cnblogs.com/candy99/p/6624643.html
满足费马小定理 a^(n-1) === 1(mod n)
--->伪素数
对于所有a belong Zn*,总存在满足的合数n,称为Carmichael数
----------------------------------
【Miller-Rabin】:
1.随机找多个s个a
2.二次探测定理: 如果p是奇素数,则 x2 === 1(mod p)的解为 x = 1 || x = p - 1(mod p) {如:5的话,1或4}
//Miller-Rabin
//n prime a -->a^(n-1)===1(mod n) -->fastPowMod(a,n-1,n)==1
//warn: Carmichael/lucky ll mulModhaoxiangmeiyonghenman(ll a,ll b,ll n){
ll ans=;
for(;b;a=(a<<)%n,b>>=)
if(b&)
ans=(ans+a)%n;
return ans;
} ll mulMod(ll a,ll b,ll n){ //黑科技
ll ans=(a*b-(ll)((long double)a/n*b+0.5)*n);
return ans<?ans+n:ans;
} ll powMod(ll a,ll b,ll n){
ll ans=;
for(;b;a=mulMod(a,a,n),b>>=)
if(b&)
ans=(ans*a)%n;
return ans;
} bool witness(ll a,ll n,ll u,int t){
ll now=powMod(a,u,n),pre=now; for(int i=;i<=t;i++){
now=mulMod(now,now,n);
if(now==&&pre!=&&pre!=n-)
return true;
pre=now;
}
if(now!=) return true;
return false;
} bool mrP(ll n){
if(n<=) return false;
if(n==) return true;
if((n&)==) return false; ll u=n-;
int t=;
while((u&)==) u>>=,t++; //n-1=2^t *u int a[]={,,,,,}; //or random
for(int i=;i<;i++){
if(n==a[i]) return true;
else if(witness(a[i],n,u,t)) return false;
}
return true;
}
最新文章
- CSS背景图拉伸不变形
- 如何利用OCS缓存TomcatSession全局变量(转)
- CListCtrl
- 解决centos7重启后出现ata bus error
- JS面向对象的几种写法
- 零基础如何入门Python
- dede修改templets模板文件夹后,出现“无法在这个位置找到: ”错误的解决办法
- 【English】六、am,is,are 分别用在什么地方
- java 运算符的优先级比较
- python 全局变量
- supervisor学习
- 操作dom影响性能的原因
- Android播放功能的实现
- 拓扑排序 --- AtCode - 3596
- 利用media query让背景图适应不同分辨率的设备
- SearchBySql
- poj3252Round Numbers【组合数】【数位dp】
- java8新特性——并行流与顺序流
- 从Github上轻松安装R包—githubinstall包--转载
- 应用性能管理工具PinPoint介绍