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

posted @ 2019-11-01 17:48  shremier  阅读(166)  评论(0)    收藏  举报