• POJ 1811 Prime Test


    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

    Pollard Rho大数分解算法+Miller_Rabin判素数法模板

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<cmath>
      6 #include<ctime>
      7 using namespace std;
      8 typedef long long lol;
      9 int prime[11]={2,3,5,7,11,13,17,19,23,29};
     10 lol ans,inf=1e18;
     11 lol gcd(lol a,lol b)
     12 {
     13   if (!b) return a;
     14   return gcd(b,a%b);
     15 }
     16 lol multi(lol x,lol y,lol Mod)
     17 {
     18   lol res=0;
     19   x%=Mod;
     20   while (y)
     21     {
     22       if (y&1)
     23     {
     24       res=(res+x)%Mod;
     25     }
     26       x=(x+x)%Mod;
     27       y>>=1;
     28     }
     29   return res;
     30 }
     31 lol qpow(lol x,lol y,lol Mod)
     32 {
     33   lol res=1;
     34   while (y)
     35     {
     36       if (y&1)
     37     {
     38       res=multi(res,x,Mod);
     39     }
     40       x=multi(x,x,Mod);
     41       y>>=1;
     42     }
     43   return res;
     44 }
     45 bool Miller_Rabin(lol n)
     46 {int i,j;
     47   if (n==2) return 1;
     48   if (n<2||n%2==0) return 0;
     49   for (i=0;i<10;i++)
     50     {
     51       if (n==prime[i]) return 1;
     52       if (n%prime[i]==0) return 0;
     53     }
     54   lol m=n-1,k=0;
     55   while (m%2==0)
     56     {
     57       m>>=1;
     58       k++;
     59     }
     60   for (i=0;i<10;i++)
     61     {
     62       lol a=rand()%(n-2)+2;
     63       lol x=qpow(a,m,n);
     64       lol y=0;
     65       for (j=0;j<k;j++)
     66     {
     67       y=multi(x,x,n);
     68       if (y==1&&x!=1&&x!=n-1) return 0;
     69       x=y;
     70     }
     71       if (y!=1) return 0;
     72     }
     73   return 1;
     74 }
     75 lol pollard_rho(lol n,lol c)
     76 {
     77   lol i=1,k=2;
     78   lol x=rand()%(n-1)+1,y=x;
     79   while (1)
     80     {
     81       ++i;
     82       x=(multi(x,x,n)+c)%n;
     83       lol d=gcd((y-x+n)%n,n);
     84       if (d>1&&d<n) return d;
     85       if (y==x) return n;
     86       if (i==k)
     87     {
     88       y=x;
     89       k<<=1;
     90     }
     91     }
     92 }
     93 void find(lol n,lol c)
     94 {
     95   if (n==1) return;
     96   if (Miller_Rabin(n))
     97     {
     98       ans=min(ans,n);
     99       return;
    100     }
    101   lol p=n;
    102   lol k=c;
    103   while (p==n) p=pollard_rho(p,c--);
    104   find(p,k);
    105   find(n/p,k);
    106 }
    107 int main()
    108 {int T;
    109   lol n;
    110   cin>>T;
    111   srand(time(0));
    112   while (T--)
    113     {
    114       cin>>n;
    115       ans=inf;
    116       if (Miller_Rabin(n)) printf("Prime
    ");
    117       else
    118     {
    119       find(n,120);
    120       printf("%lld
    ",ans);
    121     }
    122     }
    123 }


  • 相关阅读:
    C++中int与string的相互转换【转】
    C# 获取文件名及扩展名【转】
    k8s查看容器日志---查看运行中指定pod以及指定pod中容器的日志
    shell字符串截取
    Kubernetes集群之清除集群
    Expect Command And How To Automate Shell Scripts Like Magic
    CentOS 7搭建本地yum源和局域网yum源
    使用MobaXterm配置ssh隧道(port forwarding)
    重置jenkins用户名密码
    Kubernetes之Taints与Tolerations 污点和容忍
  • 原文地址:https://www.cnblogs.com/Y-E-T-I/p/8412203.html
Copyright © 2020-2023  润新知