Miller_Rabin 简要版

本文介绍了Miller-Rabin素数判定算法,包括其基于费马小定理的朴素检验、为何失败以及如何通过二次探测改进。详细阐述了算法的实现过程,并讨论了算法的应用。通过多次随机选取基数进行测试,该算法能有效提高素数判定的准确性。
部署运行你感兴趣的模型镜像

Miller_Rabin 简要版

简介:通俗易懂版本。

1.很 naive 的检验——费马小定理的逆定理

我们知道 nnn 为质数的时候 an−1≡1(modn)a^{n-1}\equiv1\pmod{n}an11(modn) 成立。

所以不妨就随机几个 aaa 为底然后判断一下费马小定理是否成立即可。

mt19937 Rand(time(0));
LL mul(LL a,LL b,LL p){
	return (__int128)a*b%p;
}LL pow(LL a,LL b,LL p){
	LL ans=1;
	for(;b;b>>=1){
		if(b&1)ans=mul(ans,a,p);
		a=mul(a,a,p);}
	return ans;
}bool pd(LL x){
	if(x<=2)return x==2;
	LL a;
	for(I i=1;i<=10;++i){
		a=Rand()%(x-2)+2;
		if(pow(a,x-1,x)!=1)
			return 0;
	}return 1;
}

果不其然,WA 成狗了,33分。(LOJ#147 素数判定)

为什么?因为可以构造 卡迈克尔 数来卡掉这个玩意,能通过所有的检验但是它是一个和数

所以我们要结合另外的方法。

2.大神出场——二次探测

此处应该有掌声

先来介绍一个定理,如果 ppp 为奇素数,那么 对于 x2≡1(modp)x^2\equiv1\pmod px21(modp) 的方程,有两个平凡平方根:x=1x=1x=1 或者 x=p−1x=p-1x=p1

(为什么不为偶素数,即为2呢?因为 xxx 只有一个解,即 111 。)

移项,x2−1≡0(modp)x^2-1\equiv0\pmod px210(modp)

所以 (x+1)(x−1)≡0(modp)(x+1)(x-1)\equiv0\pmod p(x+1)(x1)0(modp)。所以 x=1x=1x=1 或者 x=p−1x=p-1x=p1

3.Miller_Rabin 算法实现

我们不是在 (1) 中处理出来 an−1a^{n-1}an1 了吗?

那么我们就继续处理它:把 n−1n-1n1 分解成 u×2tu\times 2^tu×2t 的形式(这个比较简单哈)。显然 n−1n-1n1 为偶数。

我们回想一下上面的二次探测有什么用呢?奇素数只有两个平凡平方根。

而有非平凡平方根,这说明了什么?

再具体代入一对解,x2≡y2≡1(modp)x^2\equiv y^2\equiv1\pmod px2y21(modp)(x+y)(x−y)≡0(modp)(x+y)(x-y)\equiv0\pmod p(x+y)(xy)0(modp)

显然, x−y≤px-y\le pxyp 。所以如果不是非平凡平方根的话,这个 ppp 必然会被分解成另外的形式!

那么 ppp 就不是一个素数了。

所以,如果 x2≡1(modn)x^2\equiv 1\pmod nx21(modn)x≠1x\ne 1x=1 或者 n−1n-1n1 的话 xxx 就是一个非平凡平方根。ppp 是过不了检验的。

实现的时候,先算出 aua^uau 的值 vvv ;然后不断平方 ttt 次。不断平方,aua^uau 变成 a2ua^{2u}a2u 一直变成 a2tua^{2^tu}a2tuan−1a^{n-1}an1

在不断平方的过程中,先判断 vvvppp 的关系,然后再平方。

bool pd(LL n){
	if(n<3||n%2==0)return n==2;
	LL u=n-1,t=0;
	while(u%2==0)u>>=1,++t;
	for(I i=1,j;i<=10;++i){
		LL a=Rand()%(n-2)+2,v=pow(a,u,n);
		if(v==1)continue;
		for(j=1;j<=t;++j){
			if(v==n-1)break;
			v=mul(v,v,n);
		}
		if(j>t)return 0;
	}return 1;
}

4.应用?

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值