zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    2020.10.23 19级training 补题报告
    2020.10.17 天梯赛练习 补题报告
    2020.10.16 19级training 补题报告
    2020.10.9 19级training 补题报告
    2020.10.10 天梯赛练习 补题报告
    2020.10.3 天梯赛练习 补题报告
    2020.10.2 19级training 补题报告
    第十届山东省ACM省赛复现补题报告
    VVDI Key Tool Plus Adds VW Passat 2015 Key via OBD
    Xhorse VVDI Prog Software V5.0.3 Adds Many MCUs
  • 原文地址:https://www.cnblogs.com/chanme/p/3873280.html
Copyright © 2011-2022 走看看