#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. P4576 [CQOI2013]棋盘游戏

    传送门 很显然,除非白子和黑子相邻,否则必然是黑子获胜虽然我并没有看出来 那么现在对黑子来说它要尽可能快的赢,对白子它要多苟一会儿 然后就是这个叫做对抗搜索的东西了 //minamoto #inclu ...

  2. 拦截机制中Aspect、ControllerAdvice、Interceptor、Fliter之间的区别详解

    Spring中的拦截机制,如果出现异常的话,异常的顺序是从里面到外面一步一步的进行处理,如果到了最外层都没有进行处理的话,就会由tomcat容器抛出异常. 1.过滤器:Filter :可以获得Http ...

  3. 解决:org.springframework.tuple.spel.TuplePropertyAccessor

    原来运行调试正常的项目,今天启动时报“java.lang.IllegalStateException: ApplicationEventMulticaster not initialized”错误.从 ...

  4. EditText(8)EditText中drawableRight图片的点击事件

    参考: http://stackoverflow.com/questions/3554377/handling-click-events-on-a-drawable-within-an-edittex ...

  5. DHTML_____window对象方法

    <html> <head> <meta charset="utf-8"> <title>window对象方法</title&g ...

  6. pyinstaller遇到的坑

    最近接了一个python的活,具体的就不展开,大概就是需要搭建一个服务器,接收客户端上传文件,调用算法模型,然后返回相应的数据.算法模块用的是tensorflow模块,里面一大堆东西,网上看了很多,最 ...

  7. ios基础笔试题-集锦二

    前言 下文转载自:http://www.henishuo.com/objc-interview-two/ 1.即时聊天App不会采用的网络传输方式 A. UDP B. TCP C. HTTP D. F ...

  8. leetcode375 Guess Number Higher or Lower II

    思路: dp. https://leetcode.com/problems/guess-number-higher-or-lower-ii/discuss/ 实现: class Solution { ...

  9. 了解Selenium与自动化测试第一天“云里雾里”

    以前没有搭建过Selenium自动化功能测试环境,想象中就像QTP一样,集成IDE一般简单快捷. 昨天通过博客园的一篇博友日志,才开始大概认识到Selenium的工作方式与特征: 1.插件般与浏览器结 ...

  10. SQLState: 23000

    今天登陆项目的时候,报500,日志显示如下: 解决办法是: 首先,删除序列:DROP SEQUENCE sys_log_seq 然后,新建序列:CREATE SEQUENCE sys_log_seq ...