BZOJ 3667 Pollard-rho &Miller-Rabin
论O(1)快速乘和O(logn)快速乘的差距….
//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
ll shai[10]={2,3,5,7,11,13,17,19,23,29};
ll mul(ll a,ll b,ll p){
ll d=((long double)a/p*b+1e-8);
ll res=a*b-d*p;
res=res<0?res+p:res;
return res;
}
ll pow(ll x,ll y,ll mod){
x%=mod;ll res=1;
while(y){
if(y&1)res=mul(res,x,mod);
x=mul(x,x,mod),y>>=1;
}return res;
}
bool check(ll a,ll n,ll r,int s){
ll x=pow(a,r,n),pre=x;
for(int i=1;i<=s;i++){
x=mul(x,x,n);
if(x==1&&pre!=1&&pre!=n-1)return 0;
pre=x;
}return x==1;
}
bool miller_rabin(ll n){
if(n<=1)return 0;
ll r=n-1,s=0;
while(!(r&1))r>>=1,s++;
for(int i=0;i<10;i++){
if(shai[i]==n)return 1;
if(!check(shai[i],n,r,s))return 0;
}return 1;
}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
ll prime_factor(ll n,ll c){
ll k=2,x=rand()%n,y=x,p=1;
for(int i=1;p==1;i++){
x=(mul(x,x,n)+c)%n;
p=gcd(abs(x-y),n);
if(i==k)y=x,k<<=1;
}return p;
}
ll ans,xx;int cases;
void pollard_rho(ll n){
if(n==1)return;
if(miller_rabin(n)){ans=max(ans,n);return;}
ll p=n;
while(p==n)p=prime_factor(n,rand()%(n-1));
pollard_rho(p),pollard_rho(n/p);
}
int main(){
scanf("%d",&cases);
while(cases--){
ans=0,scanf("%lld",&xx),pollard_rho(xx);
if(ans!=xx)printf("%lld\n",ans);
else puts("Prime");
}
}
//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
typedef unsigned long long ll;
ll shai[10]={2,3,5,7,11,13,17,19,23,29};
ll mul(ll x,ll y,ll mod){
x%=mod;ll res=0;
while(y){
if(y&1)res=(res+x)%mod;
x=(x+x)%mod;
y>>=1;
}return res;
}
ll pow(ll x,ll y,ll mod){
x%=mod;ll res=1;
while(y){
if(y&1)res=mul(res,x,mod);
x=mul(x,x,mod),y>>=1;
}return res;
}
bool check(ll a,ll n,ll r,int s){
ll x=pow(a,r,n),pre=x;
for(int i=1;i<=s;i++){
x=mul(x,x,n);
if(x==1&&pre!=1&&pre!=n-1)return 0;
pre=x;
}return x==1;
}
bool miller_rabin(ll n){
if(n<=1)return 0;
ll r=n-1,s=0;
while(!(r&1))r>>=1,s++;
for(int i=0;i<10;i++){
if(shai[i]==n)return 1;
if(!check(shai[i],n,r,s))return 0;
}return 1;
}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
ll prime_factor(ll n,ll c){
ll k=2,x=rand()%n,y=x,p=1;
for(int i=1;p==1;i++){
x=(mul(x,x,n)+c)%n;
p=gcd(abs((long long)x-(long long)y),(long long)n);
if(i==k)y=x,k<<=1;
}return p;
}
ll ans,xx;int cases;
void pollard_rho(ll n){
if(n==1)return;
if(miller_rabin(n)){ans=max(ans,n);return;}
ll p=n;
while(p==n)p=prime_factor(n,rand()%(n-1));
pollard_rho(p),pollard_rho(n/p);
}
int main(){
scanf("%d",&cases);
while(cases--){
ans=0,scanf("%llu",&xx),pollard_rho(xx);
if(ans!=xx)printf("%llu\n",ans);
else puts("Prime");
}
}
BZOJ 3667 Pollard-rho &Miller-Rabin的更多相关文章
- poj 1811 Pallor Rho +Miller Rabin
/* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Pa ...
- Pollard Rho算法浅谈
Pollard Rho介绍 Pollard Rho算法是Pollard[1]在1975年[2]发明的一种将大整数因数分解的算法 其中Pollard来源于发明者Pollard的姓,Rho则来自内部伪随机 ...
- Pollard rho算法+Miller Rabin算法 BZOJ 3668 Rabin-Miller算法
BZOJ 3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1044 Solved: 322[Submit][ ...
- POJ2429 - GCD & LCM Inverse(Miller–Rabin+Pollard's rho)
题目大意 给定两个数a,b的GCD和LCM,要求你求出a+b最小的a,b 题解 GCD(a,b)=G GCD(a/G,b/G)=1 LCM(a/G,b/G)=a/G*b/G=a*b/G^2=L/G 这 ...
- POJ1811- Prime Test(Miller–Rabin+Pollard's rho)
题目大意 给你一个非常大的整数,判断它是不是素数,如果不是则输出它的最小的因子 题解 看了一整天<初等数论及其应用>相关部分,终于把Miller–Rabin和Pollard's rho这两 ...
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解
链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...
- POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- POJ2429_GCD & LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...
- POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
随机推荐
- webpack打包大概流程
webpack 步骤 1. 新建一个webpack.config.prod.js 2. 压缩bundle.js和index.html //设置为生产环境 new webpack.DefinePlugi ...
- hdu2686/hdu3376 最小费用流最大流 拆点
虽然题目求的是最大费用,但是我们可以通过转换就变为最小费用.用一个比最大值更的数与每个数的差作为费用值.最后处理回来就i可以了.有些人用直接每个值都乘以-1,这样更简单. 做这题,我对为什么不拆点就会 ...
- preparedStatement平台:
public class cs{ public static void main(String[] args){ try{ class.forName("com.mysql.jdbc.Dri ...
- <转>Socket编程——基础介绍
最近系统的看了下unix网络编程的一些内容,对socket的理解有了进一步的加深,在看APUE的时候,那会儿看socket上面介绍的比较少,只是模糊的懂了如何去写一个简单的TCP服务端和客户端,对其中 ...
- linux笔记常用命令
LINUX成长日记 1.本人工作实例:(将一台服务器的数据库复制到另外一台服务器上) scp -r -P 8351 /bak_mysql/sz_b2b2c201705180200.sql root@1 ...
- Win 10安装mysql以及常见问题总结
一.mysql免安装版本配置1.从官网下载安装包,解压后,在电脑属性环境变量的path中配置bin的路径 2.配置my.ini [mysql] # 设置mysql客户端默认字符集 default-ch ...
- [luogu3237 HNOI2014] 米特运输 (树形dp)
传送门 Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题. D星上有N个城市,我们将其顺序编号为1到N, ...
- php中文乱码处理方法
昨天在本地环境创建了一个文件,文件编码是UTF-8格式,打印一个简单的语句竟然出现了中文乱码,折腾了很久,才找到了原因. 乱码问题 昨天写了一个很简单的php输出中文页面,但是出现了乱码问题,第一反应 ...
- 为DK2应用程序迁移到Oculus CV1做好准备!
为DK2应用程序迁移到Oculus CV1做好准备! 本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/arti ...
- 【codeforces 799B】T-shirt buying
[题目链接]:http://codeforces.com/contest/799/problem/B [题意] 告诉你每个人喜欢的衣服的颜色; 然后告诉你每件衣服的正面和背面的颜色以及它的价格; 只要 ...