POJ 1811 Miller_Rabin+Pollard_Rho

原创 2012年03月30日 15:23:53

赤裸裸的模板题吧

一个大数,判断是否是素数,如果是合数输出最小的因子。

大数的素数测试,随机算法Miller_Rabin测试,前提是了解费马小定理。不过对于非平方根处有疑惑,还得请教大牛

至于输出最小因子,运用Pollard_Rho即可,也算是随机算法,怎么看都是要靠RP的,至于xi=xi-1^2+c ,这个c的取法一直不理解,我用的是240,有的人是使用随机数,网上有大牛说12323速度最快?

/*
ID:cxlove
PROB:poj 1811
HINT:Miller_Rabin+Pollard_Rho
*/
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstring>
#include<cstdlib>
#define C	240
#define TIME 10
#define LL long long
using namespace std;
LL ans;
LL gcd(LL a, LL b){
	if(a==0) return 1;
	if(a<0) return gcd(-a,b);
	return b==0?a:gcd(b,a%b);
}
LL MultMod(LL a,LL b,LL n){
	a%=n;
	b%=n;
	LL ret=0;
	while(b){
		if(b&1){
			ret+=a;
			if(ret>=n) ret-=n;
		}
		a=a<<1;
		if(a>=n) a-=n;
		b=b>>1;
	}
	return ret;
}
LL PowMod(LL a,LL n,LL m){
	LL ret=1;
	a=a%m;
	while(n>=1){
		if(n&1)
			ret=MultMod(ret,a,m);
		a=MultMod(a,a,m);
		n=n>>1;
	}
	return ret;
}
bool Witness(LL a,LL n){
	LL t=0,u=n-1;
	while(!(u&1)){
		t++;
		u/=2;
	}
	LL x0=PowMod(a,u,n);
	for(int i=1;i<=t;i++){
		LL x1=MultMod(x0,x0,n);
		if(x1==1&&x0!=1&&x0!=(n-1))
			return true;
		x0=x1;
	}
	if(x0!=1)
		return true;
	return false;
}
bool Miller_Rabin(LL n,int t){
	if(n==2) return true;
	if((n&1)==0)  return false;
	srand(time(NULL));
	for(int i=0;i<t;i++){
		LL a=rand()%(n-1)+1;
		if(Witness(a,n))
			return false;
	}
	return true;
}
LL Pollard_Rho(LL n,LL c){
	LL i=1,x=rand()%n,y=x,k=2;
	while(1){
		i++;
		x=(MultMod(x,x,n)+c)%n;
		LL d=gcd(y-x,n);
		if(d!=1&&d!=n)
			return d;
		if(x==y)
			return n;
		if(i==k){
			y=x;
			k*=2;
		}
	}
}
void get_small(LL n,LL c){
	if(n==1) return;
	if(Miller_Rabin(n,TIME)){
		ans=min(n,ans);
		return ;
	}
	LL p=n;
	while(p>=n) p=Pollard_Rho(p,c--);
	get_small(p,c);
	get_small(n/p,c);
}
int main(){
	srand(time(NULL));
	LL n;
	int t;
	scanf("%d",&t);
	while(t--){		
		scanf("%I64d",&n);
		if(Miller_Rabin(n,TIME))
			printf("Prime\n");
		else{ans=n;
			get_small(n,C);
			printf("%I64d\n",ans);
		}
	}
	return 0;
}


[POJ 1811 Prime Test] Miller_Rabin + Pollard_rho 大数质数判断/质因子分解模板

[POJ 1811 Prime Test] Miller_Rabin + Pollard_rho 大数质数判断/质因子分解模板题目链接:[POJ 1811 Prime Test] 题意描述:判断N...

POJ 1811 Prime Test (miller_rabin + pollard_rho)

题目:http://poj.org/problem?id=1811 题意:判断一个数N(2 54)是否为素数,若为素数输出“Prime”,否则输出最小的素因子 分析:先用miller_rabin随...
  • w20810
  • w20810
  • 2015年02月09日 20:00
  • 320

[POJ 1811]Prime Test---Miller-Rabin算法&Pollard-rho算法

显然重点不在题而在算法。。。 就是这两个->Miller-Rabin算法;Pollard-rho算法。。。...

POJ1811 (Prime Test Pollard rho整数分解,Miller-Rabin素数测试)

Prime Test Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 30648   Ac...

poj 1811(大素数模版 miller_rabbin素数判定+pollard_rho分解)

点击打开链接 给定一个64位整数,问是否为质数,如果不是,则输出其最小因子。 miller_rabbin素数判定。若不是则pollard_rho分解。pollard_rho的作用是,参数传...

POJ 2429 GCD & LCM Inverse Pollard_Rho大数分解+Miller_Rabin

PS:图片由作者用wps制作,使用请注明链接,O(∩_∩)O谢谢! 代码如下: #include #include #include #include #include #include...

poj 2429 GCD & LCM Inverse miller_rabin素数判定和pollard_rho因数分解

题意: 给gcd(a,b)和lcm(a,b),求a+b最小的a和b。 分析: miller_rabin素数判定要用费马小定理和二次探测定理。pollard_rho因数分解算法导论上讲的又全又好,...
  • sepNINE
  • sepNINE
  • 2015年04月14日 01:27
  • 600

POJ 1811 Prime Test (Miller-Robin+Pollard_rho)

题意判断一个大数是不是素数,如果不是输出最小的质因子。思路Miller-Robin+Pollard_rho,算是这两个算法的模板题吧。 感觉这个挺玄学的。。。要注意在找质因子的时候,gcd那里y-x...

POJ 1181 大整数是否为素数以及求大整数的质因数-数论-(Miller_rabin+Pollard_rho)

题意:求一个整数是否是素数,如果不是,则输出它最小的质因数。 分析: 判断一个大整数是否为素数用Miller_rabin算法,求一个大整数的所有质因数用Pollard_rho算法。这题就是直接套模...

POJ 2429 -- miller-rabin素数测试,Pollard_rho素因子分解

转载自: http://blog.sina.com.cn/s/blog_69c3f0410100uac0.html题意 给出两个整数 m、n ( m =< n < 2^63),求出两个整数 a、b...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 1811 Miller_Rabin+Pollard_Rho
举报原因:
原因补充:

(最多只允许输入30个字)