首页 > 代码库 > POJ1811 Prime Test(miller素数判断&&pollar_rho大数分解)

POJ1811 Prime Test(miller素数判断&&pollar_rho大数分解)

http://blog.csdn.net/shiyuankongbu/article/details/9202373

发现自己原来的那份模板是有问题的,而且竟然找不出是哪里的问题,所以就用了上面的链接上的一份代码,下面只是寄存一下这份代码,以后打印出来当模板好了。

#pragma warning(disable:4996)#include <iostream>  #include <cstring>  #include <algorithm>  #include <cmath>  #include <map>  #include <cstdlib>  #include <cstdio>  using namespace std;#define Times 10  map<long long, int>m;long long mi;long long random(long long n){	return ((double)rand() / RAND_MAX*n + 0.5);}long long multi(long long a, long long b, long long mod){	long long ans = 0;	while (b){		if (b & 1) ans = (ans + a) % mod;		b >>= 1;		a = (a << 1) % mod;	}	return ans;}long long Pow(long long a, long long b, long long mod){	long long ans = 1;	while (b){		if (b & 1) ans = multi(ans, a, mod);		b >>= 1;		a = multi(a, a, mod);	}	return ans;}bool witness(long long a, long long n){	long long d = n - 1;	while (!(d & 1))		d >>= 1;	long long t = Pow(a, d, n);	while (d != n - 1 && t != 1 && t != n - 1)	{		t = multi(t, t, n);		d <<= 1;	}	return t == n - 1 || d & 1;}bool miller_rabin(long long n){	if (n == 2)		return true;	if (n<2 || !(n & 1))		return false;	for (int i = 1; i <= Times; i++)	{		long long a = random(n - 2) + 1;		if (!witness(a, n))			return false;	}	return true;}long long gcd(long long a, long long b){	return a&&b ? gcd(b, a%b) : a + b;}long long pollard_rho(long long n, int c){	long long x, y, d, i = 1, k = 2;	x = random(n - 2) + 1;	y = x;	while (1){		i++;		x = (multi(x, x, n) + c) % n;		d = gcd(y - x, n);		if (1<d&&d<n)			return d;		if (y == x)			return n;		if (i == k){			y = x;			k <<= 1;		}	}}void find(long long n, int c){	if (n == 1)		return;	if (miller_rabin(n)){		m[n]++;  		mi = min(mi, n);		return;	}	long long p = n;	while (p >= n)		p = pollard_rho(p, c--);	find(p, c);	find(n / p, c);}int main(){	int t;	scanf("%d", &t);	while (t--)	{		long long n;		scanf("%lld", &n);		mi = n;		if (miller_rabin(n))			cout << "Prime" << endl;		else		{			find(n, 12312);			cout << mi << endl;		}	}	return 0;}