Miller_Rabin 简要版

Miller_Rabin 简要版

简介:通俗易懂版本。

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

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

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

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.大神出场——二次探测

此处应该有掌声

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

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

移项, x 2 − 1 ≡ 0 ( m o d p ) x^2-1\equiv0\pmod p x210(modp)

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

3.Miller_Rabin 算法实现

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

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

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

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

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

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

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

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

实现的时候,先算出 a u a^u au 的值 v v v ;然后不断平方 t t t 次。不断平方, a u a^u au 变成 a 2 u a^{2u} a2u 一直变成 a 2 t u a^{2^tu} a2tu a n − 1 a^{n-1} an1

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

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.应用?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值