今天学习一下Miller-Rabbin  素性测试 和 Pollard_rho整数分解。

两者都是概率算法

Miller_Rabbin素性测试是对简单伪素数pseudoprime测试的改进。

(pseudoprime测试, POJ 3641 pseudoprime numbers

简单伪素数pseudoprime的原理是费马小定理的逆命题。

费马小定理:p是素数,an-1≡1 mod p。

逆命题几乎成立。 满足逆命题叫做以a为基的伪素数。

几乎是因为被证明存在无数多个合数满足逆命题,叫做Carmichael数。Carmichael数的密度极小,1e8范围内只有255个。

(UVa 10006 Carmichael Number

改进的测试方法的原理是欧拉给出的定理。

x2≡1 mod pe,p是奇素数,这个方程只有两个解 x = -1和 x = 1。(还可以用了判断二次剩余

证明可以看算法导论定理31.34

这个定理的逆否命题对2也成立,也就是说模n如果有x2≡1 mod n,x ≠ 1且 x ≠ -1,那么n是合数。

利用这点可以构造一个证明n是合数的过程witness。

bool witness(ll a,ll n)//a是1~n-1范围内随机选取的基。
{
int t = ;
ll u = n-;
while((u&^)) { u>>=; t++; } //计算n-1 = 2^t*d,用于反复平方
ll x = powMod(a,u,n), y;
while(t--){
y = mulMod(x,x,n);
if(y == && x != && x != n-) return true; //如果y = x^2 = 1 mod n 存在 x != 1且 x != n-1说明是合数
x = y;
}
return x != ;
}

对于Carmichael数这种测试方法也有效,证明这里略过。

出错概率大概是1/2^k,k是测试次数。

int64的乘法可能会溢出,需要自行编写函数mul_mod()完成计算。

Pollard_rho整数分解

Pollard_rho是用f(x) = x^2 + c mod n 产生伪随机序列。d = gcd(y-x,n),如果 d > 1,那么 y - x是 n的一个因子q的k倍,然后再做分解就好。

循环大概会在期望Θ(sqrt(p))的复杂度找到n的一个因子p。如果不存在的话会比较慢,所以先用MillerRabbin判断一下是不是素数n。

p≤sqrt(n), 所以有Θ(n^(1/4))。

证明没看懂。。。(似乎是k q有 sqrt(n)个, 而 y - x 的组合命中 一个 k q 期望 也是要 sqrt(n)次

序列是伪随机,c设置的不好,可能找不到因子就循环了,可以用flody判圈法。

(一般使用的是改进过的flody判圈法, y的步进是倍增的。

具体代码见POJ GCD & LCM inverse

参考资料:

《算法导论第31章 数论算法》

https://en.wikipedia.org/wiki/Pollard%27s_rho_algorithm

Pollard_rho

http://wenku.baidu.com/link?url=oaiwXWqJcPfeSfWtT7et-A3g9sFDSI3OjvmToU23rBJXwlToKaikoSrCnwRoozX24YmxDsVdwubMdu0xy3bMqI-ijcReKgMtdIlR6pEowd_

Miller-Rabbin 素性测试 和 Pollard_rho整数分解的更多相关文章

  1. Light OJ 1341 Aladdin and the Flying Carpet Pollard_rho整数分解+DFS

    进入a b 多少努力p, q 使p*q == a && p < q && p >= b 直接大整数分解 然后dfs所有可能的解决方案劫持 #include ...

  2. Miller Rabbin素数测试

    步骤 ①先写快速幂取模函数 ②MR算法开始 (1)传入两个参数一个是底数一个是n也就是幂数,如果n是一个合数那么可以判定,这个数一定不是素数 (2)然后开始寻找一个奇数的n去计算,如果最后满足a^d% ...

  3. Miller-Rabin 素性测试 与 Pollard Rho 大整数分解

    \(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要 ...

  4. POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  5. HDU1164_Eddy&#39;s research I【Miller Rabin素数测试】【Pollar Rho整数分解】

    Eddy's research I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  6. POJ2429_GCD &amp; LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】

    GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...

  7. POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】

    Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...

  8. 关于Miller-Rabin与Pollard-Rho算法的理解(素性测试与质因数分解)

    前置 费马小定理(即若P为质数,则\(A^P\equiv A \pmod{P}\)). 欧几里得算法(GCD). 快速幂,龟速乘. 素性测试 引入 素性测试是OI中一个十分重要的事,在数学毒瘤题中有着 ...

  9. POJ 1811 Prime Test 素性测试 分解素因子

    题意: 给你一个数n(n <= 2^54),判断n是不是素数,如果是输出Prime,否则输出n最小的素因子 解题思路: 自然数素性测试可以看看Matrix67的  素数与素性测试 素因子分解利用 ...

随机推荐

  1. SCUT - 337 - 岩殿居蟹 - 线段树 - 树状数组

    https://scut.online/p/337 这个东西是个阶梯状的.那么可以考虑存两棵树,一棵树是阶梯的,另一棵树的平的,随便一减就是需要的阶梯. 优化之后貌似速度比树状数组还惊人. #incl ...

  2. Educational Codeforces Round 64 (Rated for Div. 2)D(并查集,图)

    #include<bits/stdc++.h>using namespace std;int f[2][200007],s[2][200007];//并查集,相邻点int find_(in ...

  3. Codeforces Round #558 (Div. 2)C(计算几何,排列组合,模拟)

    #include<bits/stdc++.h>using namespace std;typedef struct{ double k,b;}node;node k[1000007];bo ...

  4. 洛谷P1065 作业调度方案

    P1065 作业调度方案 题目描述 我们现在要利用m台机器加工n个工件,每个工件都有m道工序,每道工序都在不同的指定的机器上完成.每个工件的每道工序都有指定的加工时间. 每个工件的每个工序称为一个操作 ...

  5. 洛谷P1312 Mayan游戏

    P1312 Mayan游戏 题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他 ...

  6. JMeter - REST API测试 - 完整的数据驱动方法(翻译)

    https://github.com/vinsguru/jmeter-rest-data-drivern/tree/master 在本文中,我想向您展示一种用于REST API测试的数据驱动方法.如果 ...

  7. shiro 重定向 后 带有 sessionId 的 解决 办法

    http://blog.csdn.net/aofavx/article/details/51701012

  8. DateTime.MinValue和MaxValue引发的异常

    转载: http://www.cnblogs.com/lori/p/3186807.html 问题描述: SqlDateTime 溢出.必须介于 1/1/1753 12:00:00 AM 和 12/3 ...

  9. 如何直接修改cf,of等标志位的值?

    如何直接修改 cf,of 等 标志寄存器位的值? 我记得在哪个教程里见过,但是不太记得了… 貌似是在yjx驱动教程里面… 我想弄这个的原因是想验证 网上查到的 各种跳转语句(ja,jl,jg等) 需要 ...

  10. Codeforces Round #375 (Div. 2) Polycarp at the Radio 优先队列模拟题 + 贪心

    http://codeforces.com/contest/723/problem/C 题目是给出一个序列 a[i]表示第i个歌曲是第a[i]个人演唱,现在选出前m个人,记b[j]表示第j个人演唱歌曲 ...