P4718 【模板】Pollard-Rho算法
题面
传送门
题解
题解
太神仙了学不来orz
//minamoto
#include<bits/stdc++.h>
#define R register
#define ll long long
#define dd long double
#define fp(i,a,b) for(int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
const int base[]={2,3,7,61,24251};
inline ll mul(R ll x,R ll y,R ll P){R ll k=(dd)x*y/P;k=x*y-k*P;return k<0?k+P:k;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
inline ll g(R ll x,R ll n,R ll c){x=mul(x,x,n)+c;return x>n?x-n:x;}
inline ll Abs(R ll x){return x<0?-x:x;}
ll ksm(R ll x,R ll y,R ll P){R ll res=1;for(;y;y>>=1,x=mul(x,x,P))if(y&1)res=mul(res,x,P);return res;
}
bool miller(ll x){if(x<2||x==46856248255981ll)return false;if(x==2||x==3||x==7||x==61||x==24251)return true;if(!(x&1)||!(x%3)||!(x%61)||!(x%24251))return false;ll p=x-1;int t=0,j;while(!(p&1))p>>=1,++t;fp(i,0,4){if(base[i]>x)break;ll res=ksm(base[i],p,x);if(res==1||res==x-1)continue;for(j=1;j<=t;++j){res=mul(res,res,x);if(res==x-1)break;}if(j>t)return false;}return true;
}
const int M=(1<<7)-1;
ll rho(ll n){if(!(n&1))return 2;if(!(n%3))return 3;ll x=0,y=x,t=1,q=1,c=rand()%(n-1)+1;for(R int k=2;;k<<=1,y=x,q=1){fp(i,1,k){x=g(x,n,c);q=mul(q,Abs(x-y),n);if(!(i&M)){t=gcd(q,n);if(t>1)break;}}if(t>1||(t=gcd(q,n))>1)break;}return t;
}
ll res;
void find(ll x){if(x==1||x<=res)return;if(miller(x))return res=x,void();ll p=x;while(p==x)p=rho(x);while(x%p==0)x/=p;find(p),find(x);
}
int main(){srand(time(0));
// freopen("testdata.in","r",stdin);int T;ll n;scanf("%d",&T);while(T--){scanf("%lld",&n),res=0,find(n);res==n?printf("Prime\n"):printf("%d\n",res);}return 0;
}
转载于:https://www.cnblogs.com/bztMinamoto/p/10432661.html
P4718 【模板】Pollard-Rho算法相关推荐
- 大整数分解——Pollard Rho算法
延续上一篇,这次来讲一讲大整数分解算法的应用. 要解决的问题很简单,对一个整数进行分解质因数. 首先还是效率非常低的暴力算法,相信大家都会,不多提. 和上次一样,当数达到非常大的时候,分解将变得非常困 ...
- c语言用rho函数求复数模长,Pollard Rho 算法简介
$\text{update 2019.8.18}$ 由于本人将大部分精力花在了cnblogs上,而不是洛谷博客,评论区提出的一些问题直到今天才解决. 下面给出的Pollard Rho函数已给出散点图. ...
- BZOJ 5330 Luogu P4607 [SDOI2018]反回文串 (莫比乌斯反演、Pollard Rho算法)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=5330 (Luogu) https://www.luogu.org/prob ...
- 因数分解 Pollard rho
因数分解 Pollard rho 算法思路 随机生成两个数a,ba,ba,b,然后求gcd(n,a−b)\gcd\pod{n,a-b}gcd(n,a−b),如果其值不为111,则这个数就是nnn的一 ...
- 素数判定质因数分解(数论)(Miller Rabin)(Pollard Rho)
太玄学了! 我真的被概率的魅力折服了.此前我认为1便是1,0.9999999999-便是0.9999999999-. 但实际上它们有着千丝万缕的关系. 试想,如果一件事发生的概率是0.99999999 ...
- 洛谷P4718 【模板】Pollard-Rho算法
虽然很久以前就听说过PR算法,但前几天第一次打. 首先miller rabin判断素数,不在复杂度瓶颈. pollard rho倍增环长,复杂度是\(O(n^{\frac{1}{4}} log n)\ ...
- 【快速因数分解】Pollard's Rho 算法
算法目的 给一个数n,快速提取n的一个因数. 算法根据:生日悖论 讲生日悖论之前,先看一个东西. 给出[1-1000]的数,从中任意选出一个数为k的概率是110001\over 100010001. ...
- 64位以内Rabin-Miller 强伪素数测试和Pollard rho 因数分解解析
在求解POJ1811题Prime Test中应用到的两个重要算法是Rabin-Miller强伪素数测试和Pollard r因数分解算法.前者可以在的时间内以很高的成功概率判断一个整数是否是素数.后者可 ...
- 我的所有优质博客全部开源啦(我自己原创的《ACM模板》《算法全家桶》《算法竞赛中的初等数论》 PDF免费下载)
你好呀ヾ(≧▽≦*)o 我是繁凡さん 这两年来我写了很多长篇文章,主要涉及数据结构,算法,程序设计竞赛,数学,计算几何等方面的内容: <数据结构>C语言版(清华严蔚敏考研版) 全书知识梳理 ...
- 整数的素因子分解:Pollard rho method
参考: 1.CLRS<算法导论> 2.http://www.csh.rit.edu/~pat/math/quickies/rho/#algorithm Pollard rho方法是随机算法 ...
最新文章
- Python将JSON格式数据转换为SQL语句以便导入MySQL数据库
- android语法高亮编辑器,HighlightTextEditor
- linux登录主机命令,linux w命令查询已登录主机的用户信息
- Nokia Imaging SDK滤镜使用入门
- 编程语言EF速度测试(4):nsieve-bits
- LINUX下用C判断一个进程是否活着
- 3,graph语法学习
- 传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(day01~day10)
- Qt中添加鼠标右键菜单
- python做三维图片挑战眼力_查找「儿童大家来找茬图片」安卓应用 - 豌豆荚
- Unity - Projector - 实时[假]阴影
- ISBN(国际标准书号)的校验
- App inventor打地鼠
- PPPD chat中文帮助
- 如何快速查询SCI期刊JCR和ISO缩写?
- 走向Web渗透工程师
- 闲人闲谈PS之十七——系统切换带来的冲击
- 认认真真推荐10个顶级技术公众号
- Nutanix荣膺 “超融合基础架构领导者” 称号
- 电机 输送机 机械手 提升机 发酵罐 减速机 破碎机
热门文章
- 运行mapreduce程序yarn的web端显示进度
- c 语言 while break,26 C 语言中的break和continue - C 语言基础教程
- db2 linux 平台下迁移_Linux 下的 DB2数据库的迁移
- 伺服电机停的时候会冲一下_造成伺服电机抖动的原因竟然是它!内附解决方法...
- 霍纳法树形流图中处理机p个数_处理机管理(进程管理)
- matlab能力处理,书+程序《MATLAB图像处理:能力提高与应用案例》赵小川
- jquery实现页面提示,数据正在加载中。(
- 1151压力变送器型号_日本进口横河EJA530E压力变送器型号解读!
- C语言: GDB调试技术(一)
- LeetCode - Easy - 118. Pascal‘s Triangle