之前学的都是假的

%%zzt

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,最后去重即可

模板:

【模板】Pollard-Rho算法

// 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的更多相关文章

  1. OpenCV之Python学习笔记

    OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书< ...

  2. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  3. UFLDL深度学习笔记 (一)反向传播与稀疏自编码

    UFLDL深度学习笔记 (一)基本知识与稀疏自编码 前言 近来正在系统研究一下深度学习,作为新入门者,为了更好地理解.交流,准备把学习过程总结记录下来.最开始的规划是先学习理论推导:然后学习一两种开源 ...

  4. UFLDL深度学习笔记 (五)自编码线性解码器

    UFLDL深度学习笔记 (五)自编码线性解码器 1. 基本问题 在第一篇 UFLDL深度学习笔记 (一)基本知识与稀疏自编码中讨论了激活函数为\(sigmoid\)函数的系数自编码网络,本文要讨论&q ...

  5. matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象

    一起来学matlab-matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matl ...

  6. matlab学习笔记8 基本绘图命令-特殊图形绘制

    一起来学matlab-matlab学习笔记8 基本绘图命令_3 特殊图形绘制 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等 ...

  7. 【python】numpy库和matplotlib库学习笔记

    Numpy库 numpy:科学计算包,支持N维数组运算.处理大型矩阵.成熟的广播函数库.矢量运算.线性代数.傅里叶变换.随机数生成,并可与C++/Fortran语言无缝结合.树莓派Python v3默 ...

  8. 【学习笔记】Polya定理

    笔者经多番周折终于看懂了\(\text{Burnside}\)定理和\(\text{Polya}\)定理,特来写一篇学习笔记来记录一下. 群定义 定义:群\((G,·)\)是一个集合与一个运算·所定义 ...

  9. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  10. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

随机推荐

  1. XML配置里的Bean自动装配与Bean之间的关系

    需要在<bean>的autowire属性里指定自动装配的模式 byType(根据类型自动装配) byName(根据名称自动装配) constructor(通过构造器自动装配) 名字须与属性 ...

  2. Directx11教程(21) 修正程序最小化异常bug

    原文:Directx11教程(21) 修正程序最小化异常bug       很长时间竟然没有注意到,窗口最小化时候,程序会异常,今天调试水面程序时,随意间最小化了窗口,发现程序异常了.经过调试,原来程 ...

  3. CDH5.13.1安装

    文件下载 Cloudera Manager 地址:http://archive.cloudera.com/cm5/cm/5/ 这里下载的是5.13.1的版本,https://archive.cloud ...

  4. JavaScript--缓动动画+轮播图

    上效果: 实现步骤: 最重要的是运动公式!!! <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...

  5. shell脚本批量杀死进程

    使用Ubuntu系统时常会遇到机器卡死的情况(人生最大的痛苦),所有的键都没有用,只好强制关机,我似乎对此已经'乐此不疲了'. 看到又神牛说: 可以在tty里面把相关的进程杀死,之后就正常.(到目前我 ...

  6. kubernetes1.4新特性:支持Docker新特性

    (一)背景资料 在Kubernetes1.2中这个第三方组件就是go-dockerclient,这是一个GO语言写的docker客户端,支持Dockerremote API,这个项目在https:// ...

  7. iOS:学习runtime的理解和心得

    http://www.cocoachina.com/ios/20150901/13173.html 作者:兴宇是谁 授权本站转载. Runtime是想要做好iOS开发,或者说是真正的深刻的掌握OC这门 ...

  8. UVA_494:Kindergarten Counting Game

    Language: C++ 4.8.2 #include<stdio.h> #include<ctype.h> int main(void) { int ch; int wor ...

  9. Linus 本尊也来了!为什么 KubeCon 越来越火了?

    2015年11月,第一届 KubeCon 在美国旧金山开始的时候,还只是个200人的小会议,2019年的7月,KubeCon 第二次在中国举办,就有 3500 多位云原生和开源领域工程师齐聚一堂. 连 ...

  10. @bzoj - 4298@ [ONTAK2015]Bajtocja

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定d张无向图,每张图都有n个点.一开始,在任何一张图中都没有任 ...