Miller_rabin 素数测试 学习笔记

这篇具有很好参考价值的文章主要介绍了Miller_rabin 素数测试 学习笔记。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Miller_rabin 素数测试

一种用来判断素数的算法。

前置芝士

威尔逊定理

\(p\) 为素数,\((p-1)! \equiv -1 (\mod p)\)

证明:
充分性证明:
如果 \(p\) 不是素数,那么他的因数必定存在于$ 1,2,3,\dots,p−1$ 之中,所以 \(\gcd((p-1)!,p)\),那么 \((p-1)! \not\equiv -1\)

必要性证明:

首先,我们知道 $$p-1\equiv -1 (\mod p)$$
那么我们只需要证明 \((p-2)! \equiv 1 (\mod p)\) 就可以了。

\(A=\{2,3\dots,p-2\}\)

对于 \(x\in A\),肯定存在一个 \(a \in A\),使得 \(ij\equiv 1(\mod p)\)

\(x=a\) 时,考虑二次剩余 \(x^2 \equiv 1(\mod p)\)

移项就可以得到 \((x+1)(x-1) \equiv 0 (\mod p)\)

那么只有两个解,\(x \equiv 1(\mod p)\),\(x \equiv p-1(\mod p)\),不成立。

所以其他情况都可以找到对应的 \(a\)

所以 \((p-2)!\equiv 1(\mod p)\)\((p-1)!\equiv p-1(\mod p)\)

费马小定理

\(p\in\mathbb{P},\gcd(a,p)=1\),则 \(a^{p-1}\equiv 1(\mod p)\)

证明:
因为 \(1,2,3,\dots ,p-1\)\(p\) 的完全剩余系,\(a,p\) 互质,

所以 \(a,2* a,3* a,4* a, \dots (p-1)* a\) 也是 \(\mod p\) 的完全剩余系。

所以 \(1 * 2 * 3 * \dots * (p-1) \equiv a * 2a * 3a * \dots * (p-1)a (\mod p)\)

就是 \((p-1)! \equiv (p-1)!a^{p-1} (\mod p)\)

由威尔逊定理得出,\((p-1)! \equiv -1(\mod p)\)

两边同时约去 \((p-1)!\)

所以可以得出 \(a^{p-1} \equiv 1(\mod p)\)

二次探测定理

\(p\) 为素数,\(x^2 \equiv 1(\mod p)\),那么\(x \equiv \pm 1(\mod p)\)

证明:
原式移项就可以得到 \((x+1)(x-1) \equiv 0 (\mod p)\)

那么只有两个解,\(x \equiv 1(\mod p)\),\(x \equiv p-1(\mod p)\)

但是这些又和 Miller_rabin 有什么关系呢?

我们把 \(p-1\) 分解为 \(2^k* t\),当 \(p\) 是素数时,则有 \(a^{2^k* t} \equiv 1(\mod p)\)

然后随机出一个数 \(a\),可以算出 \(a^t\),然后再自乘,就可以得到 \(a^{2^k* t}\) ,也就是 \(a^{p-1}\)

但如果我们在自乘之后 \(\equiv 1(\mod p)\),而之前 \(\not\equiv 1(\mod p)\),那么就违背了二次探测定理,则 \(p\) 不是素数。

else

\(Zwad\) 告诉我,若 \(p\) 通过一次测试,则p不是素数的概率仅为25%。

那么用 \(2,325,9375,28178,450775,9780504,1795265022\) 这几个数进行判断,在 $long long $ 范围内能保证正确。

Code

例题:SP288 PON - Prime or Not文章来源地址https://www.toymoban.com/news/detail-558517.html

#include<bits/stdc++.h>
#define int __int128
#define N_4 10004
#define N_5 100005
#define N_6 1000006
#define Mod 1000000007
#define FOR(i,j,k) for(long long i=j;i<=k;++i)
#define ROF(i,j,k) for(long long i=j;i>=k;--i)
using namespace std;
inline int read(){
	int x=0,f=1;
	char ch;
	ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-f;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+(ch-'0');
		ch=getchar();
	}
	return x*f;
}
int T,n,tot;
int gg[6]={0,2,7,61,63,97};
bool isprime[500005];
int prime[500005],an[500005];
inline void Euler(int n){
	isprime[1]=true;isprime[0]=true;
	for(register int i=2;i<=n;i++){
		if(!isprime[i])
			prime[++tot]=i;
		an[i]=tot;
		for(register int j=1;j<=tot&&prime[j]*i<=n;j++){
			isprime[i*prime[j]]=true;
			if(i%prime[j]==0)
				break;
		}
	}
	return;
}
inline int ksm(int a,int b,int mod){
	int ans=1,p=a,g=b;
	while(g){
		if(g&1) ans=(ans*p)%mod;
		p=(p*p)%mod;
		g>>=1; 
	}
	return ans;
}
int mul(int a,int b,int p){return (a*b-(int)((__float128)a/p*b)*p+p)%p;}
inline bool miller_rabin(int P){
    if(P==1) return 0;
    int t=P-1,k=0;
    while(!(t&1)) ++k,t>>=1;
    for(register int i=1;i<=5;++i){
        if(P==gg[i]) return true;
        int a=ksm(gg[i],t,P),nxt=a;
        for(register int j=1;j<=k;++j){
            nxt=mul(nxt,nxt,P);
            if(nxt==1&&a!=1&&a!=P-1) return false;
            a=nxt;
        }
        if(a!=1) return false;
    }
    return true;
}
signed main(){
	T=read();
	Euler(500000);
	while(T--){
		n=read();
		if(n<500000){
			if(isprime[n]) cout<<"NO"<<endl;
			else cout<<"YES"<<endl;
		}
		else{
			if(!miller_rabin(n)) cout<<"NO"<<endl;
			else cout<<"YES"<<endl;
		}
	}
    return 0;
}

到了这里,关于Miller_rabin 素数测试 学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【软件测试】学习笔记-精准测试

    软件测试行业从最开始的手工测试到自动化测试,从黑盒测试到白盒测试,测试理念和技术都发生了日新月异的变化。现如今,几乎所有的软件公司都有一套强大且复杂的自动化测试用例,用来夜以继日地保证产品的正确性和稳定性。 然而,你有没有想过,现在你所掌握的软

    2024年01月18日
    浏览(62)
  • 【软件测试学习笔记1】测试基础

    软件的定义: 控制计算机硬件工作的工具 软件的基本组成: 页面客户端,代码服务器,数据服务器 软件产生的过程: 需求产生(产品经理),需求文档,设计效果图(UI设计师),产品开发(研发人员),产品测试(测试人员),部署上线。 什么是软件测试: 使用技术手

    2024年01月18日
    浏览(54)
  • 【软件测试】学习笔记-统一测试数据平台

    这篇文章主要探讨全球大型电商企业中关于准备测试数据的最佳实践,从全球大型电商企业早期的测试数据准备实践谈起,分析这些测试数据准备方法在落地时遇到的问题,以及如何在实践中解决这些问题。其实,这种分析问题、解决问题的思路,也是推动着测试数据准备时

    2024年01月17日
    浏览(43)
  • 【软件测试】学习笔记-如何做好单元测试

    在正式开始今天的话题之前,我先给你分享一个工厂生产电视机的例子。 工厂首先会将各种电子元器件按照图纸组装在一起构成各个功能电路板,比如供电板、音视频解码板、射频接收板等,然后再将这些电路板组装起来构成一个完整的电视机。 如果一切顺利,接通电源后

    2024年02月03日
    浏览(64)
  • 学习Kali渗透测试笔记

    1. 软件测试 功能 性能:高并发环境下工作效率 安全:访问控制、系统数据的完整性、系统数据的机密性、可靠性 2. 安全测试与渗透测试 比较 安全测试 渗透测试 出发点 找出所有安全隐患 证明存在问题 视角 防护者 攻击者 覆盖性 所有可能的攻击界面更加完善 几个测试点

    2023年04月09日
    浏览(55)
  • 【软件测试】学习笔记-设计一个“好的”测试用例

    本篇文章重点探讨如何才能设计出一个“好的”测试用例。 什么才是“好的”测试用例,这个“好”又应该体现在哪些方面。这是一个看似简单实则难以回答的问题,即使深入思考后,也很难有非常标准的答案。 通常,你的第一反应很可能会是“发现了软件缺陷的测试用例

    2024年01月20日
    浏览(53)
  • 银行接口测试学习笔记:接口测试从分析到设计!

    01接口测试计划 制定:人员,工具/平台,脚本,时间,标准,输出接口测试计划文档 0 2银行接口文档解析 ①.接口名称:说明接口的作用,不用测试 ②.接口地址:http开头,和URL一样,不用测试 ③.请求方式:post/get/delete/put, 当一个接口有多个方式的时候是需要进行测试 ④.请求参数:字段名

    2024年02月02日
    浏览(46)
  • 软件测试/测试开发丨测试用例自动录入 学习笔记

    本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27139 省略人工同步的步骤,节省时间 兼容代码版本的自动化测试用例 用例的执行与调度统一化管理 收集用例 录入平台 通过命令行提供的收集用例功能,获取用例信息后,编写解析算法–比较

    2024年02月09日
    浏览(66)
  • 学习笔记——压力测试案例,监控平台

    测试案例 然后配置执行计划: 新建一个执行计划 配置请求路径 配置断言 配置响应持续时间断言 然后配置一些查看结果的统计报表或者图形 然后我们可以安装一个插件来可视化更多的指标: jmeter官网 jmeter插件官网 安装插件: 将下载的插件jar 放到目录 看到插件中心表示安

    2024年02月14日
    浏览(38)
  • 软件测试/测试开发丨Jenkins Pipeline 学习笔记

    本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/26711 内建节点 SSH节点 Java Web节点 1.1.1 SSH节点配置 远程工作目录 节点中必须有该目录,用于下载和运行jenkins 主机 节点的ip 1.1.2 Java Web节点配置 全局安全配置 代理:勾选Java代理协议 没有负载监

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包