扩展欧几里得

$$扩展欧几里得$$

【前置芝士】

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

$forall a , b , b eq0, 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) imes b $
证明如下:

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

【同余的性质】

1.(left ( a+b ight )mod p=left (amod p+ bmod p ight )mod p)
2.(left ( a-b ight )mod p=left (amod p- bmod p ight )mod p)
3.(left ( a imes b ight )mod p=left (amod p) imes (bmod p ight )mod p)
4.若(aequiv b(mod p)),那么(a^{n}equiv b^{n}(mod p))
5.若(amod p1=x,amod p2=x),且(p1,p2)互质,(amod (p imes q)=x)
6.若(aequiv b(mod p))(k)(c)为整数,而且$k> 0 (,那么)a^{k}cequiv 7.b^{k}c(mod p)( 8.若)acequiv bc(mod p)(,那么)aequiv b(mod frac{p}{gcd(p,c)})(就可以推出)gcd(p,c)=1(,则有)aequiv 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互质

那么这个方程等价于模线性方程egin{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 imes x+b imes y)(bezout定理)


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

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

使得(a imes b + 0 imes 0 = gcd(a,0))

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

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

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

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

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

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

证毕


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


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


原文地址:https://www.cnblogs.com/Zmonarch/p/14130326.html