Miller-Rabin

判断大素数的方法。

对于素数p,仅存在 x = 1 , p − 1 x=1,p-1 x=1,p−1,使得 x 2 ≡ 1 ( m o d p ) x^2\equiv 1\pmod p x2≡1(modp)。

任取前几小的素数(通常前10小的素数) q q q,进行二次探测:

  • 首先满足欧拉定理 q p − 1 ≡ 1 ( m o d p ) q^{p-1}\equiv 1\pmod p qp−1≡1(modp)
  • 求出 t , s t,s t,s满足 p − 1 = 2 s t p-1=2^st p−1=2st,且 t t t为奇数
  • 由 q t q^t qt逐步平方若 q 2 t ≡ 1 ( m o d p ) q^{2t}\equiv 1\pmod p q2t≡1(modp)且 q t q^t qt不是 1 , p − 1 1,p-1 1,p−1,则 p p p非奇数

通过二次探测的数很大概率上为素数。

Pollar-Pho

快速分解 n n n的所有质因子的方法:

每次找出一个 n n n的一个约数:

  • 任取 x ∈ [ 0 , n ) x\in [0,n) x∈[0,n),设变化为 f ( x ) = ( x 2 + c ) % n , c f(x)=(x^2+c)\% n,c f(x)=(x2+c)%n,c为 [ 0 , n ) [0,n) [0,n)中任意取定的常数(+c是因为怕 x 2 x^2 x2不停走自环),显然最后图形要么是个环,要么是个Pho形。
  • 若存在 n n n的某个约数 a ( a &gt; 1 ) a(a&gt;1) a(a>1),考虑在大环上存在小环使得 x i ≠ x j ( m o d n ) , i &lt; j x_i\neq x_j \pmod n,i&lt;j xi​̸​=xj​(modn),i<j,且 x i ≡ x j ( m o d a ) x_i\equiv x_j\pmod a xi​≡xj​(moda),则 a ∣ ( ∣ x i − x j ∣ ) a|(|x_i-x_j|) a∣(∣xi​−xj​∣),由因为 a ∣ n a|n a∣n,所以 a ∣ gcd ⁡ ( n , ∣ x i − x j ∣ ) a|\gcd(n,|x_i-x_j|) a∣gcd(n,∣xi​−xj​∣),故若 gcd ⁡ ( n , ∣ x i − x j ∣ ) &gt; 1 \gcd(n,|x_i-x_j|)&gt;1 gcd(n,∣xi​−xj​∣)>1则找到了一个约数,可以递归分解下去

考虑倍增枚举大环,每次在 2 k 2^k 2k步上找约数,复杂度分析分析是 O ( 4 n log ⁡ n ) O(^4\sqrt n\log n) O(4n ​logn)的


代码

传送门:bzoj3667

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;int tk;
ll n,mxn;const int p[12]={2,3,5,7,11,13,17,19,23,29};inline ll rnd(){return ((ll)rand()<<15)+rand();}inline ll mul(ll x,ll y,ll p)
{ll d=x*y-(ll)((long double)x/p*y)*p;return d<0?d+p:d;
}inline ll gcd(ll x,ll y){return (!y)?x:gcd(y,x%y);}inline ll fp(ll x,ll y,ll p)
{ll re=1;for(;y;y>>=1,x=mul(x,x,p))if(y&1) re=mul(re,x,p);return re;
}inline ll pollar_rho(ll c,ll n)
{ll g,x=rnd()%n,y=x,k=2;for(ll i=1;;++i){x=(mul(x,x,n)+c)%n;g=gcd(abs(x-y),n);if(g!=1) return g;if(i==k) y=x,k<<=1;}
}inline bool ck(int p,ll r,ll s,ll n)
{ll x=fp(p,r,n),y=x,i;for(i=0;i<s;++i,y=x){x=mul(x,x,n);if(x==1)return (y==1 || y==n-1);}return (x==1);
}inline bool miller_rabin(ll n)
{if(n<2) return false;int i;ll r=n-1,s=0;for(;!(r&1);r>>=1) s++;for(i=0;i<10;++i){if(n==p[i]) return true;if(!ck(p[i],r,s,n)) return false;}return true;
}void fd(ll n)
{if(n==1 || n<=mxn) return;if(miller_rabin(n)) {mxn=n;return;}ll g=pollar_rho(rnd()%n,n);for(;g==n;g=pollar_rho(rnd()%n,n));fd(g);fd(n/g);
} int main(){for(scanf("%d",&tk);tk;--tk){scanf("%lld",&n);mxn=0;fd(n);if(mxn==n) puts("Prime");else printf("%lld\n",mxn);}return 0;
}

【模板】Miller-Rabin Pollar-Pho相关推荐

  1. C++Miller Rabin算法的实现(附完整源码)

    C++Miller Rabin算法的实现算法 C++Miller Rabin算法的实现算法完整源码(定义,实现,main函数测试) C++Miller Rabin算法的实现算法完整源码(定义,实现,m ...

  2. 素数判定算法 MILLER RABIN

    入门级筛素数--试除法,复杂度O(n^2) bool rmprime( long long n ) {for(long long i = 2; i <= sqrt(n) ; i++) if(n% ...

  3. (Miller Rabin算法)判断一个数是否为素数

    (Miller Rabin算法)判断一个数是否为素数 1.约定 x%y为x取模y,即x除以y所得的余数,当x<y时,x%y=x,所有取模的运算对象都为整数. x^y表示x的y次方.乘方运算的优先 ...

  4. Magic的Miller Rabin素数测定和Pollard's Rho质因子分解法

    boshi大佬帮助了litble,使愚蠢的litble(可能?)学会了这种神奇的算法. orz boshi. 例题:poj1811 Miller Rabin 又称米勒挝饼, 一种神奇的快速判定一个数是 ...

  5. 素数判定质因数分解(数论)(Miller Rabin)(Pollard Rho)

    太玄学了! 我真的被概率的魅力折服了.此前我认为1便是1,0.9999999999-便是0.9999999999-. 但实际上它们有着千丝万缕的关系. 试想,如果一件事发生的概率是0.99999999 ...

  6. 与数论的厮守01:素数的测试——Miller Rabin

    看一个数是否为质数,我们通常会用那个O(√N)的算法来做,那个算法叫试除法.然而当这个数非常大的时候,这个高增长率的时间复杂度就不够这个数跑了. 为了解决这个问题,我们先来看看费马小定理:若n为素数, ...

  7. GCD and LCM Aizu - 0005(辗转相除)+GCD LCM Inverse POJ - 2429(java或【Miller Rabin素数測试】+【Pollar Rho整数分解】)

    题目:GCD and LCM Aizu - 0005 Write a program which computes the greatest common divisor (GCD) and the ...

  8. Miller Rabin质数判定模板(2)

    首先介绍一个相关的引理. 和 总是得到1,称这两个数为1的"平凡平方根".当p是素数且p>2时,不存在 的"非平凡平方根".为了证明该引理,我们假设x是 ...

  9. 梅森素数的判定(Lucas-Lehmer判定法 和 miller - Rabin 判定法)

    Mp = 2^p-1 且 p是素数,称为梅森数,若Mp是素数则称为梅森素数. Lucas-Lehmer判定法 判定一个数是否为梅森素数 效率足够高,如果题目特意为梅森素数设计,会卡复杂度,那么套用此方 ...

  10. 米勒罗宾素性测试(Miller–Rabin primality test)

    1 #include<iostream> //该程序为哥德巴赫猜(想输出所有的组合) 2 #include<cmath> 3 #include<cstdlib> 4 ...

最新文章

  1. mysql filter_MySQL 过滤复制+复制映射 配置方法
  2. C语言解释器的实现--存储结构(一)
  3. Cloudera Manager安装
  4. 体积最小桌面linux,Tiny Core Linux - 体积最小的精简 Linux 操作系统发行版之一 (仅10多MB)...
  5. Django源代码阅读分析-2:持久层结构分析
  6. java 魔数_Java 字节码结构解析
  7. python爬虫模块_python之爬虫_模块
  8. Chorme看视频卡,蓝屏
  9. [转载] Python中Numpy包的用法
  10. 【线上课程】ISO9001:2015质量管理体系标准解析|高清|16节课时
  11. 安装vs2010 sp1失败
  12. DSP28335 SPWM之Trip-Zone中断
  13. 非常有意思的Flowlet
  14. Android Studio 安装记录
  15. WinMerge 过滤器用法
  16. 《寒江独钓 Windows内核安全》——串口的过滤
  17. 利用公网IP访问部署在阿里云服务器的spring boot项目(一)
  18. IIc通信协议(一)
  19. Arduino连接nRF24L01无线收发模块
  20. TexturePacker的免费key获取方式

热门文章

  1. 数据库建模 — ER建模
  2. vmware 虚拟机ubuntu18挂在共享内存
  3. 语文前五册通假字整理
  4. 【GNN报告】香港科技大学李佳:图异常检测再思考—我们究竟需要怎样的图神经网络?
  5. 要怎样努力,才能成为很厉害的人?
  6. matlab ext2int,向大神们帮助,索引超出矩阵维度和出错 ext2int (line 165)
  7. Python“飞机大战”上下左右移动空格发射子弹
  8. leetcode 超级次方
  9. android studio svn清除,Android Studio SVN 无法提交删除
  10. html怎么建立css文件,CSS文件是什么?怎么创建它?