扩展欧几里德

参考地址:http://baike.baidu.com/view/1478219.htm

设 a>b。   1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0;   2,ab<>0 时   设 ax1+by1=gcd(a,b);   bx2+(a mod b)y2=gcd(b,a mod b);   根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,a mod b);   则:ax1+by1=bx2+(a mod b)y2;   即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2;   根据恒等定理得:x1=y2; y1=x2-(a/b)*y2;   这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.   上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以   结束。 #include<stdio.h> int gcd(int a,int b) { if(b==0)return a; return gcd(b,a%b); } void exgcd(int a,int b,int &x,int &y) { if(b==0) { x=1; y=0; } else { exgcd(b,a%b,y,x);// 根据恒等定理得:x1=y2; y1=x2-(a/b)*y2; //可以改为ecxgcd(b,a%b,x,y) // t=x; //x=y; //y=t-(a/b)*y; y-=x*(a/b); } } int main() { int a,b; int x,y; while(scanf("%d%d",&a,&b)!=EOF) { int k=gcd(a,b); printf("123\n"); exgcd(a,b,x,y); printf("%d SSS %d %d\n",k,x,y); } } 使用扩展欧几里德算法解决不定方程的办法   对于不定整数方程pa+qb=c,若 c mod Gcd(a, b)=0,则该方程存在整数解,否则不存在整数解。   上面已经列出找一个整数解的方法,在找到p * a+q * b = Gcd(a, b)的一组解p0,q0后, /*p * a+q * b = Gcd(a, b)的其他整数解满足:   p = p0 + b/Gcd(a, b) * t   q = q0 - a/Gcd(a, b) * t(其中t为任意整数)   至于pa+qb=c的整数解,只需将p * a+q * b = Gcd(a, b)的每个解乘上 c/Gcd(a, b) 即可   在找到p * a+q * b = Gcd(a, b)的一组解p0,q0后,应该是   得到p * a+q * b = c的一组解p1 = p0*(c/Gcd(a,b)),q1 = q0*(c/Gcd(a,b)),p * a+q * b = c的其他整数解满足:   p = p1 + b/Gcd(a, b) * t   q = q1 - a/Gcd(a, b) * t(其中t为任意整数)   p 、q就是p * a+q * b = c的所有整数解。   编程时 exgcd 更多用于求解“中国余数定理”相关知识 举个例子 比如n除以5余2 除以13余3 那么n最小是多少,所有的n满足什么条件?   n(min)=42   n=42+k*65

  

原文地址:https://www.cnblogs.com/acSzz/p/2568788.html