之前学的都是假的

%%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. JS对HTML实体字符转义和反转义

    一.名词解释 HTML实体字符: 由于在HTML中有些符号是预留的,比如在html中不能直接使用尖括号(‘<’或‘>’),会被误认为标签符号.所以需要通过HTML实体字符去进行替换: HT ...

  2. OFBiz 16.11.03的直接部署、eclipse部署和IDEA部署

    一.在OFBiz官网下载最新的发行版本,也就是16.11.03版本. 下载地址:http://ofbiz.apache.org/download.html   点击页面Apache OFBiz 16. ...

  3. Directx11教程(13) D3D11管线(1)

    原文:Directx11教程(13) D3D11管线(1)       从本篇教程开始,我们暂停代码的学习,先来了解一下D3D11的管线,这些管线不涉及具体的硬件,而是着重于理解能够支持D3D11的管 ...

  4. Python2 生成器 简介

    1. A generator: provide a kind of function that can return an intermediate result ("the next va ...

  5. PHP:测试SQL注入以及防止SQL注入

    在写登录注册的时候发现了SQL和JS注入这个危害网站的用户举动: 测试方法: SQL注入: 先来做一个测试: 用户名:’ or 1 # 密码:随便写8位以上 验证码:写正确 好吧,就那么简单就进去了: ...

  6. js赋值符号“=”的小例子

    var obj1={x:5}; var obj2=obj1; obj1.a=obj1={x:6}; console.log(obj1.a); console.log(obj2.a); 为什么obj1. ...

  7. 2017校赛 问题 F: 懒人得多动脑

    题目描述 小D的家A和学校B都恰好在以点F为焦点的双曲线上,而小D每日所需的生活水源在一条平行该双曲线准线的直线上,设它的值为v.大家都知道,每天都是要喝水的,但是小D有点懒,他希望自己能在去上学或者 ...

  8. request header....

    root@xxx# curl -i --get --include 'http://ali-barcode.showapi.com/barcode?code=6938166920785' -H 'Au ...

  9. hdu 1003 hdu 1231 最大连续子序列【dp】

    HDU1003 HDU1231 题意自明.可能是真的进步了点,记得刚开始研究这个问题时还想了好长时间,hdu 1231还手推了很长时间,今天重新写干净利落就AC了. #include<iostr ...

  10. oralce CUBE

    select id,area,stu_type,sum(score) score from students group by cube(id,area,stu_type) order by id,a ...