poj 1811 Prime Test【 随机素数测试与大数分解】
来源:互联网 发布:大学网络课程代刷 编辑:程序博客网 时间:2024/05/17 23:30
Prime Test
Time Limit: 6000MS Memory Limit: 65536K
Total Submissions: 29925 Accepted: 7631
Case Time Limit: 4000MS
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 < 254).
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
直接套bin神的板子。
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<time.h>#include<iostream>#include<string.h>#include<math.h>#include<algorithm>using namespace std;//****************************************************************// Miller_Rabin 算法进行素数测试//速度快,而且可以判断 < 2^63的数//****************************************************************const int S = 10;//随机算法判定次数,S越大,判错概率越小 一般8-10足够//计算 (a*b)%c. a,b都是long long的数,直接相乘可能溢出的// a,b,c <2^63long long mult_mod(long long a, long long b, long long c){ a %= c; b %= c; long long ret = 0; while (b) { if (b & 1){ ret += a; ret %= c; } a <<= 1; if (a >= c)a %= c; b >>= 1; } return ret;}//计算 ret = x^n %clong long pow_mod(long long x, long long n, long long mod)//x^n%c{ if (n == 1)return x%mod; x %= mod; long long tmp = x; long long ret = 1; while (n) { if (n & 1) ret = mult_mod(ret, tmp, mod); tmp = mult_mod(tmp, tmp, mod); n >>= 1; } return ret;}//通过费马小定理,即 a^(n-1)=1(mod n) 验证n是不是合数//一定是合数返回true,不一定返回falsebool check(long long a, long long n, long long x, long long t){ long long ret = pow_mod(a, x, n); long long last = ret; for (int i = 1; i <= t; i++) { ret = mult_mod(ret, ret, n); if (ret == 1 && last != 1 && last != n - 1) return true;//合数 last = ret; } if (ret != 1) return true; return false;}// Miller_Rabin()算法素数判定//是素数返回true.(可能是伪素数,但概率极小)//合数返回false;bool Miller_Rabin(long long n){ if (n<2)return false; if (n == 2)return true; if ((n & 1) == 0) return false;//偶数 long long x = n - 1; long long t = 0; while ((x & 1) == 0){ x >>= 1; t++; } for (int i = 0; i<S; i++) { long long a = rand() % (n - 1) + 1;//rand()需要stdlib.h头文件 if (check(a, n, x, t)) return false;//合数 } return true;}//************************************************//pollard_rho 算法进行质因数分解//************************************************long long factor[100];//质因数分解结果(刚返回时是无序的)int tol;//质因数的个数。数组下标从0~tol-1开始long long gcd(long long a, long long b){ if (a == 0)return 1;//??????? if (a<0) return gcd(-a, b); while (b) { long long t = a%b; a = b; b = t; } return a;}//找出一个因子long long Pollard_rho(long long x, long long c){ long long i = 1, k = 2; long long x0 = rand() % x; long long y = x0; while (1) { i++; x0 = (mult_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; } }}//对n进行素因子分解 存入factor数组void findfac(long long n){ if (Miller_Rabin(n))//素数 { factor[tol++] = n; return; } long long p = n; while (p >= n)p = Pollard_rho(p, rand() % (n - 1) + 1); findfac(p); findfac(n / p);}int main(){ // srand(time(NULL));//需要time.h头文件 //POJ上G++要去掉这句话 int T; long long n; scanf("%d", &T); while (T--) { scanf("%I64d", &n); if (Miller_Rabin(n)) { printf("Prime\n"); continue; } tol = 0; findfac(n); long long ans = factor[0]; for (int i = 1; i<tol; i++) if (factor[i]<ans) ans = factor[i]; printf("%I64d\n", ans); } return 0;}
0 0
- poj 1811 Prime Test【 随机素数测试与大数分解】
- Poj 1811 Prime Test 素数测试 Miller-Rabin 与 整数的因子分解 Pollard rho
- poj 1811 Prime Test(拉宾米勒测试+大数分解)
- POJ 1811 Prime Test 素数测试
- POJ 1811 Prime Test --- Miller 素数测试
- POJ 1811 Prime Test(Pollard rho整数分解+miller_rabin素数测试)
- 邝斌的ACM模板(随机素数测试和大数分解(POJ 1811) )
- poj 1811 Prime Test(数论:大素数判定-分解)
- POJ 1811 Prime Test(大素数判定+质因数分解)
- 【POJ1811】Prime Test-Miller-Rabin素数测试+Pollard-rho大数分解
- poj 1811 随机素数和大数分解(模板)
- 随机素数测试和大数分解
- poj1811 Prime Test,随机素数测试
- POJ 1811 Prime Test 素性测试 分解素因子
- poj1811 Prime Test 素数测试 +整数分解+分治
- POJ1811 Prime Test miller_rabin素数测试+pollard_rho整数分解
- POJ1811-Prime Test-素数测试+Pollard rho因数分解
- [POJ 1811 Prime Test] Miller_Rabin + Pollard_rho 大数质数判断/质因子分解模板
- oracle游标的使用
- php实现伪静态的方法
- android NDK环境搭建
- 中断详解(五)——中断处理程序
- bootloader介绍
- poj 1811 Prime Test【 随机素数测试与大数分解】
- 用脚本来简化iOS美术同学的工作
- C语言中共用体(联合体)
- android 压缩图片的几种方法
- 【Python】读书笔记:Python基础教程-项目1-即时标记
- G1垃圾收集器入门
- Lucene:基于Java的全文检索引擎简介
- RPC应用的java实现
- 遗传算法小结