POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】
Memory Limit: 65536K
Accepted: 7392
Description
Given a big integer number, you are required to find out whether it's a prime number.
Input
The first line contains the number of test cases T (1 <= T <= 20 ), then the following T lines each contains an integer number N (2 <= N < 2^54).
Output
For each test case, if N is a prime number, output a line containing the word "Prime", otherwise, output a line containing the smallest prime factor of N.
Sample Input
2
5
10
Sample Output
Prime
2
Source
POJ Monthly
题目大意:T组数据,对于输入的N,若N为素数,输出"Prime",否则输出N的最小素因子
思路:由于N的规模为2^54所以普通的素性推断果断过不了。
要用Miller Rabin素数測试来做。
而若N不为素数。则须要对N进行素因子分解。由于N为大数,考虑用Pollar Rho整数分解来做。
- #include<stdio.h>
- #include<stdlib.h>
- #include<time.h>
- #include<math.h>
- #define MAX_VAL (pow(2.0,60))
- //miller_rabbin素性測试
- //__int64 mod_mul(__int64 x,__int64 y,__int64 mo)
- //{
- // __int64 t;
- // x %= mo;
- // for(t = 0; y; x = (x<<1)%mo,y>>=1)
- // if(y & 1)
- // t = (t+x) %mo;
- //
- // return t;
- //}
- __int64 mod_mul(__int64 x,__int64 y,__int64 mo)
- {
- __int64 t,T,a,b,c,d,e,f,g,h,v,ans;
- T = (__int64)(sqrt(double(mo)+0.5));
- t = T*T - mo;
- a = x / T;
- b = x % T;
- c = y / T;
- d = y % T;
- e = a*c / T;
- f = a*c % T;
- v = ((a*d+b*c)%mo + e*t) % mo;
- g = v / T;
- h = v % T;
- ans = (((f+g)*t%mo + b*d)% mo + h*T)%mo;
- while(ans < 0)
- ans += mo;
- return ans;
- }
- __int64 mod_exp(__int64 num,__int64 t,__int64 mo)
- {
- __int64 ret = 1, temp = num % mo;
- for(; t; t >>=1,temp=mod_mul(temp,temp,mo))
- if(t & 1)
- ret = mod_mul(ret,temp,mo);
- return ret;
- }
- bool miller_rabbin(__int64 n)
- {
- if(n == 2)
- return true;
- if(n < 2 || !(n&1))
- return false;
- int t = 0;
- __int64 a,x,y,u = n-1;
- while((u & 1) == 0)
- {
- t++;
- u >>= 1;
- }
- for(int i = 0; i < 50; i++)
- {
- a = rand() % (n-1)+1;
- x = mod_exp(a,u,n);
- for(int j = 0; j < t; j++)
- {
- y = mod_mul(x,x,n);
- if(y == 1 && x != 1 && x != n-1)
- return false;
- x = y;
- }
- if(x != 1)
- return false;
- }
- return true;
- }
- //PollarRho大整数因子分解
- __int64 minFactor;
- __int64 gcd(__int64 a,__int64 b)
- {
- if(b == 0)
- return a;
- return gcd(b, a % b);
- }
- __int64 PollarRho(__int64 n, int c)
- {
- int i = 1;
- srand(time(NULL));
- __int64 x = rand() % n;
- __int64 y = x;
- int k = 2;
- while(true)
- {
- i++;
- x = (mod_exp(x,2,n) + c) % n;
- __int64 d = gcd(y-x,n);
- if(1 < d && d < n)
- return d;
- if(y == x)
- return n;
- if(i == k)
- {
- y = x;
- k *= 2;
- }
- }
- }
- void getSmallest(__int64 n, int c)
- {
- if(n == 1)
- return;
- if(miller_rabbin(n))
- {
- if(n < minFactor)
- minFactor = n;
- return;
- }
- __int64 val = n;
- while(val == n)
- val = PollarRho(n,c--);
- getSmallest(val,c);
- getSmallest(n/val,c);
- }
- int main()
- {
- int T;
- __int64 n;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%I64d",&n);
- minFactor = MAX_VAL;
- if(miller_rabbin(n))
- printf("Prime\n");
- else
- {
- getSmallest(n,200);
- printf("%I64d\n",minFactor);
- }
- }
- return 0;
- }
POJ1811_Prime Test【Miller Rabin素数测试】【Pollar Rho整数分解】的更多相关文章
- POJ1811_Prime Test【Miller Rabin素数測试】【Pollar Rho整数分解】
Prime Test Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 29193 Accepted: 7392 Case Time ...
- HDU1164_Eddy's research I【Miller Rabin素数测试】【Pollar Rho整数分解】
Eddy's research I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- POJ2429_GCD & LCM Inverse【Miller Rabin素数測试】【Pollar Rho整数分解】
GCD & LCM Inverse Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9756Accepted: 1819 ...
- Miller Rabin素数检测与Pollard Rho算法
一些前置知识可以看一下我的联赛前数学知识 如何判断一个数是否为质数 方法一:试除法 扫描\(2\sim \sqrt{n}\)之间的所有整数,依次检查它们能否整除\(n\),若都不能整除,则\(n\)是 ...
- Miller-Rabbin 素性测试 和 Pollard_rho整数分解
今天学习一下Miller-Rabbin 素性测试 和 Pollard_rho整数分解. 两者都是概率算法. Miller_Rabbin素性测试是对简单伪素数pseudoprime测试的改进. (ps ...
- Miller Rabin素数检测
#include<iostream> #include<cstdio> #include<queue> #include<cstring> #inclu ...
- HDU 3864 D_num Miller Rabin 质数推断+Pollard Rho大整数分解
链接:http://acm.hdu.edu.cn/showproblem.php? pid=3864 题意:给出一个数N(1<=N<10^18).假设N仅仅有四个约数.就输出除1外的三个约 ...
- POJ 2429 GCD & LCM Inverse (Pollard rho整数分解+dfs枚举)
题意:给出a和b的gcd和lcm,让你求a和b.按升序输出a和b.若有多组满足条件的a和b,那么输出a+b最小的.思路:lcm=a*b/gcd lcm/gcd=a/gcd*b/gcd 可知a/gc ...
- Miller Rabbin素数测试
步骤 ①先写快速幂取模函数 ②MR算法开始 (1)传入两个参数一个是底数一个是n也就是幂数,如果n是一个合数那么可以判定,这个数一定不是素数 (2)然后开始寻找一个奇数的n去计算,如果最后满足a^d% ...
随机推荐
- RSA加密前言
RSA:非对称加密,近期因为工作需要需要实现了一个RSA加密方案.查阅文档无数,主要是通过看他们代码及其引用他人的代码基本实现了跨平台的RSA方案.现在唯一的缺陷是加解密花费的时间太多,下周会把加解密 ...
- Android面向HTTP协议发送get请求
/** * 採用get请求的方式 * * @param username * @param password * @return null表示求得的路径有问题,text返回请求得到的数据 */ pub ...
- Android获取Activity(应用)的执行状态及其它信息
检測某Activity是否在当前Task的栈顶 public static boolean isTopActivy(String cmdName, Context context) { Activit ...
- POJ2828 Buy Tickets 【线段树】+【单点更新】+【逆序】
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 12296 Accepted: 6071 Desc ...
- lua的table库中经常使用的函数
lua提供了一些辅助函数来操作table. 比如,从list中insert和remove元素,对array的元素进行sort.或者concatenate数组中的全部strings.以下就具体地解说这些 ...
- 让你提前知道软件开发(22):shell脚本文件操作
文章1部分 再了解C语言 shell脚本中的文件操作 [文章摘要] 编写shell脚本时,经常会涉及到对文件的操作,比方从文件里读取一行数据.向文件追加一行数据等. 完毕文件读写操作的方法有非常多,了 ...
- SimpleWiFi模块评估板
SimpleWiFi评估套件,发货清单: 1.评估版一块. 2.专用WiFi天线一根. 3.配套电源一个. 单模块 是60元,链接如下: http://item.taobao.com/i ...
- poj1269(直线交点)
传送门:Intersecting Lines 题意:给出N组直线,每组2条直线,求出直线是否相交.如果共线则输出LINE,相交则输入点坐标,否则输出NONE. 分析:模板裸题,直接上模板... #in ...
- acdream 1222 Quantization Problem [dp]
称号:acdream 1222 Quantization Problem 题意:给出一个序列 a ,然后给出一个 n * m 的矩阵,让你从这个矩阵中选出一个序列k,使得sum(abs(ki - ai ...
- loj1245(数学)
传送门:Harmonic Number (II) 题意:求sum=n/1+n/2+n/3+...+n/n.(n<2^31) 分析:在一定的区间内n/i的值是一定的,因此要跳过这段区间来加速求解. ...