唯一分解之Pollard-Rho算法
一般分解是的复杂度,那么Pollard-Rho复杂度大概是,嗯就是x的四分之一次方,也就是说即使是longlong 的极限1e18,也能1s内跑的出来(18/4 = 4.5)
原理:
对于一个大整数n,我们取任意一个数x是n的质因数的几率很小,
如果取两个数x1以及x2使得它们的差是n的因数,那么几率就提高了,
如果取x1以及x2使得gcd((x1−x2),n)>1的概率就更高了。(概率的增加是因为组合数增加了)
这就是Pollard-Rho算法的主要思想。
我们随机x1,计算x2,(x[i] = (x[i-1]*x[i-1]%n+c)%n,c是一个自己定的常数 ),然后递归求解
用Miller_Rabbin来判断是否是素因子(单纯的因子的话递归分解它,素因子丢进答案的vector里)
poj1811,这是一道裸题,输出最小的素因子,本身是素数的话输出Prime
下面是代码
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn = 1e5+7;
vector<ll> vec;
ll MMul(ll x,ll y,ll mod,ll ans = 0){return (x * y - (long long)(x / (long double)mod * y + 1e-3) *mod + mod) % mod;
}
ll MExp(ll a,ll b,ll mod,ll ans = 1){for(a %= mod;b;b>>=1){if(b&1)ans = MMul(ans,a,mod);a = MMul(a,a,mod);}return ans;
}
bool Miller_Rabin(ll n,ll u = 0,int t = 0,int s = 10){if(n == 2)return true;if(n<2||!(n&1))return false;/// <2 || %2==0for(t = 0,u = n-1;!(u&1);t++,u>>=1);///n-1=u*2^twhile(s--){/// s timell a = rand()%(n-1)+1;ll x = MExp(a,u,n);///a^ufor(int i=0;i<t;i++){ll y = MMul(x,x,n);/// (a^u)^2if(y == 1&&x!=1&&x!=n-1)return false;x = y;}if(x!=1)return false;/// (a^p-1)%p != 1}return true;
}
ll Pollard_Rho(ll n, int c){ll i = 1, k = 2, x = rand()%(n-1)+1, y = x;while(true){i++;x = (MMul(x, x, n) + c)%n;ll p = __gcd((y-x+n)%n,n);if(p != 1 && p != n) return p;if(y == x) return n;if(i == k){y = x;k <<= 1;}}
}
void Find(ll n, int c){if(n == 1) return;if(Miller_Rabin(n)){vec.push_back(n);return;}ll p = n, k = c;while(p >= n) p = Pollard_Rho(p, c--);Find(p, k);Find(n/p, k);
}
int main(){int t;cin>>t;while(t--){ll k;cin>>k;if(Miller_Rabin(k)){cout<<"Prime"<<endl;continue;}vec.clear();Find(k,2333);sort(vec.begin(),vec.end());cout<<vec[0]<<endl;}return 0;
}
唯一分解之Pollard-Rho算法相关推荐
- 大整数分解——Pollard Rho算法
延续上一篇,这次来讲一讲大整数分解算法的应用. 要解决的问题很简单,对一个整数进行分解质因数. 首先还是效率非常低的暴力算法,相信大家都会,不多提. 和上次一样,当数达到非常大的时候,分解将变得非常困 ...
- c语言用rho函数求复数模长,Pollard Rho 算法简介
$\text{update 2019.8.18}$ 由于本人将大部分精力花在了cnblogs上,而不是洛谷博客,评论区提出的一些问题直到今天才解决. 下面给出的Pollard Rho函数已给出散点图. ...
- BZOJ 5330 Luogu P4607 [SDOI2018]反回文串 (莫比乌斯反演、Pollard Rho算法)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=5330 (Luogu) https://www.luogu.org/prob ...
- 因数分解 Pollard rho
因数分解 Pollard rho 算法思路 随机生成两个数a,ba,ba,b,然后求gcd(n,a−b)\gcd\pod{n,a-b}gcd(n,a−b),如果其值不为111,则这个数就是nnn的一 ...
- 素数判定质因数分解(数论)(Miller Rabin)(Pollard Rho)
太玄学了! 我真的被概率的魅力折服了.此前我认为1便是1,0.9999999999-便是0.9999999999-. 但实际上它们有着千丝万缕的关系. 试想,如果一件事发生的概率是0.99999999 ...
- 【快速因数分解】Pollard's Rho 算法
算法目的 给一个数n,快速提取n的一个因数. 算法根据:生日悖论 讲生日悖论之前,先看一个东西. 给出[1-1000]的数,从中任意选出一个数为k的概率是110001\over 100010001. ...
- 64位以内Rabin-Miller 强伪素数测试和Pollard rho 因数分解解析
在求解POJ1811题Prime Test中应用到的两个重要算法是Rabin-Miller强伪素数测试和Pollard r因数分解算法.前者可以在的时间内以很高的成功概率判断一个整数是否是素数.后者可 ...
- 整数的素因子分解:Pollard rho method
参考: 1.CLRS<算法导论> 2.http://www.csh.rit.edu/~pat/math/quickies/rho/#algorithm Pollard rho方法是随机算法 ...
- 简述大数分解算法Pollard Rho和Pollard p-1
大数分解问题其实至今都是一个世界级难题,最常见的分解法是从2一直找到sqr(N),作为一个密码学专业的学生,每次看到别人这么做来进行因子分解,自己都控制不住想要制止他,因为这个算法的效率简直太太太太太 ...
- 4.2 Pollard p-1算法
文章目录 算法 Python实现 算法 1974年,John Pollard发明了p-1算法,其灵感来自于费马小定理.p-1算法一个重要的概念就是B-powersmooth,这个不太好翻译,pow ...
最新文章
- 逐行阅读redux源码(二)combineReducers
- python初学者视频-python从入门到精通视频(全60集)
- 【杂谈】为什么有三AI自断财路,从来不接广告
- 静态分配和动态分配内存的区别
- 一、linux搭建jenkins+github详细步骤
- MongoDB中文社区年终盛典
- JDK的bug导致Java文件删除不了,必须fgc
- 深入理解Nginx~正常运行的配置项
- 在linux系统下做软raid教程
- fpga如何约束走线_FPGA入门之我见- 布局布线(place route,PAR)
- 计算机基础知识(免费、全面)
- 【JoJo的摄影笔记】黎明女神的呼唤—— 佳能王朝霸业崛起
- 反锐化掩膜_带噪声抑制的反锐化掩模图像增强算法
- kettle导数据入HBase数据库报错解决
- python设置坐标轴刻度宽度_使用轴网格matplotlib时设置刻度宽度
- 求解三维空间中两向量之间的夹角
- JavaScript实现加密与解密详解
- 基于Singer映射和参数位置自适应更新机制的改进被囊群算法
- 我采访了同事,让他掏出了每天都会浏览的干货网站...这几个网站也太牛了吧!
- 计算机四级数据工程师题库,全国计算机等级考试四级数据库系统工程师练习题...