#include <stdio.h>
#include <math.h>
int prime[65002]={0};
void Init()
{
int i,j;
int n=(int)sqrt(65000+1);
for( i=2;i<=65000;i++) prime[i]=1;
for( i=2;i<=n;i++)
if(prime[i])
for( j=i*i;j<=65000;j+=i)
prime[j]=0;
}
int Pow_mod(int a,int n,int m)
{
if(n==1) return a%m;
unsigned ans=Pow_mod(a,n/2,m);
ans=(ans*ans)%m;
if(n%2==1) return ans*a%m;
return ans;
}
int main()
{
int i,n,ans;
Init();
while(scanf("%d",&n)==1)
{
if(!n) break;
ans=1;
if(!prime[n])
for( i=2;i<n;i++)
if(Pow_mod(i,n,n)!=i)
{ ans=0; break; }
if(ans&&!prime[n])
printf("The number %d is a Carmichael number.\n",n);
else printf("%d is normal.\n",n);
}
return 0;
}
素数筛选与快速幂取模
最新推荐文章于 2022-04-22 16:14:20 发布