数论方向的题目,最近开始做做这方面的简单题或者是模板题
题目大意:
根据费马定理,如果p是一个素数,则对任意数字a,有,现在,题目要求找出p[不是素数]时,满足此式的算式
其中运用到了快速幂取模的操作(由于数字太过大),这大概也是第一次解决带有mod类型的题,虽然是个超级水题 = =
这种快速幂取模的方法是纯模拟方法,网上其他代码,例如用&判断奇偶的代码质量比我这个好很多,希望真正需要用快速幂取模的人学习那一种写法
//自己从头书写快速幂取模算法,并进行优化分析
//
//
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstdio>
#define ll long long
using namespace std;
ll fast(ll b,ll n,ll m)//计算b的n次方对m取模
{
ll a = 1;
//首先把n进行二进制分解
int flagbinary = 0;
while(n>0)
{
if(n%2==0)//
{
flagbinary = 0;
n/=2;
}
else if(n%2!=0)//如果是奇数
{
flagbinary = 1;
n = n - 1;
n/=2;
}
if(flagbinary==0)
{
a = a%m;
b = (b%m*b%m)%m;//b还是要不断地扩大的
}
else//
{
a = (a%m*b%m)%m;
b = (b%m*b%m)%m;
}
}
return a;
}
bool isprime(int a)
{
if(a==1)
{
return false;
}
else if(a==2)
{
return true;
}
else
{
for(int i=2;i<sqrt(a)+1;i++)
{
if(a%i==0)
{
return false;
}
}
return true;
}
}
int main(void)
{
while(1)
{
int p,a;
scanf("%d%d",&p,&a);
if(p==0&&a==0)
{
return 0;
}
ll temp = fast(a,p,p);
if(temp==a&&!isprime(p))
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
}