大素数测试+求最小素因子+最大素因子(模版)
2013-07-02 01:15
281 查看
引用:http://blog.csdn.net/wsniyufang/article/details/6623576
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #define MAXN 10 #define C 16381 using namespace std; typedef __int64 I64; I64 min; I64 multi(I64 a, I64 b, I64 n){ I64 tmp = a % n, s = 0; while(b){ if(b & 1) s = (s + tmp) % n; tmp = (tmp + tmp) % n; b >>= 1; } return s; } I64 Pow(I64 a, I64 b, I64 n){ I64 tmp = a % n, s = 1; while(b){ if(b & 1) s = multi(s, tmp, n); tmp = multi(tmp, tmp, n); b >>= 1; } return s; } int witness(I64 a, I64 n){ I64 u = n - 1, t = 0, i, x, y; while(!(u & 1)) u >>= 1, t ++; x = Pow(a, u, n); for(i = 1; i <= t; i ++){ y = multi(x, x, n); if(y == 1 && x != 1 && x != n -1) return 1; x = y; } if(x != 1) return 1; return 0; } int test(I64 n){ I64 a; int i; if(n == 2) return 1; if(n < 2 || !(n & 1)) return 0; srand((I64)time(0)); for(i = 0; i < MAXN; i ++){ a = ((I64) rand()) % (n - 2) + 2; if(witness(a, n)) return 0; } return 1; } I64 gcd(I64 a, I64 b){ return b ? gcd(b, a % b) : a; } I64 pollard_rho(I64 n, I64 c){ I64 x, y, d, i = 1, k = 2; srand((I64)time(0)); x = ((I64) rand()) % (n - 1) + 1; y = x; while(1){ i ++; x = (multi(x, x, n) + c) % n; d = gcd(y - x + n, n); if(d != 1 && d != n) return d; if(y == x) return n; if(i == k) y = x, k <<= 1; } } void find(I64 n, I64 c){ I64 r; if(n <= 1) return; if(test(n)){ if(min > n) min = n; return; } r = pollard_rho(n, c--); find(n / r, c); find(r, c); } I64 MaxPrimeFactor(I64 n) { if(test(n)) return n; I64 k=-1,g; min=n; find(n,C); g=MaxPrimeFactor(min); k=g>k?g:k; g=MaxPrimeFactor(n/min); k=g>k?g:k; return k; } int main(){ I64 n; while(~scanf("%I64d", &n)) { // if(test(n)){ //test(n)测试n是不是素数 // printf("Prime\n"); // continue; // } // min = n; //min表示n的最小素因子 // find(n, C); //找出n的最小素因子 // printf("%I64d\n",min); printf("%I64d\n",MaxPrimeFactor(n));//求n的最大素因子 } return 0; }
相关文章推荐
- 大素数测试+求最小素因子+最大素因子(模版)
- 【2017青岛网络赛】1009 Smallest Minimum Cut hdu6214 最小割 最大流模版
- POJ3469_Dual Core CPU(网络流/最小割=最大流/模版)----Dinic模版2.0
- 最大公约数与最小公倍数
- 编程之美4:求数组中的最大值和最小值
- JAVA 各种数值类型最大值和最小值 Int, short, char, long, float,&nbs
- NYOJ 977 最大的最小公倍数
- 以太网数据帧(802.3)最大与最小长度
- String Problem + 最大(最小)表示法+KMP
- POJ3723 Conscription , 最大权森林问题 ->最小生成树问题
- (一)查询出排序中的最大值和最小值
- Air Raid(最小路径覆盖数=节点数-最大匹配数)
- [hihocoder #1127 : 二分图三·二分图最小点覆盖和最大独立集]
- MT【105】待定系数算最大最小
- highcharts获取数轴最大最小值及时间轴赋值
- 一个求矩阵鞍点(即行上最小的数 同时是列上最大的数)的C程序
- PHP获取以为数组中的最大值和最小值
- java 输入两个正整数 m 和 n,求其最大公约数和最小公倍数
- 【算法拾遗】最大数和最小数
- 洛谷 P2764(最小路径覆盖=节点数-最大匹配)