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$ 算法是一种高效的质数判断方法.虽然是一种不确定的质数判断法, ...
随机推荐
- 列表初始化(list initialization)
列表初始化啊就是大括号来初始化: 列表初始化的好处:
- IDEA中通过Maven插件使用MyBatis Generator
这样做更简单,参考: IDEA集成MyBatis Generator 插件 详解
- IntelliJ IDEA调出problem窗口
一.File =>Settings 二.搜索Compiler=>勾选Make project automatically 三.出现问题Problems窗口会报错 原文地址:https:// ...
- 关于MQ的几件小事(四)如何保证消息不丢失
1.mq原则 数据不能多,也不能少,不能多是说消息不能重复消费,这个我们上一节已解决:不能少,就是说不能丢失数据.如果mq传递的是非常核心的消息,支撑核心的业务,那么这种场景是一定不能丢失数据的. 2 ...
- ElementUi使用表单验证出现验证问题
问题: 使用vue element-ui中的form表单验证出现了输入框或者下拉框中明明有值, 但是却还是提示请输入或请选择,错误如下: <el-form status-icon :ref=&q ...
- vue购物车动画效果
使用动画的三个函数 v-on:before-enter="beforeEnter" v-on:enter="enter" v-on:after-enter=&q ...
- [Vuex系列] - 初尝Vuex第一个例子
Vuex是什么? Vuex是一个专为vue.js应用程序开发的状态管理库.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 通过定义和隔离状态管理中的各种概 ...
- 用mybatis将SQL查询语句”select * from user”的封装为配置文件
用mybatis将SQL查询语句”select * from user”的封装为配置文件 定义一个xml映射文件,文件名见名知意.如user-mapper.xml,文件内容如下: <?xml v ...
- 将现有vue项目基于electron打包成桌面应用程序
一.前言 项目本来打算采用B/S架构去做的,浏览器网址方式打开还是让用户不方便: 二.使用electron集成桌面应用 本身项目是使用vue-cli开发的,在使用electron之前,需要将本身的项目 ...
- 配置Python、Django环境变量教程
配置环境变量 在Windows下你必须配置环境变量! 右击桌面或者你能看到的任何 此电脑.这台电脑或者我的电脑. 右击:属性 点击:高级系统设置 点击:环境变量 找到系统变量下的Path,双击 点击新 ...