擬素数(クイックパワーテンプレートの質問)

フェルマーの定理は、任意の素数pおよび任意の整数a> 1に対して、ap = a(mod p)であると述べています。つまり、aをp乗し、pで割ると、余りはaになります。ベース-擬素数として知られているpのいくつかの(しかしそれほど多くはない)非素数値は、いくつかのaに対してこの特性を持っています。(そして、カーマイケル数として知られているいくつかは、ベースです-すべての擬素数です。)

2 <p≤1000000000および1 <a <pの場合、pが擬素数の塩基であるかどうかを判断します。

入力

入力にはいくつかのテストケースが含まれ、その後に「00」を含む行が続きます。各テストケースは、pとaを含む行で構成されます。

出力

各テストケースについて、pがベース(擬素数)の場合は「yes」を出力します。それ以外の場合は「no」を出力します。

サンプル入力

3 2
10 3
341 2
341 3
1105 2
1105 3
0 0

サンプル出力

いいえ
いいえ
はい
いいえ
はい
はい

タイトル説明:

pとaのペアを入力し、pが素数の場合は、noを出力します。pが素数でない場合は、a ^ pの余りがaと等しいかどうかを判断します。

問題解決のアイデア:

クイックパワーテンプレートのセットダイレクトAC

コード:

#include<bits/stdc++.h>
long long int qpow(long long int a,long long int b)//快速幂模板
{
    
    
    long long int ans = 1,t=b;
    while(b){
    
    
        if(b&1)        //如果n的当前末位为1
            ans=(ans*a)%t;  //ans乘上当前的a
        a=(a*a)%t;        //a自乘
        b >>= 1;       //n往右移一位
    }
    return ans%t;
}
long long int prime(long long int n)
{
    
    
    long long int i,k;
    if(n== 0) 
	return 0;
    k=sqrt(n);
    for(i=2;i<=k;i++)
    {
    
    
        if(n%i==0) 
		return 0;
    }
    return 1;
}
int main()
{
    
    

    long long int p,a;
    while(scanf("%lld %lld",&p,&a) &&p+a)
    {
    
    
        if(prime(p))
		printf("no\n");
        else
        {
    
    
            if(qpow(a,p) == a)
			printf("yes\n");
            else
            printf("no\n");
        }

    }
}

おすすめ

転載: blog.csdn.net/weixin_46703995/article/details/112477132