Miller_Rabin算法快速判断大数是否为素数

Miller_Rabin算法快速判断大数是否为素数

并不是绝对,这只是一种判断大概率为素数的方法

首先根据费马小定理有:ap1=1(modp)(app)

又因为p为素奇数,所以p1为偶数,表示为p1=2dm

所以有ap11=0(modp)

a2dm1=0(modp)

(a2d1m1)(a2d1m+1)=0(modp)

从而有a2d1m=1(modp)||a2d1=p1(modp)

以此类推有am,a2m,a22m...ap1

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
ll qpow(ll x,ll y,ll mod){
	__int128 ans = 1,xx = x;
	while(y){
		if(y&1) ans=(ans*xx)%mod;
		xx = (xx*xx) % mod;
		y>>=1;
	}
	return ans;
}
bool f(ll x){
	if(x == 2) return 1;
	if(x < 2 || x % 2 == 0) return 0;
	ll tem = x-1,d = 0;
	while(tem % 2 == 0){
		tem/=2;
		d++;
	}
	bool ff = 1;
	for(int i = 1;i <= 20;i++){
		ll a = rand()%(x-1) + 1;
		__int128 xx = qpow(a,tem,x);
		if(xx == 1 || xx == x - 1) continue;
		int j;
		for(j = 1;j <= d;j++){
			xx = (xx*xx)%x;
			if(xx == x - 1)
				break;
		}
		if(j == d + 1)
			ff = 0;
	}
	return ff;
}
int main()
{
	ll x;
	while(~scanf("%lld",&x)){
		if(f(x))
			cout << 'Y' << endl;
		else
			cout << 'N' << endl;
	}
}
posted @   xxcdsg  阅读(28)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示