【学习笔记】Miller-Rabin(米勒-拉宾)素性测试,附常用表

@TOC

素性测试是检验一个给定的整数是否为素数的测试。

最简单的就是用 n\sqrt{n}n 以内的数去试除。这是确定性的算法,即能准确知道 nnn 是否为质数。

但今天学习的是一种随机算法。

Fermat 小定理

如果 ppp 是一个质数,且 a%p≠0a\%p≠0a%p=0,则有 ap−1≡1(modp)a^{p-1}\equiv 1\pmod pap11(modp)

利用 Fermat定理 可以得到一个测试合数的有力算法:对 n>1n>1n>1,选择 a>1a>1a>1, 计算 an−1modna^{n-1} \mod nan1modn

  • 若结果 ≠1\neq 1=1,则 nnn 是合数。

  • 若结果 =1=1=1, 则 nnn 可能是素数,并被称为一个以 aaa 为基的弱可能素数 (a-PRP) 。

    nnn 是合数,则又被称为一个以 aaa 为基的伪素数。

这个算法的成功率是相当高的。在 <25000000000<25000000000<25000000000109198740510919874051091987405 个素数中,一共只有 218532185321853 个以 222 为基的伪素数。

但不幸的是,存在无穷多个被称为 Carmichael数(卡迈克尔数)的整数,对于任意与其互素的整数 aaa 算法的计算结果都是 111

最小的五个 Carmichael数561、1105、1729、2465、2801561、1105、1729、2465、28015611105172924652801

miller_rabin(米勒-拉宾)素性测试

定理 :如果 ppp 是个 >2>2>2 的质数,则方程 x2≡1(modp)x^2\equiv 1\pmod px21(modp) 的解只有 x=±1x=±1x=±1

证明:

x2≡1(modp)⇒x2−1≡0(modp)⇒(x+1)(x−1)≡0(modp)x^2\equiv 1\pmod p\Rightarrow x^2-1\equiv 0\pmod p\Rightarrow (x+1)(x-1)\equiv 0\pmod px21(modp)x210(modp)(x+1)(x1)0(modp)

p∣(x+1)∧p∣(x−1)p|(x+1)\wedge p|(x-1)p(x+1)p(x1)。则一定存在两个数 j,kj,kj,k,使得 x+1=jp,x−1=kpx+1=jp,x-1=kpx+1=jp,x1=kp,两式相减 2=(k−j)p2=(k-j)p2=(kj)p,不可能。

所以只可能是 p∣(x+1)∨p∣(x−1)p|(x+1)\vee p|(x-1)p(x+1)p(x1)

p∣(x+1)p|(x+1)p(x+1),则 x+1=kp⇒x≡−1(modp)x+1=kp\Rightarrow x\equiv -1\pmod px+1=kpx1(modp)

p∣(x−1)p|(x-1)p(x1),则 x−1=kp⇒x≡1(modp)x-1=kp\Rightarrow x\equiv 1\pmod px1=kpx1(modp)

以上定理的逆否命题:当方程 x2≡1(modp)x^2\equiv 1\pmod px21(modp) 有一个解 x≠−1∧x≠1x\neq-1\wedge x\neq 1x=1x=1,则 ppp 一定不是质数。

miller_rabin 是一个质数判断算法,采用随机算法能够在很短的时间里判断一个数是否是质数.

如何将卡迈克尔数甄别出来,这里要用到 二次探测方法

算法流程:

  • ppp 是要判断的数,222 特判后,ppp 如果是质数必须是奇数

  • p−1p-1p1 分解为 2r∗k2^r*k2rk,则有 ap−1=(ak)2ra^{p-1}=(a^k)^{2^r}ap1=(ak)2r

  • 可以先求出 aka^kak,然后将其不断平方,并取模 ppp

  • 对于任意的 0<a<p0<a<p0<a<p,有 ak≡1(modp)a^k\equiv 1\pmod pak1(modp),或者 a2s∗k≡−1(modp),0≤s<ra^{2^s*k}\equiv-1\pmod p,0\le s<ra2sk1(modp),0s<r

    只要有一个等式成立,那么后面不断平方结果也是 111,在代码实现时就会立即跳出。

    如果一个都没有成立则说明一定不是个质数。

但是当 ppp 为合数的时候,也可能会骗过检测,这就是“伪素数”。

如果挑选多个不同的 aaa 来检测,那么就会降低骗过的概率。

这也就是 miller_rabin 要多次操作的原因。

容错率是 14c\frac{1}{4}^c41c,取决于操作次数 ccc

在竞赛中,用固定的几个数就够了,附表。

n≤n≤naaa
20472
13736532,3
908019131,73
253260012,3,5
47591231412,7,61
11220046696332,3,13,1662803
21523028987472,5,7,11
34747496603832,5,7,11,13
3415500717283212,3,5,7,11,13,17
38251230565464130512,3,5,7,11,13,17,19

HDU2138

#include <cstdio>
using namespace std;
#define int long long
int test[5] = { 2, 3, 61 };int qkpow( int x, int y, int mod ) {int ans = 1;while( y ) {if( y & 1 ) ans = ans * x % mod;x = x * x % mod;y >>= 1;}return ans;
}bool dfs( int n, int a, int d ) {if( n == a ) return 1;if( ! ( n & 1 ) ) return 0;while( ! ( d & 1 ) ) d >>= 1;int x = qkpow( a, d, n );while( d ^ ( n - 1 ) and x ^ 1 and x ^ ( n - 1 ) ) {x = x * x % n;d <<= 1;}return x == n - 1 or ( d & 1 );
}bool isprime( int n ) {if( n == 2 ) return 1;for( int i = 0;i < 2;i ++ ) if( ! dfs( n, test[i], n - 1 ) ) return 0;return 1;
}signed main() {int T, n;while( ~ scanf( "%lld", &T ) ) {int sum = 0;for( int i = 1;i <= T;i ++ ) {scanf( "%lld", &n );if( isprime( n ) ) sum ++;}printf( "%lld\n", sum );}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hash Function

Hash Function 文章目录题意&#xff1a;题解&#xff1a;代码NTT代码FFT代码题意&#xff1a; 给定n个互不相同的数&#xff0c;找一个最小的模域&#xff0c;使得它们在这个模域下互不相同。n<5e5 题解&#xff1a; 考虑两个数a和b&#xff0c;a与b模m余数相同&#xf…

P5321 [BJOI2019]送别(LCT)

Foreword\text{Foreword}Foreword 肝了一下午一晚上的码农题… &#xff08;主要就是在 debug&#xff0c;LCT 太难 de 了…&#xff09; 感谢 M_sea&#xff0c;在调无可调认为LCT会不会不可做时&#xff0c;我看到了他的题解&#xff0c;几乎一样的思路&#xff0c;给了我继…

WebApi网关之Bumblebee和Ocelot性能对比

Bumblebee是基于.net core 2.1开发的WebApi网关组件&#xff0c;由于Bumblebee所追求的轻量化和性能&#xff0c;所以它并没有像Ocelot那样从asp.net core上进行扩展&#xff1b;而是构建在BeetleX.FastHttpApi之上&#xff0c;主要原因BeetleX.FastHttpApi有着更轻量化和高性能…

【无码专区11】异或2(结论 / 推式子 + 哈希hash + 大整数高精度 加减乘除重载考察)

本题已自我实现。但仍归于无码专区 problem 求 ∑i1n−1i⨁(n−i)\sum_{i1}^{n-1}i\bigoplus (n-i)∑i1n−1​i⨁(n−i)。 20%,n≤1e6;;50%,n≤1e9;;70%,n≤1e18;;100%,n≤1050020\%,n\le 1e6;;50\%,n\le 1e9;;70\%,n\le 1e18;;100\%,n\le 10^{500}20%,n≤1e6;;50%,n≤1e9;;7…

模板:常系数齐次线性递推(线性代数、多项式)

所谓常系数齐次线性递推&#xff0c;就是系数为常数的齐次线性递推。 &#xff08;逃&#xff09; 前言 sto Asta orz&#xff01; 又是一个名字高大上&#xff0c;实则小清新的算法&#xff01; 解析 考虑一个 k 次的线性递推&#xff1a; an∑i1kfian−ia_n\sum_{i1}^kf_…

2021牛客暑期多校训练营1

2021牛客暑期多校训练营1 题号题目知识点难度AAlice and Bob博弈论BBall Dropping计算几何签到CCut the TreeDDetermine the Photo Position签到EEscape along Water PipeFFind 3-friendly Integers真签到GGame of Swapping Numbers思维题&#xff0c;推导HHash FunctionFFT&a…

【无码专区12】子集和(背包dp)

此题已自我实现&#xff0c;但仍归于无码专区 本题在考场上就过了&#xff0c;所以难度并不高&#xff0c;发现性质即可。 problem 有 nnn 个正整数 a1,a2,...,ana_1,a_2,...,a_na1​,a2​,...,an​&#xff0c;他们的和为 mmm。你想对于其每一个子集 SSS&#xff0c;求出他…

Penguins

Penguins 题意&#xff1a; 有两个20*20的地图&#xff0c;有障碍物&#xff0c;两个地图各有一个小人&#xff0c;左侧地图的小人要从右下角走到右上角&#xff0c;右侧地图的小人要从左下角走到左上角&#xff0c;这两个小人是镜像移动的&#xff0c; 左侧小人右侧小人左移…

盲盒(随机概率 + 最大公约数)

盲盒problemsolutioncodeproblem 有 2n2n2n 个盲盒&#xff0c;每个盲盒有一个惊喜值 aia_iai​。 打开恰好 nnn 个盲盒&#xff0c;获得的惊喜值为这些盲盒惊喜值的最大公约数。 求能获得的最大惊喜值。 n≤1e5,ai≤1e12n\le 1e5,a_i\le 1e12n≤1e5,ai​≤1e12。 solution…

P5354 [Ynoi2017] 由乃的 OJ(树剖、位运算)

前言 当暴力思路与题解中的“暴力”不同时&#xff0c;继续想优化往往就渐行渐远了… 所以当没有头绪时&#xff0c;要勇于跳出原有的转化&#xff01; 这种位运算类型的优化似乎始终不在我的寄存器中…需要加强&#xff01; 解析 不难想到按位考虑的 O(nklog⁡2n)O(nk\log…

在 .NET Core 中运行 JavaScript

一.前言在 .NET Framework 时&#xff0c;我们可以通过V8.NET等组件来运行 JavaScript&#xff0c;不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core &#xff0c;我们如何在 .NET Core 中运行 JavaScript 呢&#xff0c;答案是使用 NodeServices。关于为何有在 .N…

I love exam HDU - 6968

I love exam HDU - 6968 题意&#xff1a; 有n个考试科目&#xff0c;现在有m套复习资料&#xff0c;每套复习资料需要花费wi天使用&#xff0c;用完提升ci的分数&#xff0c;现在还有t天复习时间&#xff0c;挂科数目不能超过p&#xff0c;问所有达到的最大分数 题解&#…

[CF1442 D] Sum(分治优化dp + 结论)

CF1442D Sumproblemsolutioncodeproblem luogu翻译 solution 部分分做法&#xff0c;预处理每组前缀和&#xff0c;暴力背包 dpdpdp 转移&#xff1a;dpi,jmax⁡{dpi−1,j−ksumi(k)∣0≤k≤l[i]}dp_{i,j}\max\Big\{dp_{i-1,j-k}sum_i(k)\ \Big|\ 0\le k\le l[i]\Big\}dpi,j…

P4338 [ZJOI2018]历史(树剖)(暴力)

前言 有点懊恼的一个题… 并没有其他那些ZJOI那么毒瘤&#xff0c;看出了关键结论&#xff0c;但最后维护卡在log条虚边的伞兵性质上了。 解析 第一眼&#xff1a;感觉根本不可做啊。 冷静一下&#xff0c;既然它还变态的带修&#xff0c;一定是可以转化成比较形式化的东西的…

Named Volume 在 MySQL 数据持久化上的基本应用

原文作者&#xff1a;春哥非常感谢春哥的投稿&#xff0c;同时也有一些感慨。初识春哥时&#xff0c;春哥是美术设计大咖。后不久&#xff0c;创业并致力于游戏开发&#xff0c;已有3年。从Unity3D到IOS&#xff08;Swift&#xff09;开发&#xff0c;从前端开发到后端以及容器…

Codeforces Round #723 (Div. 2)

Codeforces Round #723 (Div. 2) 题号题目知识点AMean Inequality签到BI Hate 1111思维CPotions (Easy Version)思维C1Potions (Hard Version)思维DKill Anton思维逆序对EOolimry and Suffix ArrayFMedian Queries CF1526A Mean Inequality 题意&#xff1a; 给你一个序列a&…

[AtCoder Regular Contest 060] E - Tak and Hotels

AT2039 [ARC060C] 高橋君とホテル / Tak and Hotelsproblemsolution - 分块code - 分块solution - 倍增code - 倍增problem luogu翻译 solution - 分块 肯定刚开始&#xff0c;我们很想暴力跳过去。事件复杂度取决于数据。 肯定不做把头拿给别人砍的事 这种跳法&#xff0…

模板:珂朵莉树

所谓珂朵莉树&#xff0c;就是珂朵莉发明的树。 &#xff08;逃 前言 在数据随机且带区间推平操作时适用&#xff0c;此时所有操作的期望颜色段数都是 O(log⁡n)O(\log n)O(logn) 的&#xff0c;可以使用暴力解决即可。 暴力即优雅。 解析 利用 set 维护颜色段&#xff1a;…

.Netcore 2.0 Ocelot Api网关教程(7)- 限流

本文介绍Ocelot中的限流&#xff0c;限流允许Api网关控制一段时间内特定api的总访问次数。限流的使用非常简单&#xff0c;只需要添加配置即可。1、添加限流修改 configuration.json 配置文件&#xff0c;对 UpstreamPathTemplate 为 /webapib/values 的配置修改如下&#xff1…

cf1526 C Potions

cf1526 C Potions 题意&#xff1a; n个药剂&#xff0c;每个药剂可以加/减能量&#xff0c;一开始能量为0&#xff0c;从左往右开始进行&#xff0c;全程能量不为负&#xff0c;问最多可以使用几个药剂 本题有简单(n<2000),困难模式(n≤200000) 题解&#xff1a; 简单题…