Int64以内Rabin-Miller强伪素数测试和Pollard 因数分解的算法实现

选取随机数\(a\) 随机数\(b\),检查\(gcd(a - b, n)\)是否大于1,若大于1则\(a - b\)是\(n\)的一个因数

实现1:floyd判环

利用多项式\(f(x)\)迭代出\({x_0, x_1, \dots, x_k}\)

设定\(x = y = x_0\)的初始值,选用多项式进行迭代,每次:\(x = f(x)\), \(y = f(f(y))\),即:\(x = x_k, y = x_{2k}\)当\(x == y\)时出现循环

设\(x = y = 2\),\(f(n) = n^2 + a\)

typedef long long ll;

ll mul_mod(ll a, ll b, ll m){
ll ans = 0, exp = a;
while(a >= m) a -= m;
while(b){
if(b & 1){
ans += exp;
while(ans >= m) ans -= m;
}
exp += exp;
while(exp >= m) exp -= m;
b >>= 1;
}
return ans;
} ll pollard_rho(ll n, int a){
ll x = 2, y = 2, d = 1;
while(d == 1){
x = mul_mod(x, x, n) + a;
y = mul_mod(y, y, n) + a;
y = mul_mod(y, y, n) + a;
d = __gcd((x >= y ? x - y : y - x), n);
}
if(d == n) return pollard_rho(n, a + 1);
return d;
}

实现2: brent判环(更高效)

不同于floyd每次计算\(x_k, x_{2k}\)进行判断,brent每次只计算\(x_k\),当k是2的方幂时,\(y = x_k\),每次计算\(d = gcd(x_k - y, n)\)

typedef long long ll;

ll mul_mod(ll a, ll b, ll m){
ll ans = 0, exp = a;
while(a >= m) a -= m;
while(b){
if(b & 1){
ans += exp;
while(ans >= m) ans -= m;
}
exp += exp;
while(exp >= m) exp -= m;
b >>= 1;
}
return ans;
} ll pollard_rho(ll n, int a){
ll x = 2, y = 2, d = 1, k = 0, i = 1;
while(d == 1){
++k;
x = mul_mod(x, x, n) + a;
d = __gcd(x >= y ? x - y : y - x, n);
if(k == i){
y = x;
i <<= 1;
}
}
if(d == n) return pollard_rho(n, a + 1);
return d;
}

Pollard_rho 因数分解的更多相关文章

  1. 数论知识总结——史诗大作(这是一个flag)

    1.快速幂 计算a^b的快速算法,例如,3^5,我们把5写成二进制101,3^5=3^1*1+3^2*2+3^4*1 ll fast(ll a,ll b){ll ans=;,a=mul(a,a)))a ...

  2. 数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429

    素数判定Miller_Rabin算法详解: http://blog.csdn.net/maxichu/article/details/45458569 大数因数分解Pollard_rho算法详解: h ...

  3. 与数论的厮守02:整数的因子分解—Pollard_Rho

    学Pollard_Rho之前,你需要学会:Miller Rabin. 这是一个很高效的玄学算法,用来对大整数进行因数分解. 我们来分解n.若n是一个素数,那么就不需要分解了.所以我们还得能够判断一个数 ...

  4. POJ 1811 Prime Test (Rabin-Miller强伪素数测试 和Pollard-rho 因数分解)

    题目链接 Description Given a big integer number, you are required to find out whether it's a prime numbe ...

  5. 大素数判断和素因子分解(miller-rabin,Pollard_rho算法) 玄学快

    大数因数分解Pollard_rho 算法 复杂度o^(1/4) #include <iostream> #include <cstdio> #include <algor ...

  6. @总结 - 10@ Miller-Rabin素性测试与Pollard-Rho因数分解

    目录 @1 - 素性测试:Miller-Rabin算法@ @1.1 - 算法来源@ @1.2 - 算法描述@ @1.3 - 算法实现@ @2 - 因数分解:Pollard-Rho算法@ @2.0 - ...

  7. 【BZOJ-4522】密钥破解 数论 + 模拟 ( Pollard_Rho分解 + Exgcd求逆元 + 快速幂 + 快速乘)

    4522: [Cqoi2016]密钥破解 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 290  Solved: 148[Submit][Status ...

  8. 数论 - Miller_Rabin素数测试 + pollard_rho算法分解质因数 ---- poj 1811 : Prime Test

    Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 29046   Accepted: 7342 Case ...

  9. Vijos1889 天真的因数分解

    描述 小岛: 什么叫做因数分解呢?doc : 就是将给定的正整数n, 分解为若干个素数连乘的形式.小岛: 那比如说 n=12 呢?doc : 那么就是 12 = 2 X 2 X 3 呀.小岛: 呜呜, ...

随机推荐

  1. java获取request的头信息

    1.获取全部头信息: //get request headers private Map<String, String> getHeadersInfo() { Map<String, ...

  2. Firebird 列可空非空修改

    2018-12-04 至少到Firebird 3.0.4 已经添加了设置可空 和 非空的语法:如 -- 删除非空(设置为可空) ALTER TABLE TECH ALTER label drop NO ...

  3. BAT的关于程序员的那些事

    前言 你是否早有进入BAT公司的想法,但却因为对其不了解而在门外彷徨? 你是否想把技术团队打造成像BAT这些超级互联网公司,但却无从下手? 你是否已经进入了BAT,但是不知道如何晋升而苦恼? 那这篇文 ...

  4. Cannot find module 'object-keys' 的解决办法

    把node_modules文件夹删除,重新cnpm install安装node_modules就好了.

  5. C++测验代码

    /* 返回字符串前n位和返回整数前n位 */ #include <iostream> unsigned long left(unsigned long num, int n); char ...

  6. C#基础 (一)

    值类型和引用类型 堆和栈 栈存放的数据: (1)某些类型变量的值(2)程序当前的执行环境(3)传递给方法的参数 堆是存放对象的地方 对象类型有两种: 值类型和引用类型,他们的存储方式不同值类型: 只需 ...

  7. ComfortColor.xcs

    ComfortColor.xcs [comfort color] text=dce2e2text(bold)=dce2e2 magenta=dd3682magenta(bold)=dd3682 whi ...

  8. Python中元组和列表

    一.list列表的操作包括以下函数: 列表操作包括以下函数: 1.cmp(list1,list2) :比较两个列表的元素 2.len(list) :列表元素个数 3.max(list) :返回列表元素 ...

  9. PAT 1038. Recover the Smallest Number

    #include <iostream> #include <cstdlib> #include <vector> #include <algorithm> ...

  10. Grunt实践之简易教程

    以前自己太low了,都没用过高大上的前端自动化打包工具,开发方式也是偏传统的.加入到新的团队后得拼命赶上啊,前端技术更迭太快,各种技术层出不穷,智商都快不够用了.看人家都用的牛逼哄哄的技术,自己还守着 ...