[学习笔记]Pollard-Rho
之前学的都是假的
Miller_Rabin:Miller-Rabin与二次探测
大质数分解:
找到所有质因子,再logn搞出质因子的次数
方法:不断找到一个约数d,递归d,n/d进行分解,直到n是质数
快速幂快速乘:
ll qk(ll a,ll b,ll m){
ll d=((long double)a/m*b);
ll r=a*b-d*m;
return ((ull)r+m)%m;
}
ll qm(ll x,ll y,ll mod){
ll ret=;
while(y){
if(y&) ret=qk(ret,x,mod);
x=qk(x,x,mod);
y>>=;
}
return ret;
}
注意快速乘:((ull)r+m)%m由于r可能<0或者>m,这一步是必须的
Miller-Rabin:
bool M_R(ll p){
if(p==) return false;
if(p==||p==||p==||p==||p==||p==) return true;
if(p%==||p%==||p%==||p%==) return false;
int s=ctz(p-);
for(reg i=;i<;++i){
int a=pri[i];
ll k=(p-)>>s;
k=qm(a,k,p);
if(k==) continue;
ll las=k;
for(reg j=;j<=s;++j){
k=qk(k,k,p);
if(k==&&las!=p-&&las!=) return false;
las=k;
}
if(k!=) return false;
}
return true;
}
二进制gcd
ll gcd(ll a,ll b)
{
if(!a||!b) return a|b;
#define ctz __builtin_ctzll
int shift=ctz(a|b);
b>>=shift;
while(a)
{
a>>=ctz(a);
if(a<b)
swap(a,b);
a-=b;
}
return b<<shift;
#undef ctz
}
就是高精gcd才用的更相减损术
Pollard-Rho
主体1
ll P_R(ll p,ll c){
ll x=,y=,d;
int k=,has=;
ll tmp=;
while(){
++has;
x=ad(qk(x,x,p),c,p);
tmp=qk(tmp,abs(y-x),p);
if(x==y) return p;
if(k==has){
k<<=;
y=x;
d=gcd(tmp,p);
tmp=;
if(d>) return d;
}
}
}
注意tmp,把所有的abs(y-x)乘在一起,gcd显然不变,并且减少了求gcd次数
主体2
void fin(ll p,int cnt){
if(p==||p<=ans) return;
if(M_R(p)) {
ans=max(ans,p);return;
}
ll d=P_R(p,cnt);
while(d==p) --cnt,d=P_R(p,cnt);
while(p%d==) p/=d;
fin(p,cnt);fin(d,cnt);
}
如果要求质因子,开个vector,最后去重即可
模板:
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Modulo{
const int mod=;
int ad(int x,int y){return (x+y)>=mod?x+y-mod:x+y;}
void inc(int &x,int y){x=ad(x,y);}
int mul(int x,int y){return (ll)x*y%mod;}
void inc2(int &x,int y){x=mul(x,y);}
int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
}
//using namespace Modulo;
namespace Miracle{
ll ans;
ll qk(ll x,ll y,ll mod){
ll d=((long double)x*y/mod);
ll r=x*y-mod*d;
return r<?r+mod:(r>=mod?r-mod:r);
}
ll qm(ll x,ll y,ll mod){
ll ret=;
while(y){
if(y&) ret=qk(ret,x,mod);
x=qk(x,x,mod);
y>>=;
}
return ret;
}
ll ad(ll x,ll y,ll mod){
return (x+y)>=mod?x+y-mod:x+y;
}
ll gcd(ll a,ll b){
if(!a||!b) return a+b;
#define ctz __builtin_ctzll
int tmp=ctz(a|b);
b>>=ctz(b);
while(a){
a>>=ctz(a);
if(a<b) swap(a,b);
a-=b;
}
return b<<tmp;
}
int pri[]={,,,,,};
bool M_R(ll p){
// cout<<"M_R "<<p<<endl;
if(p==) return false;
if(p==||p==||p==||p==||p==||p==) return true;
if(p%==||p%==||p%==||p%==) return false;
int s=ctz(p-);
for(reg i=;i<;++i){
ll a=pri[i];
ll tmp=(p-)>>s;
ll now=qm(a,tmp,p);
if(now==||now==p-) continue;
for(reg j=;j<=s;++j){
ll las=now;
now=qk(now,now,p);
if(now==&&las!=p-&&las!=) return false;
}
if(now!=) return false;
}
return true;
}
ll P_R(ll p,ll c){
// cout<<" P_R "<<p<<" "<<c<<endl;
ll x,y,d;
ll tmp=,has=,k=;
x=y=;
while(){
++has;
x=ad(qk(x,x,p),c,p);
tmp=qk(tmp,abs(y-x),p);
if(x==y) return p;
if(has==k){
k<<=;
d=gcd(tmp,p);
if(d>) {
// cout<<" ret "<<d<<endl;
return d;
}
tmp=;
y=x;
}
}
}
void sol(ll n,int c){
if(n==||n<=ans) return;
if(M_R(n)){
ans=max(ans,n);return;
}
ll d=P_R(n,c);
while(d==n) --c,d=P_R(n,c);
while(n%d==) n/=d;
sol(n,c);sol(d,c);
}
int main(){
int t;
rd(t);
srand();
while(t--){
ans=;ll n;rd(n);
sol(n,);
if(ans!=n) printf("%lld\n",ans);
else printf("Prime\n");
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/
[学习笔记]Pollard-Rho的更多相关文章
- OpenCV之Python学习笔记
OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...
- OpenCV 学习笔记 07 目标检测与识别
目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...
- UFLDL深度学习笔记 (一)反向传播与稀疏自编码
UFLDL深度学习笔记 (一)基本知识与稀疏自编码 前言 近来正在系统研究一下深度学习,作为新入门者,为了更好地理解.交流,准备把学习过程总结记录下来.最开始的规划是先学习理论推导:然后学习一两种开源 ...
- UFLDL深度学习笔记 (五)自编码线性解码器
UFLDL深度学习笔记 (五)自编码线性解码器 1. 基本问题 在第一篇 UFLDL深度学习笔记 (一)基本知识与稀疏自编码中讨论了激活函数为\(sigmoid\)函数的系数自编码网络,本文要讨论&q ...
- matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象
一起来学matlab-matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matl ...
- matlab学习笔记8 基本绘图命令-特殊图形绘制
一起来学matlab-matlab学习笔记8 基本绘图命令_3 特殊图形绘制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等 ...
- 【python】numpy库和matplotlib库学习笔记
Numpy库 numpy:科学计算包,支持N维数组运算.处理大型矩阵.成熟的广播函数库.矢量运算.线性代数.傅里叶变换.随机数生成,并可与C++/Fortran语言无缝结合.树莓派Python v3默 ...
- 【学习笔记】Polya定理
笔者经多番周折终于看懂了\(\text{Burnside}\)定理和\(\text{Polya}\)定理,特来写一篇学习笔记来记录一下. 群定义 定义:群\((G,·)\)是一个集合与一个运算·所定义 ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
随机推荐
- 微信端的user-Agent
在iPhone下,返回 Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Ge ...
- shops
#!/usr/bin/env python #coding:utf- import urllib2,sys,re,os,string reload(sys); sys.setdefaultencodi ...
- Promise https://www.liaoxuefeng.com/wiki/1022910821149312/1023024413276544
在JavaScript的世界中,所有代码都是单线程执行的. 由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行.异步执行可以用回调函数实现: function ca ...
- 二.python数据结构的性能分析
目录: 1.引言 2.列表 3.字典 一.引言 - 现在大家对 大O 算法和不同函数之间的差异有了了解.本节的目标是告诉你 Python 列表和字典操作的 大O 性能.然后我们将做一些基于时间的实验来 ...
- larbin终于编译完成
1.目前sourceforge不能下载,只能找mirror进行下载了: 2.一些头文件始终找不到,定位了一下,应该是makefile中设置有问题,把CXXFLAGS中的-I-去掉,即可编译成功:
- Linux平时常用命令_查看进程_监控日志等命令
1.查进程 ps命令查找与进程相关的PID号: ps a 显示现行终端机下的所有程序,包括其他用户的程序. ps -A 显示所有程序. ps c 列出程序时,显示每个程序真正 ...
- oracle有哪些审计项
ACTION NAME 0 UNKNOWN 1 CREATE TABLE 2 INSERT 3 SELECT 4 CREATE CLUSTER 5 ALTER CLUSTER 6 UPDATE 7 D ...
- mysql锁机制之表锁(三)
顾名思义,表锁就是一锁锁一整张表,在表被锁定期间,其他事务不能对该表进行操作,必须等当前表的锁被释放后才能进行操作.表锁响应的是非索引字段,即全表扫描,全表扫描时锁定整张表,sql语句可以通过执行计划 ...
- QT QSettings读写配置文件
QT QSettings读写配置文件 需要用一个配置文件来保存程序的初始值,同时也需要做保存修改后的值. 那么借助于QSetting 就可以达到目的. 注意,生成的是 ini 文件! //1.创建和读 ...
- Minimum Depth of Binary Tree最短深度
Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ...