引文:如果要对比较大的整数分解,显然之前所学的筛选法和是试除法都将不再适用。所以我们需要学习速度更快的Pollard_Rho算法。

算法原理:

生成两个整数ab,计算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为一个约数并递归分解pn/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 整数分解法【学习笔记】的更多相关文章

  1. 一篇自己都看不懂的点分治&点分树学习笔记

    淀粉质点分治可真是个好东西 Part A.点分治 众所周知,树上分治算法有$3$种:点分治.边分治.链分治(最后一个似乎就是树链剖分),它们名字的不同是由于分治方式的不同的.点分治,顾名思义,每一次选 ...

  2. 读写分离&分库分表学习笔记

    读写分离 何为读写分离? 见名思意,根据读写分离的名字,我们就可以知道:读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上. 这样的话,就能够小幅提升写性能,大幅提升读性能. 我简单画了一 ...

  3. Miller_Rabbin&&Pollard_Rho 学习笔记

    占坑,待填 I Intro 首先我们考虑这样一个问题 给定一个正整数\(p(p<=1e8)\),请判断它是不是质数 妈妈我会试除法! 于是,我们枚举$ \sqrt p$ 以内的所有数,就可以非常 ...

  4. 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)

    注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...

  5. 学习笔记 - 快速傅里叶变换 / 大数A * B的另一种解法

    转: 学习笔记 - 快速傅里叶变换 / 大数A * B的另一种解法 文章目录 前言 ~~Fast Fast TLE~~ 一.FFT是什么? 二.FFT可以干什么? 1.多项式乘法 2.大数乘法 三.F ...

  6. Eclipse插件开发 学习笔记 PDF 第一篇到第四篇 免分下载 开发基础 核心技术 高级进阶 综合实例

    <<Eclipse插件开发 学习笔记>>,本书由浅入深.有重点.有针对性地介绍了Eclipse插件开发技术,全书分为4篇共24章.第一篇介绍Eclipse平台界面开发的基础知识 ...

  7. hive学习笔记之五:分桶

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. 五一DAY1数论学习笔记

    by ruanxingzhi 整除性 如果a能把b除尽,也就是没有余数,则我们称a整除b,亦称b被a整除.(不是除以,是整除!!) 记作:\(a|b\) |这个竖杠就是整除符号 整除的性质 自反性 对 ...

  9. linux驱动开发之块设备学习笔记

    我的博客主要用来存放我的学习笔记,如有侵权,请与我练习,我会立刻删除.学习参考:http://www.cnblogs.com/yuanfang/archive/2010/12/24/1916231.h ...

随机推荐

  1. ArcGIS Engine中如何获取Map中已经选择的要素呢(转)

    ArcGIS Engine中如何获取Map中已经选择的要素呢   1.使用IEnumFeturea对象获取map中的FeatureSelection,该方法可以获取所有图层的选择要素.IMap中的Fe ...

  2. 扩展卡尔曼滤波EKF与多传感器融合

    参考:https://blog.csdn.net/young_gy/article/details/78468153 Extended Kalman Filter(扩展卡尔曼滤波)是卡尔曼滤波的非线性 ...

  3. 16-math_M_PI

    头文件math.h中宏定义的是M_PI#define M_PI 3.14159265358979323846所以不需要记忆PI的值了可以直接用

  4. solr第二天 京东案例 课程文档 有用

    全文检索技术   Lucene&Solr               Part3 1. 课程计划 1. Solr配置中文分析器 a) Schema.xml的配置 b) 配置IKAnalyzer ...

  5. CentOS 安装mongodb3.0 二进制包

    1.下载mongodb因为64位系统CentOS,所以下载64位的安装包: wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0 ...

  6. 实现一个简单的Plugin

    1.准备 1)安装pluginlib_tutorials包: 2)创建一个包 2.创建基类 创建一个基类,所有的插件都将从基类继承,如RegularPolygon基类 创建一个基类头文件 其内容如下 ...

  7. 实践作业3:白盒测试----小组分工讨论DAY2

    白盒测试需要通过检查软件内部的逻辑结构,对软件中的逻辑路径进行覆盖测试;在程序不同地方设立检查点,检查程序的状态,以确定实际运行状态与预期状态是否一致.我们小组在下课时候,在东九教学楼教师休息室进行了 ...

  8. HTTP文件上传插件开发文档-JSP

    版权所有 2009-2016 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/http-u ...

  9. Java List集合和Map集合的综合应用

    public static void main(String[] args) { //--------------------------------------------------------- ...

  10. Linux中的SELinux与chcon以及Samba实现【转】

    一.SELinux SElinux的前身是NSA(美国国家安全局)发起的一个项目.它的目的是将系统加固到可以达到军方级别. 为什么NSA选择Linux呢? 在目前市面上大多数操作系统都是商用闭源的,只 ...