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 ...
随机推荐
- 银行家算法之JavaScript实现
上学期有个课程叫做操作系统,期末的时候这课程还有个课程设计,其中有个题目叫做银行家算法. 什么是银行家算法我就不解释了! 看着同学们的设计,大同小异甚至前篇一律. 清一色的控制台程序,清一色的蛋疼输入 ...
- commons-X系列
1 commons-lang 1.1 ReflectionToStringBuilder 将对象进行字符串拼接 /* * Licensed to the Apache Software Foundat ...
- sql语句查询中exists中为什么要用select 1?
select * from call_cdr_xz_200609 a where and a.ori_charge<>0 and exists(select 1 from special ...
- 58. Length of Last Word最后一个单词的长度
[抄题]: [暴力解法]: 时间分析: 空间分析: [优化后]: 时间分析: 空间分析: [奇葩输出条件]: [奇葩corner case]: "b a " 最后一位是空格,可能误 ...
- struts2 框架的基本使用
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...
- 在Linux中监视IO性能
dd命令 iostat命令 理解iostat的各项输出 iostat的应用实例 附:在Windows中监视IO性能 延伸阅读 dd命令 dd其实是工作于比较低层的一个数据拷贝和转换的*nix平台的工具 ...
- Tarjan算法求出强连通分量(包含若干个节点)
[功能] Tarjan算法的用途之一是,求一个有向图G=(V,E)里极大强连通分量.强连通分量是指有向图G里顶点间能互相到达的子图.而如果一个强连通分量已经没有被其它强通分量完全包含的话,那么这个强连 ...
- session的应用----验证码
昨天登录功能中叙述了密码 用户名的数据库验证以及转发 那么这篇文章在昨天的基础上 处理验证码的验证功能,今天需要用到session域,session用于一次会话. package cn.lijun.d ...
- POJ1125 Stockbroker Grapevine(spfa枚举)
Description Stockbrokers are known to overreact to rumours. You have been contracted to develop a me ...
- 第一章:HTTP服务器,客户端简易代码解析
HTTP服务器: 方法{ main service } service:读取HTTP请求信息 解析HTTP请求 决定HTTP相应正文的类型 创建HTTP相应结果 发送HTTP相应结果 读 ...