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;
}
P4718 【模板】Pollard-Rho算法的更多相关文章
- Pollard Rho算法浅谈
Pollard Rho介绍 Pollard Rho算法是Pollard[1]在1975年[2]发明的一种将大整数因数分解的算法 其中Pollard来源于发明者Pollard的姓,Rho则来自内部伪随机 ...
- Pollard Rho 算法简介
\(\text{update 2019.8.18}\) 由于本人将大部分精力花在了cnblogs上,而不是洛谷博客,评论区提出的一些问题直到今天才解决. 下面给出的Pollard Rho函数已给出散点 ...
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- 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 ...
- 大整数分解质因数(Pollard rho算法)
#include <iostream> #include <cstring> #include <cstdlib> #include <stdio.h> ...
- BZOJ 5330 Luogu P4607 [SDOI2018]反回文串 (莫比乌斯反演、Pollard Rho算法)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=5330 (Luogu) https://www.luogu.org/prob ...
- 【快速因数分解】Pollard's Rho 算法
Pollard-Rho 是一个很神奇的算法,用于在 $O(n^{\frac{1}4}) $的期望时间复杂度内计算合数 n 的某个非平凡因子(除了1和它本身以外能整除它的数).事书上给出的复杂度是 \( ...
- Miller-Rabin 素性测试 与 Pollard Rho 大整数分解
\(\\\) Miller-Rabin 素性测试 考虑如何检验一个数字是否为素数. 经典的试除法复杂度 \(O(\sqrt N)\) 适用于询问 \(N\le 10^{16}\) 的时候. 如果我们要 ...
- Pollard Rho因子分解算法
有一类问题,要求我们将一个正整数x,分解为两个非平凡因子(平凡因子为1与x)的乘积x=ab. 显然我们需要先检测x是否为素数(如果是素数将无解),可以使用Miller-Rabin算法来进行测试. Po ...
随机推荐
- (转)C# -- 扩展方法的应用(Extension Methods)
本文转载自:http://blog.csdn.net/zxz414644665/article/details/9793205 当你有下面这样一个需求的时候,扩展方法就会起到作用:在项目中,类A需要添 ...
- boot asio 非阻塞同步编程---非阻塞的accept和receive。
boot asio 非阻塞同步编程---非阻塞的accept和receive. 客户端编程: #include<boost/timer.hpp> #include <iostream ...
- java流的操作步骤、、
在java中使用IO操作必须按照以下的步骤完成: 使用File找到一个文件 使用字节流或字符流的子类为OutputStream.InputStream.Writer.Reader进行实例化操 作 ...
- 分治思想的应用:C++实现快速排序和随机化的快速排序
分治思想的应用:C++实现快速排序和随机化的快速排序 原创 2014年09月08日 14:04:49 标签: 快速排序 / 随机化快速排序 / 排序算法 / 数据结构 947 1. 快速排序时冒泡排序 ...
- python-xlrd 实现excel 导入数据
首先安装 xlrd 两种方式: 1.wheel 方式 安装: 首先要下载 wheel :
- JCTF 2014(Reverse)
小菜一碟: 点击下载附件 下载的附件没有后缀,用c32打开看看 是apk文件,用Smali2JavaUI打开 程序把输入框的字符串反转,然后进行MD5加密,最后进行base64编码,与NzU2ZDJm ...
- Windows下.svn文件夹的最简易删除方法(附linux)
如果想删除Windows下的.svn文件夹,通过手动删除的渠道是最麻烦的,因为每个文件夹下面都存在这样的文件.下面是一个好办法:建立一个文本文件,取名为kill-svn-folders.reg(扩展名 ...
- 【Python环境】matplotlib - 2D 与 3D 图的绘制
2015-10-30数据科学自媒体 类MATLAB API 最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数. 让我们加载它: from pylab import ...
- java代码连接数据库
/** * * @author lidelin 2017-03-03 * 连接数据库简单实例 * 准备工作:建项目工程,例如:test-jdbc;导入odbc6.jar */ public class ...
- C语言学习笔记--条件编译
C语言中的条件编译的行为类似于 C 语言中的 if…else…,是预编译指示命令,用于控制是否编译某段代码 . 1.条件编译的本质 (1)预编译器根据条件编译指令有选择的删除代码 (2)编译器不知道代 ...