扩展欧几里得

$$扩展欧几里得$$

【前置芝士】

至于欧几里得的基础算法就是辗转相除法,用式子来表示也就是,

$\forall a\ ,\ b \ , \ b \neq0, gcd(a,b) \ = \ gcd(b,a\ mod\ b) $,

对于此,也就不证明其正确性了。

【其代码实现】:

gcd(a, b)//更相减损术
    a, b = max(a, b), min(a, b)
    while a != b:
        a, b = max(b, a-b), min(b, a-b)
    return a

gcd(a, b) // 辗转相除法
    a, b = max(a, b), min(a, b)
    while a % b != 0:
        a, b = b, a%b
    return b

\(gcd(a,b)和lcm(a,b)\)

刚刚提到了\(gcd(a,v)\),那么求解\(gcd\)也就可以用上方的辗转相除法了。
那么\(lcm(a,b)\)呢,$lcm(a,b) = a / gcd(a,b) \times b $
证明如下:

\(x = gcd(a,b)\).
则显然 \(x \mid a\),\(x\mid b\).
\(a_0 = [a\ / \ x]\ , \ b_0 = [b\ /\ x]\).
\(lcm(a_0 \ , \ b_0) = a_0 \times b_0\). \(gcd(a_0,b_0) = 1\)
\(lcm(a_0,b_0) \times gcd(a_0,b_0) \times x = a_0 \times b_0 \times x\)
又因为 ,最大公约数
所以 , \(lcm(a,b)= \frac {a \times b}{x}\)
也就是 \(lcm(a,b) \times x = a \times b\)
所以 , \(lcm(a,b) \times gcd(a,b) = a \times b\)
证毕,$over \ ~ \ $

【同余的性质】

1.\(\left ( a+b \right )\mod p=\left (a\mod p+ b\mod p\right )\mod p\)
2.\(\left ( a-b \right )\mod p=\left (a\mod p- b\mod p\right )\mod p\)
3.\(\left ( a\times b \right )\mod p=\left (a\mod p)\times (b\mod p\right )\mod p\)
4.若\(a\equiv b(\mod p)\),那么\(a^{n}\equiv b^{n}(\mod p)\)
5.若\(a\mod p1=x,a\mod p2=x\),且\(p1,p2\)互质,\(a\mod (p\times q)=x\)
6.若\(a\equiv b(\mod p)\)\(k\)\(c\)为整数,而且$k> 0 \(,那么\)a^{k}c\equiv 7.b^{k}c(\mod p)\( 8.若\)ac\equiv bc(\mod p)\(,那么\)a\equiv b(\mod \frac{p}{gcd(p,c)})\(就可以推出\)gcd(p,c)=1\(,则有\)a\equiv b(\mod p)$

【正篇】


【裴蜀定理】:

【前置芝士】

【定义】:

对于任意的整数\(a,b\),关于未知数\(x,y\)的线性不定方程: 若\(a,b\)为整数,且\(gcd=d\),那么对于任意的整数\(x,y,\) \(d|(ax+by)\)


【推论】:

\(a,b\)互质的充分必要条件是存在整数\(x,y\)使\(ax+by=1\)


【证明1】:
\(d=gcd(a,b)\)\(d|a,d|b\)由整除的性质,对于任意的整数\(x,y\)\(d|(ax+by)\)

\(s\)\(ax+by\)最小正值。令\(q=[\frac{a}{s}]\)

\(r=amods=a-q(ax+by)=a(1-qy)+b(-qy)\)

可见\(r\)也为\(a,b\)的线性组合。

由于\(r\)\(mods\)所得,所以\(0 \leq r<s\)

由于\(s\)\(a,b\)线性组合的最小正值,可知\(r=0\)

\(s|a\),\(s|b\),因此,s是a与b的公约数,所以\(d>=s……\)

因为\(d|a,d|b\),且\(s\)\(a,b\)的一个线性组合,所以由整除性质知 \(d|s\)

但由于\(d|s,s>0\),所以,\(d<=s\)

综上,\(d=s\),证毕;


【证明2】
于下面中,可以通过目录跳转


【推广】:
方程 \(ax+by+cz+……nm=f\)有解的充要条件就是 \(f\)\(gcd(a,b,c,……,n)\)的倍数


【证明】:
充分性证明:

设gcd(a,b)=d,于是设a=k1d,b=k2d,c=k3*d其中k1,k2互质

那么原等式等价于k1dx+k2dy=k3d,即k1x+k2*y=k3,其中k1,k2互质

那么这个方程等价于模线性方程\begin{matrix} k1*x & \equiv & k3 &mod & k2 \end{matrix},由拓展gcd知,该方程一定有解

那么该方程的一组解即为原方程的解

必要性证明:

采用反证法,假设c不是gcd(a,b)的倍数,于是:

设a=k1d,b=k2d,c=k3*d+c{}'

那么:

k1dx+k2dy=k3*d+c{}'

两边同时除以d,有:

k1x+k2y=k3+\frac{c{}'}{d}

由于k1,x,k2,y,k3均为整数,而\frac{c{}'}{d}显然不是整数,故原方程无解

这与方程有解矛盾,故c一定为gcd(a,b)的倍数


例题:裴蜀定理

code:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int gcd(int a,int b)
{
	if(b==0) return a;
    else return gcd(b,a%b);
}
int n;
int main() 
{
    scanf("%d", &n);
    int ans = 0,s;
    for(int i=1; i<=n; i++) 
	{
        scanf("%d", &s);
        s=abs(s);
        ans = gcd(ans, s);
    }
    printf("%d", ans);
}

【扩展欧几里得】:


【杂言】:

一般是用来求解线性不定方程,同余方程和逆元的


【引理】:
存在 \(x , y\) 使得 \(gcd(a,b)=a\times x+b\times y\)(bezout定理)


————来源于李煜东《算法竞赛进阶指南》

【证明】:
在欧几里得的算法的最后一步,即\(b=0\)时,显然有一对整数\(x=1, \ , \ y = 0\),

使得\(a \times b + 0 \times 0 = gcd(a,0)\)

\(b > 0\)时,则\(gcd(a,b)=gcd(b,a \ \ mod \ \ b)\)

假设存在一对整数\(x,y\),满足\(b \times x + (a \ \ mod \ \ b ) \times y = gcd(b,a \ \ mod \ \ b)\),

因为\(b\times x + (a - b\times [a/b]) \times y = a \times y + b\times(x - [a/b]\times y)\),

所以令 \(x^{'}=y,y^{'} = x -[a/b]\times y\),

也就得到了\(a\times x^{'} + b\times y^{'}=gcd(a,b)\)

对欧几里得算法的递归过程进行数学归纳法,得证

证毕


上文的证明,就是按照欧几里得的思路来证明的,且同时给出了如何求解\(x,y\),这种的计算方法叫做 扩展欧几里得


同余方程,即和上方一致,上方已经给出了其求解\(x,y\)的值的方法了。


posted @ 2020-12-13 21:09  SkyFairy  阅读(74)  评论(0编辑  收藏  举报