Miller Rabbin素数测试

步骤

①先写快速幂取模函数

②MR算法开始

(1)传入两个参数一个是底数一个是n也就是幂数,如果n是一个合数那么可以判定,这个数一定不是素数

(2)然后开始寻找一个奇数的n去计算,如果最后满足a^d%n=1那么这个可能就是一个素数,然后再判断k=n-1(目前数学不好不明所以)

(3)MR结束

③编写check函数,传入一个参数。首先排除一些情况

(1)是2 3 7 61(int范围内完全可以判断的底数)如果是的话return true;

(2)是偶数,1,3的倍数或5的倍数或7的倍数所有条件并起来如果满足一个那么return false

④开始进行MR的判断,一般int范围内判断2,3,7,61即可

⑤编写主函数然后输出即可

#include <bits/stdc++.h>
using namespace std;
int qpow(int a,int b,int c)
{
	long long ans=1;
	long long base=a;
	while(b)
	{
		if(b&1)
		ans=ans*base%c;
		base=base*base%c;
		b>>=1;
	}
	return ans;
}
bool MR(int a,int n)
{
	int r=0,d=n-1;
	if(!(n%a))
	return false;
	while(!(d&1))
	{
		d>>=1;
		r++;
	}
	long long k=qpow(a,d,n);
	if(k==1) return true;
	for(int i=0;i<r;i++,k=k*k%n)
	if(k==n-1)
	return true;
	return false;
}
bool check(int n)
{
	if(n==2||n==3||n==7||n==61)
	return true;
	if(!(n&1)||!(n%3)||!(n%5)||n==1)
	return false;
	if(MR(2,n)&&MR(7,n)&&MR(61,n)&&MR(3,n))
	return true;
	return false;
}
main()
{
	int k;
	while(cin>>k)
	check(k)?cout<<"Y
":cout<<"N
";
}
原文地址:https://www.cnblogs.com/baccano-acmer/p/9800816.html