Miller Robbin测试模板(无讲解)

本文介绍了一种基于Miller-Rabin算法的快速素数检测方法,并通过C++代码实现了该算法。通过对给定数值进行多次随机检验,可以高效地判断一个数是否为素数。
想着费马定理和二次探测定理就能随手推了。
做一次是log 2n的。
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long int ll;
 4 ll T,n;
 5 ll qpow(ll x,ll y,ll mod)
 6 {
 7     ll ans=1,base=x;
 8     while(y)
 9     {
10         if(y&1)ans=ans*base%mod;
11         base=base*base%mod;
12         y>>=1;
13     }
14     return ans;
15 }
16 bool check(ll p,ll a,ll m,ll q)
17 {
18     if(a==p)return 1;
19     ll base=qpow(a,m,p);
20     ll last=base;
21     for(int i=1;i<=q;++i)
22     {
23         base=base*base%p;
24         if(base==1&&last!=1&&last!=p-1)return 0;
25         last=base;
26     }
27     if(base!=1)return 0;
28     return 1;
29 }
30 bool miller(ll n)
31 {
32     if(n==1)return 0;
33     if(n==2)return 1;
34     if(n%2==0)return 0;
35     ll x=n-1,sum=0;
36     while(x%2==0){++sum;x/=2;}
37     if(!check(n,2,x,sum))return 0;
38     if(!check(n,3,x,sum))return 0;
39     if(!check(n,5,x,sum))return 0;
40     if(!check(n,7,x,sum))return 0;
41     if(!check(n,11,x,sum))return 0;
42     if(!check(n,13,x,sum))return 0;
43     if(!check(n,17,x,sum))return 0;
44     return 1;
45 }
46 int main()
47 {
48     ios::sync_with_stdio(false);
49     cin>>T;
50     while(T--)
51     {
52         cin>>n;
53         cout<<n<<" "<<(miller(n)==1?"Yes":"No")<<endl;
54     }
55     return 0;
56 }
View Code

 

转载于:https://www.cnblogs.com/GreenDuck/p/10670479.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值