一 定义
拓展欧几里通常用于解决同余方程
同余方程:形如 a x + b y = gcd ( a , b ) ax+by =\gcd(a,b) ax+by=gcd(a,b)的方程
二 解法
因为 gcd ( a , b ) = gcd ( a , b m o d a ) \gcd(a,b) = \gcd(a,b\space mod\space a) gcd(a,b)=gcd(a,b mod a)
假设现在有 b x ′ + ( a m o d b ) y ′ = gcd ( b , a m o d b ) bx^{'}+(a\space mod\space b)y^{'} = \gcd(b, a\space mod\space b) bx′+(a mod b)y′=gcd(b,a mod b)
结合最初始的式子,对a, b进行合并同类项,可以得到 x = y ′ , y = x ′ − a / b ∗ y ′ x = y^{'}\space\space,y = x^{'} - a/b *y^{'} x=y′ ,y=x′−a/b∗y′
对这个式子进行重复的化简,最终可以得到,在b等于0的时候,我们使得 x = 1 , y = 7 x = 1,y = 7 x=1,y=7(其实这里的y可以为任意的数,都不会对最终的结果产生什么影响)随后再递归中不断得到最初始的解
三 code
#include<iostream>
#define ll long long
using namespace std;
long long x, y;
void exgcd(long long a, long long b)
{
if(b == 0)
{
x = 1;
y = 7;
return;
}
// 达到最终的状态
exgcd(b, a % b);
// 向下一层进行传导
ll tx = x;
x = y;
y = tx - a / b * y;
}
int main()
{
ll a, b;
scanf("%lld%lld",&a,&b);
exgcd(a, b);
x = (x % b + b) % b;/
printf("%lld\n", x);
return 0;
}