#include <iostream>
#include <math.h>
#include <conio.h>
using namespace std;
unsigned long int a[10000]={2}, num=1;
unsigned long int j=0;
int max_gongyue(int num1,int num2)
{
int temp,m,n;
if(num1<num2)
{
temp=num1;
num1=num2;
num2=temp;
}
m=num1;
n=num2;
while(m%n)
{
temp=m;
m=n;
n=temp-n*(temp/n);
}
return n;
}
int prime(unsigned long int x)
{
unsigned long int m;
m=sqrt(x);
for(j=2;j<=m;j++)
{
if(x%j==0)
return 0;
}
return 1;
}
int oula(int num)
{
int sum=0;
if(num==1)
{
return 1;
}
if(prime(num))
{
return num-1;
}
else
{
for(int i=1;i<=num-1;i++)
{
if(max_gongyue(i,num)==1)
{
sum++;
}
}
return sum;
}
}
long long quickpow(int a,int b,int n)
{
long long t = 1;
if (b == 0)
return 1;
if (b == 1)
return a%n;
t = quickpow(a, b>>1, n);
t = t*t % n;
if (b&0x1)
{
t = t*a % n;
}
return t;
}
int main()
{
cout<<"计算 ordm(a)"<<endl;
cout<<"请输入 m a"<<endl;
int m,a;
while(cin>>m>>a)
{
if(max_gongyue(a,m)!=1)
{
cout<<"a和m不互素!"<<endl;
continue;
}
unsigned long int num=oula(m);
for(unsigned long int l=1;l<=num;l++)
{
if(quickpow(a,l,m)==1)
{
cout<<"ordm(a)="<<l<<endl;
break;
}
}
}
return 0 ;
}