CODE【VS】2849 素數判定 3(米勒拉賓素數測試的方法)

題目描述 Description

輸入一個正整數x(3<=x<=100000),判斷x是否是質數,如果是質數則輸出信息“prime”,否則輸出“composite”。

輸入描述 Input Description

一行一個正整數

輸出描述 Output Description

輸出prime或者composite

樣例輸入 Sample Input

13

樣例輸出 Sample Output

prime

數據範圍及提示 Data Size & Hint

大於2並且小於100000

題解:這道題就是一個簡單的素數判斷,普通的素數判斷可以過,普通的篩法也可以過,這裏我用的米勒拉賓素數測試的方法。不太懂原理,但是很高大上的樣子,想要了解的可以去百度其原理和證明。

推薦一個博客:點擊打開鏈接(裏面有多個素數判定和篩法)

下面附上代碼:

#include<stdio.h>
#include<string.h>
using namespace std;
int tab[]={2, 3, 5, 7};
long long qpow(int a, int b, int r)  //(a^b)%r  快速冪取模
{
    long long ret = 1, tmp = a;
    while(b)
    {
        if (b&1)
            ret = ret*tmp%r;
        tmp = tmp*tmp%r;
        b >>= 1;
    }
    return ret;
}
bool  Miller_Rabbin(int n, int a)//米勒拉賓素數測試
{
    int r = 0, s = n-1, j;
    long long k;
    if(n%a == 0)    return false;
    while((s&1) == 0)
    {
        s >>= 1;
        r++;
    }
    k = qpow(a, s, n);
    if(k == 1)  return true;
    for (j = 0; j < r; j++, k=k*k%n)
        if (k == n-1)
            return true;
    return false;
}
bool Isprime(int n)//判斷是否是素數
{
    for (int i = 0; i < 4; i++)
    {
        if (n == tab[i])
            return true;
        if (!Miller_Rabbin(n, tab[i]))
            return false;
    }
    return true;
}
int main()
{
    int n;
    scanf("%d", &n);
    if(Isprime(n)) printf("prime\n");
    else printf("composite\n");
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章