费马小定理测素数

素性测试(Miller-Rabin测试)

首先,一个叫费马的人提出:如果一个数p是质数,且gcd(a,p)==1。那么(a^p)%p==a,这就是费马小定理。 然后我们反向利用这个定理,随便拿一个a,来算一算(ap)%p,如果等于a,就认为p是素数。

#include<bits/stdc++.h>
using namespace std;
//快速幂
void solve(int b){
	int a=b-1,c=b;
	a=a%c;
	while(b){
		if(b&1)a=(a*a)%c;
		b>>=1;
		a=(a*a)%c;
	}
	if(a!=((b-1)%c)){
		cout<<"NO";
		return ;
	}
	a=b+1;
	a=a%c;
	b=c;
	while(b){
		if(b&1)a=(a*a)%c;
		a=(a*a)%c;
		b>>=1;
	}
	if(a!=(b+1)%c){
		cout<<"NO";
		return ;
	}
	cout<<"YES";
	return ;
} 


int main(){
	//利用快速幂判断素数
	//对于任意一个素数P
	//如果gcd(a,b)==1,那么有(a^P)%P==a;反向利用这个定理:对于任何一个素数,取几个a如果有(a^b)%b=a,则该数为素数
	int t;
	cin>>t;
	solve(t);
} 

 

亲测可用代码。

 

 

 

 

点赞