Miller-Rabbin 素性测试 和 Pollard_rho整数分解
今天学习一下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的步进是倍增的。
参考资料:
《算法导论第31章 数论算法》
https://en.wikipedia.org/wiki/Pollard%27s_rho_algorithm
Pollard_rho
Miller-Rabbin 素性测试 和 Pollard_rho整数分解的更多相关文章
- Light OJ 1341 Aladdin and the Flying Carpet Pollard_rho整数分解+DFS
进入a b 多少努力p, q 使p*q == a && p < q && p >= b 直接大整数分解 然后dfs所有可能的解决方案劫持 #include ...
- Miller Rabbin素数测试
步骤 ①先写快速幂取模函数 ②MR算法开始 (1)传入两个参数一个是底数一个是n也就是幂数,如果n是一个合数那么可以判定,这个数一定不是素数 (2)然后开始寻找一个奇数的n去计算,如果最后满足a^d% ...
- Miller-Rabin 素性测试 与 Pollard Rho 大整数分解
\(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要 ...
- POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- HDU1164_Eddy'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 ...
- POJ2429_GCD & LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...
- POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- 关于Miller-Rabin与Pollard-Rho算法的理解(素性测试与质因数分解)
前置 费马小定理(即若P为质数,则\(A^P\equiv A \pmod{P}\)). 欧几里得算法(GCD). 快速幂,龟速乘. 素性测试 引入 素性测试是OI中一个十分重要的事,在数学毒瘤题中有着 ...
- POJ 1811 Prime Test 素性测试 分解素因子
题意: 给你一个数n(n <= 2^54),判断n是不是素数,如果是输出Prime,否则输出n最小的素因子 解题思路: 自然数素性测试可以看看Matrix67的 素数与素性测试 素因子分解利用 ...
随机推荐
- 2018ICPC徐州区域赛网络赛B(逆序枚举或者正序深度搜索)
#include<bits/stdc++.h>using namespace std;int n,m,k,l;int x[1007],y[1007],z[1007];int dp[1007 ...
- 51nod1347(简单逻辑)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1347 题意:中文题诶- 思路:稍推理一下就可以发现字符串a是 ...
- hdu 5693 D Game
D Game HDU - 5693 众所周知,度度熊喜欢的字符只有两个:B 和D. 今天,它发明了一个游戏:D游戏. 度度熊的英文并不是很高明,所以这里的D,没什么高深的含义,只是代指等差数列[(等差 ...
- 初识Scrapy之再续火影情缘
前言Scrapy框架之初窥门径1 Scrapy简介2 Scrapy安装3 Scrapy基础31 创建项目32 Shell分析4 Scrapy程序编写41 Spiders程序测试42 Items编写43 ...
- 将图片至于jsp页面上(层)
<div style="position: relative"> <span style="position: relative; top: 1px; ...
- JMeter - REST API测试 - 完整的数据驱动方法(翻译)
https://github.com/vinsguru/jmeter-rest-data-drivern/tree/master 在本文中,我想向您展示一种用于REST API测试的数据驱动方法.如果 ...
- EcmaScript学习
1.eval: ts: declare function eval(x: string): any; js: /** @param {*} x @return {Object} */ eval = f ...
- Sharepoint 图片库字段名称(Title)和对应的内部名称(InternalName)
做项目遇到需要查看列表库的内部名称,因为用的是图片库,所以就列出所有对应关系,以备查看方便:
- poj 2348 Euclid's Game
题目: 给两个整数a和b,两个人先后用较大的数减去较小数的整数倍,并且保证相减后为非负数.先把一个数变为0的人获胜. 分析: 很显然,当大数是小数的整数倍时为必胜态. 从这道题学会一个叫做自由度的东西 ...
- 2017 ACM/ICPC Asia Regional Shenyang Online number number number
题意:求n个斐波那契数列组合都无法得到的最小数字 解法: 1 我们先暴力的求出前面几个数字 2 然后再暴力的求递推 3 接着矩阵快速幂(没写错吧?) /*#include<bits/stdc++ ...