Pollard_Rho 整数分解法【学习笔记】
引文:如果要对比较大的整数分解,显然之前所学的筛选法和是试除法都将不再适用。所以我们需要学习速度更快的Pollard_Rho算法。
算法原理:
生成两个整数a和b,计算p=gcd(a-b, n),知道p不为1或a,b出现循环为止,若p=n,则n为质数,否则p为n的一个约数。
对于如何生成这两个数,选取一个小的随机数x1,迭代生成

通过这个方式,我们只需要知道x1和c就可以生成一系列数值,c可以取任意给定值,一般取c=1。
若序列出现循环,则退出。
计算p=gcd(xi-1-xi, n), 若p=1,返回上一步,直到p>1为止;若p=n,则n为素数,否则p为一个约数并递归分解p和n/p。
例题:https://vjudge.net/problem/POJ-1811
代码:
#include <iostream>
#include <cstdio>
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <map>
#include <cmath> using namespace std;
typedef long long LL;
const int Test[] = {, , , , , , , };
const int Times = ;
vector<LL> Factor; LL gcd(LL a, LL b)
{
return b==?a:gcd(b, a%b);
} LL Multi(LL a, LL b, LL mod)
{
LL ans = ;
while(b)
{
if(b&)
ans = (ans + a)%mod;
a = (a+a)%mod;
b>>=;
}
return ans;
} LL Pow(LL a, LL b, LL mod)
{
LL ans = ;
while(b)
{
if(b&)
{
ans = Multi(ans, a, mod);
}
b>>=;
a=Multi(a, a, mod);
}
return ans;
} bool Miller_Rabin(LL n)
{
if(n < ) return false;
LL s = n-, t = , x, next;
while(!(s&) ) //根据运算符的优先级必须加括号
{
s>>=;
t++;
}
for(int i = ; i < Times; i++)
{
if(n== Test[i]) return true;
x = Pow(Test[i], s, n);
for(int j = ; j <= t; j++)
{
next = Multi(x, x, n);
if(next == && x != && x != n-)
return false;
x = next;
}
if(x != )
return false;
}
return true;
} LL Pollard_Rho(LL n, int c)
{
LL i = , k = ;
LL x = rand()%(n-) + , y; //保证随机数在(0,n)内
y = x;
while()
{
i++;
x = (Multi(x, x, n) + c)%n; //继续生成数
LL p = gcd(x>y?x-y:y-x, n);
if(p!= && p!=n) //因为p>1
return p;
if(y == x)
return n;
if(i == k)
{
y = x;
k<<=;
}
}
} void Find(LL n, int c)
{
if(n == )
return;
if(Miller_Rabin(n))
{
Factor.push_back(n);
return;
}
LL p = n, k = c;
while(p >= n)
{
p = Pollard_Rho(n, c--);
}
Find(p, k);
Find(n/p, k);
} int main()
{
int T;
LL x;
cin >>T;
while(T--)
{
Factor.clear();
cin >> x;
Find(x, ); //107足矣
if(Factor.size() == )
printf("Prime\n");
else
{
sort(Factor.begin(), Factor.end());
printf("%I64d\n", Factor[]);
}
}
}
Code
Pollard_Rho 整数分解法【学习笔记】的更多相关文章
- 一篇自己都看不懂的点分治&点分树学习笔记
淀粉质点分治可真是个好东西 Part A.点分治 众所周知,树上分治算法有$3$种:点分治.边分治.链分治(最后一个似乎就是树链剖分),它们名字的不同是由于分治方式的不同的.点分治,顾名思义,每一次选 ...
- 读写分离&分库分表学习笔记
读写分离 何为读写分离? 见名思意,根据读写分离的名字,我们就可以知道:读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上. 这样的话,就能够小幅提升写性能,大幅提升读性能. 我简单画了一 ...
- Miller_Rabbin&&Pollard_Rho 学习笔记
占坑,待填 I Intro 首先我们考虑这样一个问题 给定一个正整数\(p(p<=1e8)\),请判断它是不是质数 妈妈我会试除法! 于是,我们枚举$ \sqrt p$ 以内的所有数,就可以非常 ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- 学习笔记 - 快速傅里叶变换 / 大数A * B的另一种解法
转: 学习笔记 - 快速傅里叶变换 / 大数A * B的另一种解法 文章目录 前言 ~~Fast Fast TLE~~ 一.FFT是什么? 二.FFT可以干什么? 1.多项式乘法 2.大数乘法 三.F ...
- Eclipse插件开发 学习笔记 PDF 第一篇到第四篇 免分下载 开发基础 核心技术 高级进阶 综合实例
<<Eclipse插件开发 学习笔记>>,本书由浅入深.有重点.有针对性地介绍了Eclipse插件开发技术,全书分为4篇共24章.第一篇介绍Eclipse平台界面开发的基础知识 ...
- hive学习笔记之五:分桶
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 五一DAY1数论学习笔记
by ruanxingzhi 整除性 如果a能把b除尽,也就是没有余数,则我们称a整除b,亦称b被a整除.(不是除以,是整除!!) 记作:\(a|b\) |这个竖杠就是整除符号 整除的性质 自反性 对 ...
- linux驱动开发之块设备学习笔记
我的博客主要用来存放我的学习笔记,如有侵权,请与我练习,我会立刻删除.学习参考:http://www.cnblogs.com/yuanfang/archive/2010/12/24/1916231.h ...
随机推荐
- ARCGIS中怎么去除重复的面?(转)
ARCGIS中怎么去除重复的面? https://blog.csdn.net/gswwldp/article/details/66974522 第一种: 1.用polygon to line将面转 ...
- SpringBoot26 利用 Ribbon + RestTemplate 调用远程服务资源
1 RestTemplate扫盲 借助 RestTemplate,Spring应用能够方便地使用REST资源 2 准备 创建三个springCloud项目 >Eureaka : 服务注册中心 ...
- java容器 Map Set List
容器:在java中,如果有一个类专门用来存放其他类的对象,这个类就叫做容器,或者叫集合,集合就是将若干性质相同或者相近的类的对象组合在一起而形成一个整体. boolean add(Object obj ...
- IE浏览器和Firefox浏览器兼容性问题及解决办法
IE浏览器和Firefox浏览器兼容性问题及解决办法 为了方便大家阅读代码,以下以 IE 代替 Internet Explorer,以 MF/FF 代替 Mozzila Firefox : 1.//w ...
- Visual Studio 2010调试本地 IIS 站点
点击vs的Debug-Attach to Process选中 w3wp.exe,然后点击Attach, vs便进入debug模式.
- JavaScript 组件编写
说明 这是一个联系人名过滤组件,还提供可选的"大小写是否敏感"选项,默认大小写不敏感. 一.HTML 结构 <ul class="contacts"> ...
- (转)什么?你还不会写JQuery 插件
原文地址:http://www.cnblogs.com/joey0210/p/3408349.html 前言 如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jque ...
- 编写高质量代码改善C#程序的157个建议——建议61:避免在finally内撰写无效代码
建议61:避免在finally内撰写无效代码 在阐述建议之前,需要先提出一个问题:是否存在一种打破try-finally执行顺序的情况,答案是:不存在(除非应用程序本身因为某些很少出现的特殊情况在tr ...
- 编写高质量代码改善C#程序的157个建议——建议13: 为类型输出格式化字符串
建议13: 为类型输出格式化字符串 有两种方法可以为类型提供格式化的字符串输出.一种是意识到类型会产生格式化字符串输出,于是让类型继承接口IFormattable.这对类型来 说,是一种主动实现的方式 ...
- OpenSSH/PuTTY/SSH使用
OpenSSH/PuTTY/SSH 常用SSH服务指令 ① 启动SSH服务的命令 service sshd start ② 停止SSH服务的命令 service sshd stop ③ 重新启动SSH ...