引文:如果要对比较大的整数分解,显然之前所学的筛选法和是试除法都将不再适用。所以我们需要学习速度更快的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. 598. Range Addition II 矩阵的范围叠加

    [抄题]: Given an m * n matrix M initialized with all 0's and several update operations. Operations are ...

  2. ubuntu 14 编译ARM g2o-20160424

    1. 安装eigen sudo apt-get install libeigen3-dev sudo apt-get install libsuitesparse-dev sudo apt-get i ...

  3. _GNU_SOURCE宏

    打开_GNU_SOURCE这个宏可以打开一些功能,比如为了在Linux系统上编译使用带有检测文件type的宏(S_ISxxxx): S_ISREG() //传入stat结构的st_mode,下同.是否 ...

  4. seconds

    set_time_limit();//设置脚本运行时间为1秒

  5. storm源码分析之任务分配--task assignment

    在"storm源码分析之topology提交过程"一文最后,submitTopologyWithOpts函数调用了mk-assignments函数.该函数的主要功能就是进行topo ...

  6. Mbatis——动态SQL

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "- ...

  7. spark源码阅读之network(2)

    在上节的解读中发现spark的源码中大量使用netty的buffer部分的api,该节将看到netty核心的一些api,比如channel: 在Netty里,Channel是通讯的载体(网络套接字或组 ...

  8. servlet-向页面输出中文出现乱码处理方式

    package cn.lijun .content; import java.io.IOException;import java.io.PrintWriter; import javax.servl ...

  9. MVC复杂类型的模型绑定

    1,属性为引用类型(非集合,非数组) //模型1 public class Contact { public string Name { get; set; } public string Phone ...

  10. EasyUI学习笔记(1)----Tree控件实现过程中.NET下无法访问json数据的解决办法

    直接调用官网的Demo中的方法 , 将json数据存储在同目录下,但是在运行之后树没有出现,用FireBug调试,错误如下 不允许访问json数据,刚开始以为是权限不够,然后又给解决方案所在的文件夹设 ...