首页 > 其他分享 >数论——Fermat素性检验、Miller-Rabin素性检验

数论——Fermat素性检验、Miller-Rabin素性检验

时间:2024-01-24 19:34:17浏览次数:24  
标签:素性 pmod Miller ll 检验 质数 equiv

数论——Fermat素性检验、Miller-Rabin素性检验

试除法与素性测试

试除法:所有的试除法,无论是 \(\mathcal O(n)\) 的还是 \(\mathcal O(\sqrt n)\) 的,其本质都相同:

  • 即找 \(n\) 可能存在的因子 \(k\),判断 \(k \mid n\)。

素性测试:旨在不用分解因数的方式,判断一个数是否为质数;素性测试分为两种:

  • 确定性测试:(绝对正确的)确定一个数是否为素数。
  • 概率性测试:具有较高正确率,但是不完全保证准确。

Fermat 素性检验

我们知道有费马小定理:\(a^{p-1} \equiv 1 \pmod p\)(\(p \in \mathbb P,a \perp p\))。

据此,我们得出费马小定理的逆否命题:

若有 \(a \perp p\) 且 \(a^{p - 1} \not\equiv 1 \pmod p\),则 \(p\) 一定不是质数。

但是逆否命题不意味着逆命题成立,因此,满足上一命题的,不一定完全是质数。

此类满足费马小定理逆否命题,但不是质数的数,称为 Carmichael 数。

在大部分情况下,我们使用(并不正确的)费马小定理逆定理,判定一个质数。

这个过程称为 Fermat 素性检验。

二次探测定理

如果 \(p\) 是奇质数(只有质数 \(2\) 不是奇质数),则:

\(x^2 \equiv 1 \pmod p\) 的解为 \(x \equiv 1 \pmod p\) 或 \(x \equiv p-1 \pmod p\)。

证明:

\[\begin{array}{rcl} x^2 &\equiv& 1 \pmod p\\ x^2-1 &\equiv& 0 \pmod p\\ (x+1)(x-1) &\equiv& 0 \pmod p\\ \end{array} \]

因此 \(x \equiv 1 \pmod p\) 或 \(x \equiv p-1 \pmod p\)。

Miller-Rabin 素性检验

Miller–Rabin 素性测试是根据费马测试和二次探测定理优化得到的。

其准确性较高,目前已知没有通过 Miller–Rabin 素性测试而非质数的。

因此我们可以(在 OI 中)放心使用。

其复杂度为 \(\mathcal O(k \log^3 n)\),表示对 \(n\) 进行 \(k\) 次测试。

思想:

将 \(a^{p-1} \equiv 1 \pmod p\) 中的指数 \(p−1\) 分解为 \(p−1=u \times 2^t\)。

对随机出来的 \(a\) 先求出 \(v = a^{u} \bmod n\),之后对这个值执行最多 \(t\) 次平方操作。

若发现非平凡平方根时即可判断出其不是素数,否则再使用 Fermat 素性测试判断。

代码:

using ll = long long;

ll qpow(ll a, ll b, ll p) {
	ll r = 1;
	for (; b; b >>= 1) {
		if (b & 1) r = r * a % p;
		a = a * a % p;
	} return r;
}

bool Miller_Rabbin(ll a, ll n) {
	ll s = n - 1, r = 0;
	while ((s & 1) == 0) s >>= 1, ++r;
	ll k = qpow(a, s, n);
	if (k == 1) return true;
	for (int i = 0; i < r; ++i) {
		if (k == n - 1) return true;
		k = k * k % n;
	} return false;
}

bool isPrime(ll n) {
	if (n <= 1) return false;
	ll times = 7;
	ll primes[100] = {2, 3, 5, 7, 11, 233, 331};
	for (int i = 0; i < times; ++i) {
		if (n == primes[i]) return true;
		if (!Miller_Rabbin(primes[i], n)) return false;
	} return true;
}

标签:素性,pmod,Miller,ll,检验,质数,equiv
From: https://www.cnblogs.com/RainPPR/p/17985657/fermat-miller-rabin

相关文章

  • i-MES生产制造管理系统-生产过程检验SPC(一)
    说起质量管理,那一定少不了 SPC,SPC中文名叫统计过程控制,对生产过程中记录的数据进行分析,及时了解不良情况出现的几率,并采取必要的措施达到消除影响的目的,这其中有几个关键术语,比如UCL等.  为了方便检验人员操作,SPC模块运行在Android平板电脑上面,检验人员在生产过程中进......
  • Miller Rabin素数判定
    MillerRabin素数判定llqmul(lla,llb,llmod)//快速乘{llc=(ld)a/mod*b;llres=(ull)a*b-(ull)c*mod;return(res+mod)%mod;}llqpow(lla,lln,llmod)//快速幂{llres=1;while(n){if(n&1)res=qmul(res,a,mod);......
  • python 安装Anaconda3详细步骤 Anaconda的【下载】——【安装】——【配置path环境变
    python安装Anaconda3详细步骤Anaconda的【下载】——【安装】——【配置path环境变量】——【检验】——【修改清华镜像】目录:1.下载2.安装3.配置4.检验5.镜像(修改Anaconda下载通道)前言:装anaconda,就不需要单独装python,anaconda中自带python1.下载(1)官网下载:Anaconda|I......
  • PostgreSQL 数据库安全之检验数据块的损坏- data_checksums 参数设置
    默认情况下,数据页不受校验和保护,但可以选择为集群启用这一功能。启用后,每个数据页都包含一个校验和,该校验和在写入该页时更新,并在每次读取该页时进行验证。只有数据页受校验和保护;内部数据结构和临时文件不是。校验和通常在使用initdb初始化集群时启用。还可以在以后的脱......
  • 医学检验科LIS系统,LIS检验系统源码
    LIS系统功能模块字典模块:系统参数、标本管理、试管管理、平台设备管理、送检类型管理、检验项目管理、检查组合管理、项目转换管理。报告模块:试管条码打印、检验报告管理、报告登记、报告接收、报告打印、历史数据查询、数据存根、报告审核。质控模块:质控品管理、质控规则管理......
  • 贝叶斯球快速检验条件独立
    贝叶斯球定义几个术语,描述贝叶斯球在一个结点上的动作:通过(passthrough):从当前结点的父结点方向过来的球,可以访问当前结点的任意子结点(父->子)。从当前节点的子结点方向过来的球,可以访问当前结点的任意父结点。(子->父)反弹(bounceback):从当前结点的父结点方向过来的球,可以访问当前结......
  • Windows环境检验NodeJs安装是否成功
    Windows环境检验NodeJs安装是否成功检验方法1、win+R打开运行窗口,在此窗口输入cmd命令编辑2、进入命令提示符窗口,分别输入以下命令,显示版本号,则安装成功node-v:显示安装的nodejs版本npm-v:显示安装的npm版本编辑如上图说明安装成功我本机的环境版本低一点因为是安装鸿蒙IDE自动安......
  • 安全检验---过滤器与拦截器
    过滤器简介什么是过滤器(Filter)Filter表示过滤器,是JavaWeb三大组件(Servlet,Filter,Listener)之一过滤器可以把对资源的请求拦截下来,从而实现设置好的特殊功能使用了过滤器之后,想要访问Web服务器上的资源,需要先经过过滤器,过滤器处理完毕之后,才可以访问对应的资源。过滤器一......
  • 序贯概率比较检验
    序贯概率比较检验sequentialprobabilityratiotest(SPRT)定义:是对于序贯抽样方案的检验方法序贯抽样方案是指在抽样时,不事先规定总的抽样个数(观测或实验次数),而是先抽少量样本,根据其结果,再决定停止抽样或继续抽样、抽多少,这样下去,直至决定停止抽样为止。反之,事先确定抽样个......
  • 临床检验检查信息系统(LIS系统源码)C/S结构的应用模式
     LIS系统实现了实验室人力资源管理、标本管理、日常事务管理、网络管理、检验数据管理(采集、传输、处理、输出、发布)、报表管理过程的自动化,使实验室的操作人员和管理者从繁杂的手工劳作中解放出来,提高了检验人员的工作效率和效益,降低了劳动成本和差错发生率。LIS采用C/S(Clien......