【数论】poj1811Prime Test
来源:互联网 发布:攻城掠地控号手软件 编辑:程序博客网 时间:2024/06/06 00:57
题目链接
题目描述:对一个n
由于n太大,我一开始想到用Miller_Rabin(一个判断大整数是否为素数的算法)判断是否为素数。之后再暴力求解最小质因数。然而无限TLE……
之后看题解才知道有Pollard_rho算法的存在(一个用于算大整数质因数分解的算法)。该算法也要利用Miller_Rabin算法。
Pollard_rho原理:
生成两个数a、b,令
步骤:选取一个小的随机数
附Miller_Rabin算法原理 链接在此
#include <iostream>#include <cstdio>#include <ctime>#include <algorithm>#define LL long long int#define min(a,b) ((a)<(b)?(a):(b))#define abs(a) ((a)>0?(a):(-(a)))using namespace std;LL n ,factor[10050] ,tot ;LL mul(LL a,LL pos,LL p){ LL ans=0 ; a%=p ,pos%=p ; while(pos) { if(pos&1) { ans+=a; if(ans>=p)ans-=p; } a<<=1; if(a>=p)a-=p; pos>>=1; } return ans;}LL power(LL a,LL pos,LL p){ LL ans=1; while(pos>0) { if(pos&1) ans=mul(ans,a,p); a=mul(a,a,p); pos>>=1; } return ans;}bool Miller_Rabin(LL n){ if(n==2||n==3)return 1; if(n<2||!(n&1))return 0; LL code=0 ,k=n-1 ; while(!(k&1)) { k>>=1; ++code; } LL a ,temp ,tmp ; for(int i=1;i<21;++i) { a=rand()%(n-1)+1; temp=power(a,k,n); tmp=temp; for(int j=0;j<code;++j) { temp=mul(temp,temp,n); if(temp==1) { if(tmp!=1&&tmp!=n-1) return 0; break; } tmp=temp; } if(temp!=1) return 0; } return 1;}LL gcd(LL a,LL b){ if(!b) return a; return gcd(b,a%b);}LL Pollard_rho(LL a,LL b){ LL code=1 ,k=2 ,x0=rand()%a ,y=x0 ,d ; while(1) { ++code; x0=(mul(x0,x0,a)+b)%a; d=gcd(abs(y-x0),a); if(d!=1&&d!=a) return d; if(y==x0) return a; if(code==k) y=x0 ,k+=k ; }}void dfs(LL n){ if(Miller_Rabin(n)) { factor[++tot]=n; return; } LL p=n; while(p>=n) p=Pollard_rho(p,rand()%(n-1)+1); dfs(p); dfs(n/p);}int main(){ //srand(time(NULL)); int T ; scanf("%d",&T); LL ans ; while(T--) { scanf("%I64d",&n); if(Miller_Rabin(n)) puts("Prime"); else { tot=0; dfs(n); ans=n; for(int i=1;i<=tot;++i) ans=min(ans,factor[i]); printf("%I64d\n",ans); } } return 0;}
0 0
- 【数论】poj1811Prime Test
- test 数列(数论)
- poj1811 Prime Test 数论专题
- poj 1811 Prime Test(数论:大素数判定-分解)
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论
- 数论 ?
- 数论
- 数论
- View及Viewgroup
- Java反射机制
- 剑指Offer面试题17(Java版):合并两个排序的链表
- HDU 2017-字符串统计
- priority_queue使用
- 【数论】poj1811Prime Test
- Java学习之路:不走弯路,就是捷径
- [记录]学习<<QT学习之路2>>第五天
- Swift对于可选类型(Optionals)讲解不错的文章
- 黑马程序员------OC block(代码块)和protocol(协议)
- 每天一个小知识点20(面试可能问到的兼容问题)
- 测试连接MySQL数据库时遇到的一些问题
- HDU 4115 Eliminate the Conflict(2-SAT)
- Best Time to Buy and Sell Stock III