这是扩展欧几里德的算法:a mod b的逆;
#include<stdio.h>
int a,b,x3[100],y3[100],q[100];
int x1[100],x2[100],y1[100],y2[100];
int i,j,k;
int gcd(int a,int b);
int a,b,x3[100],y3[100],q[100];
int x1[100],x2[100],y1[100],y2[100];
int i,j,k;
int gcd(int a,int b);
int main()
{
scanf("%d %d",&a,&b);
if(a>b)
a=a%b;
q[0]=0;
x1[0]=1;
x2[0]=0;
x3[0]=b*x1[0]+a*x2[0];
y1[0]=0;
y2[0]=1;
y3[0]=b*y1[0]+a*y2[0];
gcd(a,b);
return 0;
}
{
scanf("%d %d",&a,&b);
if(a>b)
a=a%b;
q[0]=0;
x1[0]=1;
x2[0]=0;
x3[0]=b*x1[0]+a*x2[0];
y1[0]=0;
y2[0]=1;
y3[0]=b*y1[0]+a*y2[0];
gcd(a,b);
return 0;
}
int gcd(int a,int b)
{
for(i=1;;i++)
{
q[i]=x3[i-1]/y3[i-1];
x1[i]=y1[i-1];
x2[i]=y2[i-1];
x3[i]=y3[i-1];
y1[i]=x1[i-1]-q[i]*x1[i];
y2[i]=x2[i-1]-q[i]*x2[i];
y3[i]=x3[i-1]-q[i]*x3[i];
if(y3[i]==0)
{
printf("a mod b的逆为:%d/n",y2[i]);
break;
}
if(y3[i]==1)
{
printf("a 和 b的最大公倍数为:%d/n",y2[i]);
break;
}
}
return 0;
}
{
for(i=1;;i++)
{
q[i]=x3[i-1]/y3[i-1];
x1[i]=y1[i-1];
x2[i]=y2[i-1];
x3[i]=y3[i-1];
y1[i]=x1[i-1]-q[i]*x1[i];
y2[i]=x2[i-1]-q[i]*x2[i];
y3[i]=x3[i-1]-q[i]*x3[i];
if(y3[i]==0)
{
printf("a mod b的逆为:%d/n",y2[i]);
break;
}
if(y3[i]==1)
{
printf("a 和 b的最大公倍数为:%d/n",y2[i]);
break;
}
}
return 0;
}
扩展的欧几里德算法描述
例:求gcd(20,117)和201mod117
Q
|
X1
|
X2
|
X3
|
Y1(T1)
|
Y2(T2)
|
Y3(T3)
|
-
|
1
|
0
|
117
|
0
|
1
|
20
|
5
|
0
|
1
|
20
|
1
|
-5
|
17
|
1
|
1
|
-5
|
17
|
-1
|
6
|
3
|
5
|
-1
|
6
|
3
|
6
|
-35
|
2
|
1
|
6
|
-35
|
2
|
-7
|
41
|
1=gcd
|