扩展欧几里德求这样一个问题:
a x + b y = gcd ( a , b ) ax+by=\gcd(a,b) a x + b y = g cd( a , b )
其中,a , b a,b a , b 给定,需要求出 x x x 和 y y y 。
我们知道
gcd ( a , b ) = gcd ( b , a m o d b ) \gcd(a,b)=\gcd(b,a \bmod b)
g cd( a , b ) = g cd( b , a mod b )
所以,假设以递归的方式实现,得出上一步等式为:
b x ′ + y ′ ( a m o d b ) = gcd ( b , a m o d b ) = gcd ( a , b ) bx'+y'(a \bmod b)=\gcd(b,a \bmod b)=\gcd(a,b)
b x ′ + y ′ ( a mod b ) = g cd( b , a mod b ) = g cd( a , b )
展开:
b x ′ + y ′ ( a − b ⋅ ⌊ a b ⌋ ) = gcd ( a , b ) bx'+y'(a-b\cdot\lfloor \frac{a}{b}\rfloor)=\gcd(a,b)
b x ′ + y ′ ( a − b ⋅ ⌊ b a ⌋) = g cd( a , b )
b x ′ + a y ′ − y ′ ( b ⋅ ⌊ a b ⌋ ) = gcd ( a , b ) bx'+ay'-y'(b\cdot\lfloor \frac{a}{b}\rfloor)=\gcd(a,b)
b x ′ + a y ′ − y ′ ( b ⋅ ⌊ b a ⌋) = g cd( a , b )
将关于 a a a 的放在左边,关于 b b b 放在右边:
a y ′ + b x ′ − b y ′ ⋅ ⌊ a b ⌋ = gcd ( a , b ) ay'+bx'-by'\cdot\lfloor \frac{a}{b}\rfloor=\gcd(a,b)
a y ′ + b x ′ − b y ′ ⋅ ⌊ b a ⌋ = g cd( a , b )
a y ′ + b ( x ′ − y ′ ⋅ ⌊ a b ⌋ ) = gcd ( a , b ) ay'+b\,(x'-y'\cdot\lfloor \frac{a}{b}\rfloor)=\gcd(a,b)
a y ′ + b ( x ′ − y ′ ⋅ ⌊ b a ⌋) = g cd( a , b )
比较这个式子和开头式子,可得:
x = y ′ x=y'
x = y ′
y = x ′ − y ′ ⋅ ⌊ a b ⌋ y=x'-y'\cdot\lfloor \frac{a}{b}\rfloor
y = x ′ − y ′ ⋅ ⌊ b a ⌋
于是就可以递归啦!
顺带一提,当 a = 1 , b = 0 a=1,b=0 a = 1 , b = 0 ,也就是边界时,返回 x ′ = 1 , y ′ = 0 x'=1,y'=0 x ′ = 1 , y ′ = 0
code:
1 2 3 4 5 6 7 8 9 10 11 12 void exgcd (int a,int b,int &x,int &y) { if (b==0 ){ x=1 ;y=0 ; return ; } exgcd (b,a%b,x,y); int z=x; x=y; y=z-y*(a/b); }