boshi大佬帮助了litble,使愚蠢的litble(可能?)学会了这种神奇的算法。
orz boshi。

例题:poj1811

Miller Rabin

又称米勒挝饼, 一种神奇的快速判定一个数是否是素数的方法。如果该方法判定出一个数是合数,那么该数一定是合数。如果判定出是素数,那该数仍有极小的概率是合数。

费马小定理:若 p p p是一个质数,则有 a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \pmod{p} ap−1≡1(modp)
二次探测原理:若 p p p是一个质数,有 a 2 ≡ 1 ( m o d p ) a^2 \equiv 1 \pmod{p} a2≡1(modp),那么 a a a只能是 1 1 1或者 p − 1 p-1 p−1。

p p p不是质数情况下,同时满足这两个条件的值大概有 1 4 \frac{1}{4} 41​,所以多取几个随机值检验,出错的概率就很低了。

算法过程:

typedef long long LL;
LL qmul(LL x,LL y,LL p) {//防止取模爆炸的快速乘x%=p,y%=p;LL re=0;for(LL i=y;i;i>>=1,x=(x+x)%p) if(i&1) re=(re+x)%p;return re;
}
LL qpow(LL x,LL y,LL p) {//快速幂x%=p;LL re=1;for(LL i=y;i;i>>=1,x=qmul(x,x,p)) if(i&1) re=qmul(re,x,p);return re;
}
int Miller_Rabin(LL n) {if(n==2||n==3||n==5||n==7||n==11||n==13) return 1;if(n==1||n%2==0||n%3==0||n%5==0||n%7==0||n%11==0||n%13==0) return 0;//先用几个小质因子测试LL t=n-1,k=0;while(!(t&1)) t>>=1,++k;//n-1=t*2^kfor(RI kas=1;kas<=10;++kas) {LL x=qpow(rand()%(n-2)+2,t,n),y;for(LL i=1;i<=k;++i) {y=x,x=qmul(x,x,n);//每次平方if(x==1&&y!=1&&y!=n-1) return 0;//用二次探测原理检验}if(x!=1) return 0;//用费马小定理检验}return 1;
}

Pollard’s Rho

又称泼辣的肉, 一种神奇地将极大数进行质因数分解的算法。

我们知道,朴素的质因数分解是 O ( n ) O(\sqrt{n}) O(n ​)的,这样如果 n n n出到 1 0 18 10^{18} 1018就令人束手无策了。

于是我们希望利用随机化,更快地寻找所有质因数。

说道随机化,我们脑海里可能会有一个最简单最暴力的思路:每次随机一个数,判断该数是不是 n n n的质因子。

这样随机到的概率很小,但是根据生日悖论, g c d ( a − b , n ) gcd(a-b,n) gcd(a−b,n)是 n n n的质因子的概率就大得多了。

我们利用一种比较高效的伪随机数来实现这个随机的 a a a和 b b b,一般这个伪随机函数为 f ( x ) = x 2 + c f(x)=x^2+c f(x)=x2+c, c c c是一个根据你的兴趣决定的数,然后每次生成下一个随机数,不断计算。如果 d = g c d ( a − b , n ) d=gcd(a-b,n) d=gcd(a−b,n)不等于 1 1 1或 n n n,说明找到了一个 n n n的约数。如果这个约数是质因数,那么皆大欢喜,否则递归处理 n d \frac{n}{d} dn​和 d d d即可。

判断是否是质因数就用米勒挝饼好了,肉夹馍? 整个算法已经比较完整,唯一的问题是该伪随机数可能陷入死循环。伪随机数因为每次下一步都是固定的,所以构成基环内向树。

判环的思想也比较简单,设想一只兔子和一只乌龟在漫漫长路上前进,兔子如果追上了乌龟,就说明存在一个环。那么每次兔子走几步,乌龟走一步即可。

不过呢,实际检测,这个“兔子走几步”的“几”在每次移动乌龟后倍增,效率比较高。
嗯,代码如下:

int js;LL pri[100];
LL gcd(LL a,LL b) {return b?gcd(b,a%b):a;}
LL Pollard_Rho(LL n) {LL x=rand()%n,y=x,c=rand()%n,QvQ=2;int i=1;while(1) {++i,x=(qmul(x,x,n)+c)%n;//生成伪随机数if(y==x) return 1;//兔子追上了乌龟LL d=gcd((y-x+n)%n,n);if(d>1) return d;//注意,有可能在某个c意义下,d一直都是nif(i==QvQ) y=x,QvQ<<=1;//移动乌龟}
}
void getpri(LL n) {if(n==1) return;if(Miller_Rabin(n)) {pri[++js]=n;return;}//如果是质因子LL p=n;while(p==n) p=Pollard_Rho(n);getpri(n/p),getpri(p);//递归处理
}

Magic的Miller Rabin素数测定和Pollard's Rho质因子分解法相关推荐

  1. 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 ...

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

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

  3. 素数判定算法 MILLER RABIN

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

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

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

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

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

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

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

  7. 分解质因数-Pollard‘s Rho

    Pollard's Rho 质数的判定 试除法 Fermat 素性测试 Miller-Rabin 素性测试 查找因数 还是试除法 Pollard's Rho 分解质因数   随便写写,不喜勿喷. 质数 ...

  8. Java实现算法导论中Pollard的rho启发式方法

    Pollard的rho启发式方法用于启发式求解大整数n分解因子,具体要结合导论中来理解,参考代码如下: package cn.ansj;import java.math.BigInteger; imp ...

  9. C++实现的大整数分解Pollard's rho算法程序

    代码来自GeeksforGeeks的Pollard's Rho Algorithm for Prime Factorization. C++语言程序代码如下: /* C++ program to fi ...

最新文章

  1. 「任务总览」优化更新,团队协作愈加高效敏捷
  2. HDU-2089-不要62
  3. opencv python 图像去噪
  4. LiveVideoStack线上分享第五季(五):用FFmpeg搭建基于CNN的视频分析方案
  5. 操作excel的一些方法
  6. Kylin下构建Cube第一步出错:shell-init: error retrieving current directory
  7. 海康录像机怪事:只有第一个通道能取到RTSP流,其他通道都取不到
  8. mac上 网易mumu模拟器在打开代理后无法使用键盘 解决办法
  9. python通过周数得到日期_python中根据时间获取周数,通过周数获取时间
  10. cad断点快捷键_CAD打断(BREAK)命令的使用技巧
  11. 使用GUID分区表(GPT)的笔记本硬盘做移动硬盘,windowsXP系统不识别的问题
  12. 按月显示的万年历(含农历)网页代码
  13. SwiftUI mutating 是什么怎么用 (2020年教程)
  14. 信息熵、自信息与互信息
  15. 物理引擎chipmunk
  16. JS:指定FPS帧频,requestAnimationFrame播放动画
  17. markdown使用方法大全
  18. coco128训练YOLOv5
  19. VCNL4040传感器
  20. 站在巨人肩膀上创新?怕是站在巨人肩膀上“打包”吧

热门文章

  1. 2020.10.5-10.12 人工智能行业每周技术精华文章汇总
  2. LeetCode 134 加油站 全面详细题解【持续更新所有解法】
  3. 电脑频繁出现0x0000000A蓝屏错误怎么重装系统?
  4. 计算机程序著作权保护,计算机程序著作权保护问题研究
  5. 区块链技术将如何演进?你该如何抓住机会?
  6. word邮件合并功能的用法
  7. 2017江西计算机辅助设计,SolidWorks 2017 三维机械计算机辅助设计制图工具
  8. 温故OpenStack中的测试(by Joshua)
  9. Component组件基本概念
  10. PMP 考点 第九章 项目资源管理