zoukankan      html  css  js  c++  java
  • 米勒拉宾素数测试

    学了下米勒拉宾素数测试,然而没题目。。

    莫名其妙就能判断一个数是否是素数,很玄学。。证明也不会。。

    蒯了网上一个神犇:http://www.cnblogs.com/JVxie/p/4975876.html

    米勒拉宾算法的基本概念如下:

    首先判断这个数n的奇偶性

    若为偶数仅有2是质数

    奇数则进入测试

    测试方法:

    首先确定几个基底a,范围在[2,n-1]

    因为n是奇数,所以n-1必定为偶数

    则n-1可以表示为(2^s)*d

    s、d分别求出来

    设t为a^d模n的数,有如下几个约定:

    1.若t=-1或1时则该数n可能为质数

    2.若此时t=n-1,则该数可能为质数

    3.d*2>n-1时n必为合数

    4.若上述皆不满足则让d*2,返回2

    多组测试之后就能判断是否为质数,而且错误率相当低!!

    不过想证明米勒拉宾的正确性还是很困难的

    需要费马小定理等七七八八的数论

    具体的可以百度

    我就不给于证明了~

    模板也是蒯的:

     1 //It is made by wfj_2048~
     2 #include <algorithm>
     3 #include <iostream>
     4 #include <complex>
     5 #include <cstring>
     6 #include <cstdlib>
     7 #include <cstdio>
     8 #include <vector>
     9 #include <cmath>
    10 #include <queue>
    11 #include <stack>
    12 #include <map>
    13 #include <set>
    14 #include <ctime>
    15 #define il inline
    16 #define RG register
    17 #define ll long long
    18 #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
    19 
    20 using namespace std;
    21 
    22 il ll gi(){
    23     RG ll x=0,q=1; RG char ch=getchar(); while ((ch<'0' || ch>'9') && ch!='-') ch=getchar();
    24     if (ch=='-') q=-1,ch=getchar(); while (ch>='0' && ch<='9') x=x*10+ch-48,ch=getchar(); return q*x;
    25 }
    26 
    27 il ll qpow(RG ll a,RG ll b,RG ll p){
    28     RG ll ans=1;
    29     while (b){
    30     if (b&1) ans=ans*a%p;
    31     a=a*a%p,b>>=1;
    32     }
    33     return ans;
    34 }
    35 
    36 il ll miller_rabbin(RG ll n,RG ll a){
    37     RG ll d=n-1,s=0;
    38     while (!(d&1) && d) d>>=1,s++;
    39     RG ll t=qpow(a,d,n);
    40     if (t==1 || t==-1) return 1;
    41     while (s--){
    42     if (t==n-1) return 1;
    43     t=t*t; if (t>=n) t%=n;
    44     }
    45     return 0;
    46 }
    47 
    48 il ll isprime(RG ll n){
    49     if (n==1) return 0;
    50     if (!(n&1)) return n==2;
    51     for (RG ll i=0;i<5;++i){
    52     RG ll a=rand()%(n-2)+2;
    53     if (!(n%a)) return 0;
    54     if (!miller_rabbin(n,a)) return 0;
    55     }
    56     return 1;
    57 }
    58 
    59 il void work(RG ll n){
    60     if (isprime(n)) printf("%lld
    ",n);
    61     return;
    62 }
    63 
    64 int main(){
    65     File("miller_rabbin");
    66     srand(time(NULL));
    67     for (RG ll i=1;i<=10000000;++i) work(i);
    68     return 0;
    69 }
  • 相关阅读:
    JS正则表达式验证账号、手机号、电话和邮箱
    Asp.Net Mvc导出Excel
    后台截取姓名,只留姓名字带*号覆盖
    后台根据身份证号码截取性别和出生日期
    后台传个变量,前台页面显示对应的中文
    第一次封装JS文件之滚动条
    阿里巴巴17校招测试题目(Jquery解法)
    阿里巴巴17实习生招聘编程题目(JavaScript解法)
    SofewareTesting hw3
    PHP之login
  • 原文地址:https://www.cnblogs.com/wfj2048/p/6557829.html
Copyright © 2011-2022 走看看