ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Miller Rabin

2021-05-02 14:34:03  阅读:177  来源: 互联网

标签:素性 int Miller 质数 long num 检测 Rabin


Miller Rabin

素性检测,用来判断一个数 \(num\) 是否为质数,但提前说明,这是一个充分不必要条件,也就是说, \(num\) 为质数,一定能通过素性检测,但通过素性检测的不一定都是质数。

笔者向来喜欢 define int long long ,所以不用担心本篇文章的数据。

先给出两个小定理

我们很显然的知道除了 \(2\) 是一个质数外,其他的偶数必然是合数,那么我们就能够知道其他的质数必然是奇数(我们对于 \(2\) 直接特判一下即可) , 我们就可以将该数 \(n\) 一定可以被表示为 \(n = d\times 2^r + 1\) ,也就是 \(n - 1 = d\times 2^r\)

则以下两个式子任意满足一个就说明其实可以通过素性测试的。

\[\begin{cases} a^d \equiv 1 (mod \ \ n) \\ \exists \ \ 0 \leq i < r , a^{d\times 2^{i}} \equiv -1 (mod \ \ n) \end{cases} \]

根据前人的经验:我们选择 \(a\) 为100以内的大概 \(10\) 个质数的时候,在 \(long \ \ long\) 范围内极极极极极小概率会出错。

满足其中一个就可以说明通过素性检测了,但不代表通过素性检测就是一个素数,哪怕是两个都满足,这两个均为充分不必要条件。
\(Code\)

bool miller_rabin(int n , int a) //检测 $a$ 这个数是否能让 $n$ 通过素性测试 
{
	int d = n - 1 , r = 0 ; 
	while(!(d % 2)) {d /= 2 ; r++ ; } // 取出 $d$ 和 $r$ 
	int x = quick(a , d , n) ; // a ^ d % n  
	for(qwq int i = 0 ; i <= r - 1 ; i++) 
	{
		if(x == n - 1) return true ; 
		x = x * x % n ; //这里应用快速乘 
	} 
	return false ; 
} 

另外一种小检测(更好写)

费马小定理,因为前面的两个小定理都是费马小定理的扩展形式,那同时是不是说明,我们可以直接通过费马小定理乱搞呢?这答案经过验证是可行的。

过程: 我们随机出来一个 \(a\) , 然后我们判断一下 \(a^{num - 1} \equiv 1(mod \ \ num )\) 是否成立,如果成立我们就认为通过测试了,如果不通过测试,那么就说明 \(num\) 一定不是质数。然后我们多来几次,我们就大概率认为其 \(num\) 为质数了。乱搞。!!!

  • \(quick\) 表示快速幂
bool query(int num){
    if(num == 2) return true ; 
    for(qwq int i  = 0 ; i  < base ; i++) 
    {
    	int x = rand() % (num - 2) + 2;
    	if(quick(x ,num , num) != x) return false ;
	}
	return true ; 
}

其他的素数判断方法就不必了

标签:素性,int,Miller,质数,long,num,检测,Rabin
来源: https://www.cnblogs.com/Zmonarch/p/14725670.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有