#include <cstdio>
#include <cstring>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std; #define ll long long
const int S = ;
ll ans; ll gcd(ll a,ll b){
if(a < ) return gcd(-a , b);
if (b==) return a;
return gcd(b , a%b);
} ll multi_mod(ll a , ll b , ll k) //a*b%k
{
a %= k;
b %= k;
ll ret = ;
//这里因为是长整数,for(i=0->b)循环一个个加太耗时,需要采用这种logn复杂度的方法
while(b){
if(b & ){
ret += a;
ret %= k;
}
a <<= ;
a %= k;
b >>= ;
}
return ret;
} ll pow_mod(ll a, ll b, ll mod) //求(a^b)%mod
{
if(b == ) return a%mod;
int bit[] , t = ;
while(b){
bit[t++] = b&;
b>>=;
}
//类似矩阵快速幂
ll ret = ;
for(int i = t- ; i>= ; i--){
ret = multi_mod(ret , ret , mod);
if(bit[i]) ret = multi_mod(ret , a , mod);
}
return ret;
}
//n = x*2^t , 这里以a为底 , 检验n是否为合数
bool check(ll a , ll n , ll x , ll t)
{
ll ret = pow_mod(a , x , n);
ll last = ret; //last记录上一次的数据,保证最后结果模1时,检查到last不为n-1或1,就表示为合数
for(int i = ; i<=t ; i++){
ret = multi_mod(ret,ret,n);
if(ret == && last!= && last!=n-) return true;
last = ret;
}
//始终无法找到余数为1的结果,则表示n为合数
if(ret!=) return true;
return false;
}
//n为合数返回true
bool miller_rabin(ll n)
{
ll x = n- , t = ;
while((x&) == ){
x>>=;
t++;
}
bool flag = true; //保证最后得到的 x^2 mod p = 1 只有x=1或x=p-1两个解,才满足二次探测,否则有其他解就直接证明不是素数
if(t >= && (x&)){
//miller_robin是一种取随机测试数据的算法,这里S=20,给定20组测试数据,当然数据组数越多,正确率越大
for(int i = ; i<S ; i++){
ll a = rand()%(n-)+;
//二次探测在check中检测
if(check(a,n,x,t)){
flag = true;
break;
}
flag = false;
}
}
if(!flag || n==)
return false;
else return true;
} //长整数利用随机数找到其中一个因子
ll Pollard_rho(ll x,ll c){
ll i=,x0=rand()%x,y=x0,k=;
while (){
i++;
x0=(multi_mod(x0,x0,x)+c)%x;
ll d=gcd(y-x0,x);
if (d!=&& d!=x){
return d;
}
if (y==x0) return x;
if (i==k){
y=x0;
k+=k;
}
}
} //不断利用Pollard_rho递归来查找到n的所有素数因子
void find_factor(ll n)
{
if(!miller_rabin(n)){
ans = min(ans , n);
return;
}
ll p = n;
while(p >= n)
p = Pollard_rho(p , rand() % (n-) + );
find_factor(p);
find_factor(n / p);
} int main()
{
srand(time(NULL));
int T;
scanf("%d" , &T);
while(T--){
ll n;
scanf("%lld" , &n);
bool flag = miller_rabin(n);
if(!flag) printf("Prime\n");
else{
ans = n;
find_factor(n); printf("%lld\n" , ans);
}
}
return ;
}

POJ 1811 大整数素数判断 Miller_Rabin的更多相关文章

  1. POJ 1811 大素数判断

    数据范围很大,用米勒罗宾测试和Pollard_Rho法可以分解大数. 模板在代码中 O.O #include <iostream> #include <cstdio> #inc ...

  2. POJ 1503 大整数

    之前做的大整数,都是一位一位操作. 优化方案:压缩方案. 模板: + - *  操作符重载 #include<cstdio> #include<iostream> #inclu ...

  3. POJ 1811 Prime Test

    题意:对于一个大整数,判断是否质数,如果不是质数输出最小质因子. 解法:判断质数使用Miller-Rabin测试,分解质因子使用Pollard-Rho,Miller-Rabin测试用的红书模板,将测试 ...

  4. 数学#素数判定Miller_Rabin+大数因数分解Pollard_rho算法 POJ 1811&2429

    素数判定Miller_Rabin算法详解: http://blog.csdn.net/maxichu/article/details/45458569 大数因数分解Pollard_rho算法详解: h ...

  5. POJ 1811 Prime Test (Pollard rho 大整数分解)

    题意:给出一个N,若N为素数,输出Prime.若为合数,输出最小的素因子.思路:Pollard rho大整数分解,模板题 #include <iostream> #include < ...

  6. 【转】大素数判断和素因子分解【miller-rabin和Pollard_rho算法】

    集训队有人提到这个算法,就学习一下,如果用到可以直接贴模板,例题:POJ 1811 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/19/2646 ...

  7. POJ 1811 Prime Test( Pollard-rho整数分解经典题 )

    链接:传送门 题意:输入 n ,判断 n 是否为素数,如果是合数输出 n 的最素因子 思路:Pollard-rho经典题 /************************************** ...

  8. POJ 1001 解题报告 高精度大整数乘法模版

    题目是POJ1001 Exponentiation  虽然是小数的幂 最终还是转化为大整数的乘法 这道题要考虑的边界情况比较多 做这道题的时候,我分析了 网上的两个解题报告,发现都有错误,说明OJ对于 ...

  9. POJ C++程序设计 编程题#1 大整数的加减乘除

    编程题#4:大整数的加减乘除 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 ...

随机推荐

  1. svg image 图片无法铺满 circle 的问题解决

    引子 使用d3.js绘制了力布图后,需要在circle中绘制图片,方法如下: // 绘制图片 drawPattern(gContainer) { let that = this; let gPatte ...

  2. python re的使用

    re 正则表达式操作  本模块提供了类似于Perl的正则表达式匹配操作.要匹配的模式和字符串可以是Unicode字符串以及8位字符串. 正则表达式使用反斜杠字符('\')来表示特殊的形式或者来允许使用 ...

  3. java dom4j xml生成,解析

    1. 用Java代码生成xml文档 package com.test.dom; import java.io.FileOutputStream; import java.io.IOException; ...

  4. Java多线程(十)线程间通信 join

    若果主线程想等待子线程执行完成之后再结束,可以用join方法 join 和sleep区别 join内部有wait实现,所以当执行join方法后,当前线程的锁被释放,那么其他线程就可以调用此线程的同步方 ...

  5. 367 Valid Perfect Square 有效的完全平方数

    给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False.注意:不要使用任何内置的库函数,如  sqrt.示例 1:输入: 16输出: True示例 ...

  6. [转]How can I get my webapp's base URL in ASP.NET MVC

    本文转自:http://stackoverflow.com/questions/1288046/how-can-i-get-my-webapps-base-url-in-asp-net-mvc May ...

  7. LN : leetcode 53 Maximum Subarray

    lc 53 Maximum Subarray 53 Maximum Subarray Find the contiguous subarray within an array (containing ...

  8. 提取header头进行模块化处理

    在进行爬取网上东西的时候一般网站都做了UA的过滤,解决办法就是在代码中加入. 所以才有了本篇提取header头信息单独写成一个模块或者说是函数/类的想法,直接上示例 1.把UA头信息在浏览器中复制出来 ...

  9. Android开发笔记(2)——ViewGroup

    笔记链接:http://www.cnblogs.com/igoslly/p/6794344.html 一.ViewGroup 1.ViewGroup的意义——整合Layout多个不同View,并对其进 ...

  10. 个人软件过程(psp)需求分析

    个人软件过程(psp)需求分析 1.  引言 1.1  背景 开发项目进度计划不准确,延期经常出现,甚至无法给出一个比较准确的延迟时间,给市场推广带来很大麻烦. 2.  任务概述 2.1 目标 PSP ...