扩展欧几里得算法介绍
👀已知整数a、b,扩展欧几里得算法可以在求得a、b的最大公约数的同时,能找到整数x、y(其中一个很可能是负数),使它们满足等式
ax + by = gcd(a,b)
那么,扩展欧几里得算法的一个作用就是得到ax+by=gcd(a,b)的整数解。
计算过程
有两个数a,b,对它们进行辗转相除法,可得它们的最大公约数。然后,收集辗转相除法中产生的式子,倒回去,可以得到ax+by=gcd(a,b)的整数解。
定理公式
(根据《信息安全数学基础》一书上得出的结论公式 输出表格)
c语言代码
/*运用广义欧几里得除法求整数s和t,使得s*a+t*b=(a,b)*/
#include<stdio.h>
int s[100];
int t[100];
int q[100];
int r[100];
int main()
{
int a,b;
printf("-------------< 广义欧几里得求满足s*a+t*b=(a,b)的s和t >------------------hiya--\n\n");
printf("请输入两个整数a和b:") ;
scanf("%d %d",&a,&b) ;
s[0] = 1 ; s[1] = 0 ;
t[0] = 0 ; t[1] = 1 ;
r[0] = a ; r[1] = b ;
q[1] = r[0] / r[1] ;
r[2] = r[0] % r[1] ;
printf("__________________________________________________________________________________\n");
printf("| j | q[j] | r[j] | r[j+1] | s[j-1] | s[j] | t[j-1] | t[j] |\n") ;
printf("|_________|_________|_________|_________|_________|_________|_________|_________|\n");
printf("|%9d|%9d|%9d|%9d|%9d|%9d|%9d|\n",1,q[1],r[1],r[1+1],s[1-1],s[1],t[1-1],t[1]) ;
r[3] = r[1] % r[2];
int j=2;
while(1)
{
q[j] = r[j-1] / r[j];
r[j+1] = r[j-1] - q[j]*r[j];
s[j] = s[j-2] - q[j-1]*s[j-1] ;
t[j] = t[j-2] - q[j-1]*t[j-1] ;
printf("|%9d|%9d|%9d|%9d|%9d![在这里插入图片描述](https://img-blog.csdnimg.cn/d8f635b67a7048dbbb86fe97beec0d29.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGl5YWho,size_20,color_FFFFFF,t_70,g_se,x_16)
|%9d|%9d|%9d|\n",j,q[j],r[j],r[j+1],s[j-1],s[j],t[j-1],t[j]) ;
if(r[j+1]==0) break;
j++;
}
printf("\n\n\n因此,s = %d, t= %d 使得\n",s[j],t[j]);
printf("\t\t\ts*a+t*b=(a,b),\n\t\t\t即(%d)*(%d)+(%d)*(%d)=%d\n",s[j],a,t[j],b,r[j]);
return 0;
}
运行代码