# poj 1811

#### 题解：

Miller_Rabin 算法进行素数测试 和 pollard_rho 算法进行质因素分解

#### 代码：

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <ctype.h>
#include <limits.h>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#include <set>
#include <bitset>
#include <time.h>
#define CLR(a) memset(a, 0, sizeof(a))
#define REP(i, a, b) for(ll i = a;i < b;i++)
#define REP_D(i, a, b) for(ll i = a;i <= b;i++)

typedef long long ll;

using namespace std;

ll n;

const ll S = 8;
ll mul_mod(ll a, ll b, ll c)
{
a %= c;
b %= c;
ll res = 0;
ll tmp = a;
while(b)
{
if(b&1)
{
res = res + tmp;
if(res >= c)
res -= c;
}
tmp <<= 1;
if(tmp >= c)
tmp -= c;
b >>= 1;
}
return res;
}

ll pow_mod(ll x, ll n, ll c)
{
ll res = 1;
ll tmp = x%c;
while(n)
{
if(n&1)
{
res = mul_mod(res, tmp, c);
}
n >>= 1;
tmp = mul_mod(tmp, tmp, c);
}
return res;
}

ll check(ll a, ll n, ll x, ll t)
{
ll res = pow_mod(a, x, n);
ll last = res;
for(ll i=1; i<= t; i++)
{
res = mul_mod(res, res, n);
if(res==1&&(last != 1 && last != n-1))
return 1;
last = res;
}
if(res!=1)
return 1;
return 0;
}

ll miller_rabin(ll n)
{
if(n < 2)
return 0;
if(n==2)
return 1;
if((n&1)==0)
return 0;
ll x=n-1;
ll t = 0;
while((x&1)==0)
{
t++;
x>>=1;
}
srand(time(NULL));
for(ll i=1; i<=S; i++)
{
ll a = rand()%(n-1)+1;
if(check(a, n, x, t))
{
return 0;
}
}
return 1;
}

ll gcd(ll a, ll b)
{
if(a < 0)
a= -a;
if(b < 0)
b = -b;
//a = abs(a);
//b = abs(b);
if(b==0)
return a;
return gcd(b, a%b);
}

long long pollard_rho(long long x,long long c)
{
long long i = 1, k = 2;
srand(time(NULL));
long long x0 = rand()%(x-1) + 1;
long long y = x0;
while(1)
{
i ++;
x0 = (mul_mod(x0,x0,x) + c)%x;
long long d = gcd(y - x0,x);
if( d != 1 && d != x)return d;
if(y == x0)return x;
if(i == k)
{
y = x0;
k += k;
}
}
}

ll factor[110], tot;
void findfac(ll n, ll k)
{
if(n==1)
return;
if(miller_rabin(n))
{
factor[tot++]= n;
return;
}
ll p = n;
ll c= k;
while(p >= n)
{
p = pollard_rho(p, c);
c--;
}
findfac(p, k);
findfac(n/p, k);
}

void solve()
{
if(miller_rabin(n))
{
printf("Prime\n");
return;
}
else
{
tot= 0;
findfac(n, 107);
}
sort(factor, factor + tot);
printf("%I64d\n", factor[0]);
}

int main()
{
//  freopen("2Bin.txt", "r", stdin);
//freopen("3Bout.txt", "w", stdout);
ll t;
scanf("%I64d", &t);
while(t--)
{
scanf("%I64d", &n);
solve();
}
return 0;
}

• 本文已收录于以下专栏：

Pollard_rho算法模板

## poj 1811 Prime Test（大素数判定）

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

## SPOJ 1811-LCS POJ 2774

SAM表示真的很难艹 SPOJ LCS 题目链接 推荐学习的博客博客地址 题意：求两个字符串的最长公共子串 解法：时间限制及其的严格，SAM可以在线性时间内解决 性...

## POJ－1811－Prime Test

ACM模版题目链接POJ 1811 Prime Test题解随机素数测试和大数分解两个核心算法。随机素数测试算法需要进行8～10次测试的样子，可以尽可能的保证结果的正确性。代码#include usi...
• f_zyj
• 2016-07-02 22:19
• 201

## poj 1811 随机素数和大数分解（模板）

Sample Input 2 5 10 Sample Output Prime 2 模板学习： 判断是否是素数，数据很大，所以用miller，不是的话再用pollard rho分解 ...

## POJ 1811 Prime Test（大素数判断+大合数素因子分解）

举报原因： 您举报文章：深度学习：神经网络中的前向传播和反向传播算法推导 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)