exgcd 和 gcd
数论
"前置的"裴蜀定理
\[ax+by=c
\]
这样的方程有整数解当且仅当
\[\gcd(a,b)|c
\]
我们假设你有兴趣看证明(当然可以跳过)
开始证明
-
\[\gcd(a,b)|a,\gcd(a,b)|b \]
-
\[\gcd(a,b)|ax,\gcd(a,b)|by \]
-
\[\gcd(a,b)|ax+by \]
-
\[c=ax+by \]
-
\[gcd(a,b)|c \]
证毕
\(gcd\) & \(exgcd\)
gcd
\[\gcd(a,b)=\gcd(b,a mod b)
\]
这个结论还是比较显然的
给出代码:
int gcd(int a,int b)
{
return b ? gcd(b,a%b) : a;
}
exgcd
什么是exgcd呢----
就是解
\[ax+by=\gcd(a,b)
\]
这样的方程
那么怎么解呢?
首先有一个非常显然的结论
\[ax+by=\gcd(a,b)
\]
\[bx+(a \bmod b)y=\gcd(b,a \bmod b)
\]
是同解的
那么可以递归求到解集
那么怎样解方程呢?
(突然不想写了)
我们给出边界条件
\[ax+by=\gcd(a,b) (a=1,b=0)
\]
时有\(x=1,y=0\)为其边界解
那么给出代码:
int exgcd(int a,int b,int &x,int &y)
{
if(!b) {y=0,x=1;return a;}
int ans = exgcd(b,a%b,x,y);
int sp = x;
x = y;
y = sp - a / b * y;
return ans;
}
exgcd的一些应用
- 求解\(ax+by=c\)这样的方程
- 求逆元(有关这个可以开一篇求逆元的blog,这里不做讨论)
- 求同余方程
我们依次说明
求解\(ax+by=c\)
根据裴蜀定理,有\(\gcd(a,b)|c\)
所以显然 对于每一个由exgcd的解对它 \(*c/\gcd(a,b)\)即可 这里日后可能会给一些代码
同余方程
\(ax≡c(mod p)\)
将其转化为ax+py=c

浙公网安备 33010602011771号