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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值