zoukankan      html  css  js  c++  java
  • Miller_Rabin素数判断,rho

    safe保险一点5吧。我是MR:

     1 const int Safe=3;
     2 int gcd(int a,int b){return !b?a:gcd(b,a%b);}
     3 int mul(int a,int b,int p){
     4     int tmp=(a*b-(int)((double)a/p*b+1e-8)*p);
     5     return tmp<0?tmp+p:tmp;
     6 }
     7 int pow(int a,int b,int p){
     8     int ans=1;a%=p;
     9     for(int i=b;i;i>>=1,a=mul(a,a,p))
    10         if(i&1)ans=mul(ans,a,p);
    11     return ans;
    12 }
    13 bool check(int a,int n,int r,int s){
    14     int ans=pow(a,r,n),p=ans;
    15     for(int i=1;i<=s;i++){
    16         ans=mul(ans,ans,n);
    17         if(ans==1&&p!=1&&p!=n-1) return true;
    18         p=ans;
    19     } if(ans!=1)return true;return false;
    20 }
    21 bool MR(int n){
    22     if(n<=1) return false;
    23     if(n==2) return true;
    24     if(!(n&1)) return false;
    25     int r=n-1,s=0;
    26     while(!(r&1)) r>>=1,s++;
    27     for(int i=0;i<Safe;i++)
    28         if(check(rand()%(n-1)+1,n,r,s)) return false;
    29     return true;
    30 }

    我是rho:

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <algorithm>
     4 #include <cstring>
     5 #include <cmath>
     6 #define ll long long 
     7 #define inf 1000000000
     8 #define Safe 5
     9 using namespace std;
    10 ll gcd(ll a, ll b){
    11     return b == 0 ? a : gcd(b, a % b);
    12 }
    13 ll n, x, mx;
    14 ll mul(ll a, ll b, ll p){
    15     ll tmp = (a * b - (ll)((long double)a / p * b + 1e-8) * p);
    16     return tmp < 0 ? tmp + p : tmp;
    17 }
    18 ll pow(ll a, ll b, ll p){
    19     ll ans = 1; a %= p;
    20     for(ll i = b; i; i >>= 1, a = mul(a, a, p))
    21         if(i & 1) ans = mul(ans, a, p);
    22     return ans;
    23 }
    24 bool check(ll a, ll n, ll r, ll s){
    25     ll ans = pow(a, r, n), p = ans;
    26     for(int i = 1; i <= s; i ++){
    27         ans = mul(ans, ans, n);
    28         if(ans == 1 && p != 1 && p != n - 1) return true;
    29         p = ans;
    30     }
    31     if(ans != 1)return true;
    32     return false;
    33 }
    34 bool MR(ll n){
    35     if(n <= 1) return false;
    36     if(n == 2) return true;
    37     if(n % 2 == 0) return false;
    38     ll r = n - 1, s = 0;
    39     while(r % 2 == 0) r /= 2, s ++;
    40     for(int i = 0; i < Safe; i ++)
    41         if(check(rand() % (n - 1) + 1, n, r, s)) return false;
    42     return true;
    43 }
    44 ll rho(ll n, ll c){
    45     ll k = 2, x = rand() % n, y = x, p = 1;
    46     for(ll i = 1; p == 1; i ++){
    47         x = (mul(x, x, n) + c) % n;
    48         p = y > x ? y - x : x - y;
    49         p=gcd(n, p);
    50         if(i == k) y = x, k += k;
    51     }
    52     return p;
    53 }
    54 void solve(ll n){
    55     if(n == 1) return;
    56     if(MR(n)) { mx = max(n, mx); return; }
    57     ll t = n;
    58     while(t == n) t = rho(n, rand() % (n - 1) + 1);
    59     solve(t); solve(n / t);
    60 }
    61 void read(ll &x){
    62     x = 0; ll sig = 1; char ch = getchar();
    63     while(!isdigit(ch)) { if(ch == '-') sig = -1; ch = getchar(); }
    64     while(isdigit(ch)) x = 10 * x + ch - '0', ch = getchar();
    65     x *= sig; return ;
    66 }
    67 ll cnt = 0;
    68 void init(){
    69     read(n);
    70     cnt = 0;
    71     return ;
    72 }
    73 void work(){
    74     while(n --){
    75         read(x);
    76         if(MR(x)) cnt ++;
    77         mx = 0; solve(x);
    78         if(mx == x) puts("Prime");
    79         else printf("%lld
    ", mx);
    80     }
    81     return ;
    82 }
    83 void print(){
    84     printf("%lld
    ", cnt); 
    85     return ;
    86 }
    87 int main(){
    88     init();
    89     work();
    90     print();
    91     return 0;
    92 }
  • 相关阅读:
    03、Jenkins相关概念
    02、Jenkins安装部署
    01、Jenkins简介
    10.ansible 利用playbook部署LAMP环境
    09.ansilbe利用playbook部署LNMP环境
    08.编译安装httpd
    python入门到放弃(五)-基本数据类型之list列表
    python入门到放弃(四)-基本数据类型之str字符串
    python入门到放弃(三)-基本数据类型之int整数和bool值
    CentOS7.5源码编译安装mysql5.7.29
  • 原文地址:https://www.cnblogs.com/chxer/p/4394486.html
Copyright © 2011-2022 走看看