码迷,mamicode.com
首页 > 其他好文 > 详细

Miller Rabbin素数测试

时间:2018-10-17 00:24:37      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:pre   数学   out   素数   r++   输出   参数   排除   long   

步骤

①先写快速幂取模函数

②MR算法开始

(1)传入两个参数一个是底数一个是n也就是幂数,如果n是一个合数那么可以判定,这个数一定不是素数

(2)然后开始寻找一个奇数的n去计算,如果最后满足a^d%n=1那么这个可能就是一个素数,然后再判断k=n-1(目前数学不好不明所以)

(3)MR结束

③编写check函数,传入一个参数。首先排除一些情况

(1)是2 3 7 61(int范围内完全可以判断的底数)如果是的话return true;

(2)是偶数,1,3的倍数或5的倍数或7的倍数所有条件并起来如果满足一个那么return false

④开始进行MR的判断,一般int范围内判断2,3,7,61即可

⑤编写主函数然后输出即可

#include <bits/stdc++.h>
using namespace std;
int qpow(int a,int b,int c)
{
    long long ans=1;
    long long base=a;
    while(b)
    {
        if(b&1)
        ans=ans*base%c;
        base=base*base%c;
        b>>=1;
    }
    return ans;
}
bool MR(int a,int n)
{
    int r=0,d=n-1;
    if(!(n%a))
    return false;
    while(!(d&1))
    {
        d>>=1;
        r++;
    }
    long long k=qpow(a,d,n);
    if(k==1) return true;
    for(int i=0;i<r;i++,k=k*k%n)
    if(k==n-1)
    return true;
    return false;
}
bool check(int n)
{
    if(n==2||n==3||n==7||n==61)
    return true;
    if(!(n&1)||!(n%3)||!(n%5)||n==1)
    return false;
    if(MR(2,n)&&MR(7,n)&&MR(61,n)&&MR(3,n))
    return true;
    return false;
}
main()
{
    int k;
    while(cin>>k)
    check(k)?cout<<"Y\n":cout<<"N\n";
}

Miller Rabbin素数测试

标签:pre   数学   out   素数   r++   输出   参数   排除   long   

原文地址:https://www.cnblogs.com/baccano-acmer/p/9800816.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!