首页 > 代码库 > POJ1811 Prime Test(miller素数判断&&pollar_rho大数分解)
POJ1811 Prime Test(miller素数判断&&pollar_rho大数分解)
http://blog.csdn.net/shiyuankongbu/article/details/9202373
发现自己原来的那份模板是有问题的,而且竟然找不出是哪里的问题,所以就用了上面的链接上的一份代码,下面只是寄存一下这份代码,以后打印出来当模板好了。
#pragma warning(disable:4996)#include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <cstdlib> #include <cstdio> using namespace std;#define Times 10 map<long long, int>m;long long mi;long long random(long long n){ return ((double)rand() / RAND_MAX*n + 0.5);}long long multi(long long a, long long b, long long mod){ long long ans = 0; while (b){ if (b & 1) ans = (ans + a) % mod; b >>= 1; a = (a << 1) % mod; } return ans;}long long Pow(long long a, long long b, long long mod){ long long ans = 1; while (b){ if (b & 1) ans = multi(ans, a, mod); b >>= 1; a = multi(a, a, mod); } return ans;}bool witness(long long a, long long n){ long long d = n - 1; while (!(d & 1)) d >>= 1; long long t = Pow(a, d, n); while (d != n - 1 && t != 1 && t != n - 1) { t = multi(t, t, n); d <<= 1; } return t == n - 1 || d & 1;}bool miller_rabin(long long n){ if (n == 2) return true; if (n<2 || !(n & 1)) return false; for (int i = 1; i <= Times; i++) { long long a = random(n - 2) + 1; if (!witness(a, n)) return false; } return true;}long long gcd(long long a, long long b){ return a&&b ? gcd(b, a%b) : a + b;}long long pollard_rho(long long n, int c){ long long x, y, d, i = 1, k = 2; x = random(n - 2) + 1; y = x; while (1){ i++; x = (multi(x, x, n) + c) % n; d = gcd(y - x, n); if (1<d&&d<n) return d; if (y == x) return n; if (i == k){ y = x; k <<= 1; } }}void find(long long n, int c){ if (n == 1) return; if (miller_rabin(n)){ m[n]++; mi = min(mi, n); return; } long long p = n; while (p >= n) p = pollard_rho(p, c--); find(p, c); find(n / p, c);}int main(){ int t; scanf("%d", &t); while (t--) { long long n; scanf("%lld", &n); mi = n; if (miller_rabin(n)) cout << "Prime" << endl; else { find(n, 12312); cout << mi << endl; } } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。