Carmichael Numbers

本文介绍了一种用于判断Carmichael数的算法,并通过快速幂运算实现了高效的判断过程。该算法利用快速幂将时间复杂度控制在nlogn之内。

题目描述:

         对于任意x∈[1,n]满足x^n≡x(mod n),这样的n称为CarmichaelNumbers。对于给定的n判断是否是Carmichael Numbers。

解题思路:

         可以考虑快速幂,这样时间复杂度就能控制在nlogn之内了。

代码:

#include<stdio.h>
#include<string.h>
#include<math.h>
#define LL long long
int a[66000];
void judge_prime()
{
   int i,j,m=sqrt(65010+0.5);
   memset(a,0,sizeof(a));
   for(i=2;i<=m;i++)
    {
       if(!a[i])
       {
           for(j=i*i;j<65010;j+=i)
                a[j]=1;
       }
    }
}
LL pow_mod(LL a,LL n,LL m)
{
   if(n==0) return 1;
   LL x=pow_mod(a,n/2,m);
   LL ans=x*x%m;
   if(n%2==1) ans=ans*a%m;
   return ans;
}
int main()
{
   judge_prime();
   LL i,n;
   bool flag;
   while(~scanf("%lld",&n)&&n)
    {
       if(!a[n])
       {
           printf("%lld is normal.\n",n);
           continue;
       }
       flag=true;
       for(i=2;i<n;i++)
       {
           if(pow_mod(i,n,n)!=i)
           {
                flag=false;
                break;
           }
       }
       if(flag)
           printf("The number %lld is a Carmichael number.\n",n);
       else
           printf("%lld is normal.\n",n);
    }
   return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值