//俄国农民算法
#include<stdio.h>
int Right_Left(int g,int x,int p);
int main()
{
//r=g^x mod p
int g,x,p;
printf("The program is to compute r=g^x mod p\n");
printf("Input the arguments:(form:g,x,p)\n");
scanf("%d,%d,%d",&g,&x,&p);
printf("%d^%d mod %d = %d\n",g,x,p,Right_Left(g,x,p));
}
int Right_Left(int g,int x,int p)//大端模式
{
int r=1;
int i,e;
for(i=0;i<32;i++)
{
e=x&0x0001;
if(e==0x0001)
r=(r*g)%p;
g=(g*g)%p;
x>>1;
}
return r;
}
int Left_Right(int g,int x,int p)//小端模式
{
int r=1;
int i,e;
for(i=0;i<32;i++)
{
e=x&0x8000;
r=(r*r)%p;
if(e==0x0001)
r=(r*g)%p;
x<<1;
}
return r;
}