Pollard-Rho 总结
将一个大数\(N\)分解质因子。
试除法,暴力枚举\(1~\sqrt{N}\)的数。时间复杂度:\(O(\sqrt{N})\)。
通常,这个复杂度够了,但有时,\(N\leq10^{18}\)。
这就需要Pollard-Rho了。
首先,考虑一种简单情况。设\(N=p*q(p<q)\)。
有一种糟糕的做法:随机法。随机一个\(1~\sqrt{N}\)的数x,判断能否整除。期望需要\(\sqrt{N}\)次。
我们发现,随机的数x并不一定要等于p,只要是p的倍数即可,即\(gcd(N,x)=p\)。
然而,这样每次的概率仍只有\(\frac{1}{\sqrt{N}}\)。
我们来考虑这样一种情况:在[1,1000]里面取一个数,取到我们想要的数(比如说,42),成功的概率是多少呢?显然是1/1000。
一个不行就取两个吧:随便在[1,1000]里面取两个数我们想办法提高准确率,就取两个数的差值绝对值。
也就是说,在[1,1000]里面任意选取两个数\(i,j\),问\(∣i−j∣=42\)的概率是多大?答案会扩大到1/500。
我们可以取\(\sqrt{p}\),即\(N^{0.25}\)个数,两两做差并与N求gcd。
但我们需要两两做差,复杂度会回去。
若\(gcd(|a-b|,N)=p\),则\(a=b (mod p)\)。(a不等于b)
然后,我们可以随机生成一个序列,看看里面是否有模p意义下相等的两个数。
但是,我们不知道p,我们只能通过求\(gcd(|a-b|,N)\)的方法来判断\(a=b (mod p)\)是否成立。就是说,我们只能判断\(a=b (mod p)\)是否成立,不能知道\(a\%p\)的值。
这个序列,我们显然可以\(rand\),但有一种更好的方法:
设序列\(A_i=f(A_{i-1})\),其中\(f(x)=x^2+y\)(y为定值)。那么,若\(a=b (mod p),f(a) mod p\)一定等于\(f(b) mod p\)。但rand就没有这个性质。
换句话说,就是mod p后的数列出现了循环(原数列没有循环)。
这样,只要找到mod p后的数列的循环即可。(若用rand(),就需要等到原数列循环,复杂度就会退化为\(\sqrt{N}\))
找循环可以用Floyd判圈,而这个算法正好是对两个进行比较的。
但是,可能原数列循环后,都没有找到解。
所以,在判圈的时候,如果原数列循环,则退出,换一个新的y计算。
根据“生日悖论”,只要选\(\sqrt{p}\)个小于p的数,就有相等的。
由于模数是\(10^{18}\)级别的,要用快速乘。
时间复杂度:\(O(N^{0.25}*logN)\)。
代码:
int sed[4]={13131,4649,65537,28627},se;
ll n;
ll gcd(ll a,ll b)
{
while(b!=0)
{
ll t=a%b;
a=b;
b=t;
}
return a;
}
ll f(ll x)
{
return (ksc(x,x,n)+se)%n;
}
ll ksc(ll a,ll b,ll md)
{
ll jg=0;
while(b>0)
{
if(b&1)
jg=(jg+a)%md;
a=(a+a)%md;
b=(b>>1);
}
return jg;
}
ll rho()
{
while(1)
{
se=sed[rand()%4];
ll z1=1,z2=f(z1);
while(z1!=z2)
{
ll t=z1-z2;
if(t<0)
t=-t;
ll g=gcd(t,n);
if(g!=1&&g!=n)
return g;
z1=f(z1);
z2=f(f(z2));
}
}
}
Pollard-Rho 总结的更多相关文章
- POJ 1811 Prime Test (Pollard rho 大整数分解)
题意:给出一个N,若N为素数,输出Prime.若为合数,输出最小的素因子.思路:Pollard rho大整数分解,模板题 #include <iostream> #include < ...
- 整数(质因子)分解(Pollard rho大整数分解)
整数分解,又称质因子分解.在数学中,整数分解问题是指:给出一个正整数,将其写成几个素数的乘积的形式. (每个合数都可以写成几个质数相乘的形式,这几个质数就都叫做这个合数的质因数.) .试除法(适用于范 ...
- Pollard Rho因子分解算法
有一类问题,要求我们将一个正整数x,分解为两个非平凡因子(平凡因子为1与x)的乘积x=ab. 显然我们需要先检测x是否为素数(如果是素数将无解),可以使用Miller-Rabin算法来进行测试. Po ...
- Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法
BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1044 Solved: 322[Submit][ ...
- 初学Pollard Rho算法
前言 \(Pollard\ Rho\)是一个著名的大数质因数分解算法,它的实现基于一个神奇的算法:\(MillerRabin\)素数测试(关于\(MillerRabin\),可以参考这篇博客:初学Mi ...
- 【Luogu】P4358密钥破解(Pollard Rho)
题目链接 容易发现如果我们求出p和q这题就差不多快变成一个sb题了. 于是我们就用Pollard Rho算法进行大数分解. 至于这个算法的原理,emmm 其实也不是很清楚啦 #include<c ...
- Miller-Rabin 素性测试 与 Pollard Rho 大整数分解
\(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要 ...
- BZOJ_4802_欧拉函数_MR+pollard rho+欧拉函数
BZOJ_4802_欧拉函数_MR+pollard rho+欧拉函数 Description 已知N,求phi(N) Input 正整数N.N<=10^18 Output 输出phi(N) Sa ...
- BZOJ_3667_Rabin-Miller算法_Mille_Rabin+Pollard rho
BZOJ_3667_Rabin-Miller算法_Mille_Rabin+Pollard rho Description Input 第一行:CAS,代表数据组数(不大于350),以下CAS行,每行一 ...
- 浅谈 Miller-Robbin 与 Pollard Rho
前言 $Miller-Robbin$ 与 $Pollard Rho$ 虽然都是随机算法,不过用起来是真的爽. $Miller Rabin$ 算法是一种高效的质数判断方法.虽然是一种不确定的质数判断法, ...
随机推荐
- JAVA MAC 比较大小
2个MAC String mac_1="AAAAAAAAAAAA"; String mac_1="AAAAAAAAAAAB"; 方法一: int a = 0; ...
- LC 173. Binary Search Tree Iterator
题目描述 Implement an iterator over a binary search tree (BST). Your iterator will be initialized with t ...
- 大话OSI七层协议
大白话OSI七层协议 互联网的本质就是一系列的网络协议,这个协议就叫OSI协议(一系列协议),按照功能不同,分工不同,人为的分层七层.实际上这个七层是不存在的.没有这七层的概念,只是人为的划分而已.区 ...
- flask返回自定义的Response
from json import dumps from flask import Response from flask_api import status from protocol.errors_ ...
- 2019杭电多校二 L. Longest Subarray (线段树)
大意: 给定序列$a$, 元素范围$[1,C]$, 求一个最长子序列, 满足每个元素要么不出现, 要么出现次数$\le K$. 枚举右端点, 考虑左端点合法的位置. 显然一定是$C$种颜色合法位置的交 ...
- root用户和sudo使用root权限的区别(转)
百度百科:https://baike.baidu.com/item/sudo/7337623?fr=aladdin sudo指令 功能: 以root的身分执行命令 语法: sudo 其他指令 用户: ...
- 面试经典算法:快速排序Golang实现
Golang快速排序 定义 快速排序由C. A. R. Hoare在1962年提出.快速排序是对冒泡排序的一种改进,采用了一种分治的策略. 基本思想 通过一趟排序将要排序的数据分割成独立的两部分,其中 ...
- [jquery]ajax最最常用的七个属性
1.url 类型:String 默认值: 当前页地址.发送请求的地址. 2.data 类型:String 发送到服务器的数据.将自动转换为请求字符串格式.GET 请求中将附加在 URL 后.查看 pr ...
- oracle学习笔记:update一整列 关联更新
普通的 update 都是根据条件来对部分列的内容进行修改,用法如下: update temp_cwh_table set name = 'xxx' where id = 1; 假设现在有2张表:A. ...
- javascript--BOM(browser object model)五大对象
浏览器对象模型: 作用:访问.控制.修改浏览器,与浏览器进行交互(打开新的窗口.回退历史记录.获取url) BOM与的DOM区别:JS通过BOM与浏览器进行交互.BOM的window对象包含了docu ...