我们接着上面的欧几里得算法说

扩展欧几里得算法

扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式\(^①\): ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。

①:裴蜀定理:

裴蜀定理\((Bezouts identity)\)是代数几何中一个定理,其内容是若设a,b是整数,则存在整数x,y,使得ax+by=gcd(a,b),(a,b)代表最大公因数,则设a,b是不全为零的整数,则存在整数x,y,使得ax+by=(a,b),这里我们不做过多讨论(其实Base-2部分就有记录)。

附上美照:

“对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然

存在整数对 x,y ,使得 gcd(a,b)=ax+by。”我们可以这么描述扩展欧几里得算法

证明

\(gcd(a,b)=gcd(b,a\text %b),\)

令\(ax+by=gcd(a,b)=gcd(b,a \space mod\space b)=c,\)

\[bx'+(a\space mod\space b)y'=ax+by
\]

又因为\((a\space mod\space b)=a-\lfloor\frac ab\rfloor b\)

得$$bx'+ay'-\lfloor\frac ab\rfloor by'=ax+by$$

于是我们可以得到递归过程中层与层之间传递的式子:

\[x=y',y=(x'-\lfloor\frac ab\rfloor y');
\]

int exgcd(int &x,int &y,int a,int b){
if (!b) return a;
int gcd=exgcd(x,y,b,a%b);
int exx=y,exy=x-(a/b)*y;
x=exx,y=exy;return gcd;
}

代码现场手敲的,可能会错qwq

用处

扩欧的用处十分广泛,一般用于求线性同余方程中,用于求逆元过程中可以做到比快速幂更快······

计算\(ax+by=c\)的一般解

\(ax+by=c\)有无穷组解,扩欧计算出来的是其中的一个,我们称之为特解\((x_0,y_0)\),通过求出的特解,我们假设按大小排序,特解\((x_0,y_0)\)的下一组解为\((x_0+c,y_0+d)\),那么一定有:

\(a\cdot (x_0+c)+b\cdot (y_0+d)=c\)

\(ac=-bd\)

即$$\frac cd=-\frac ba=-\frac{\frac{b}{gcd(a,b)}}{\frac{a}{gcd(a,b)}}$$

所以有对于一般解\((x,y)\):\(x=x_0+k\cdot \frac{b}{gcd(a,b)};y=y_0-k\cdot \frac{a}{gcd(a,b)} ,k\in Z\)

同余

当且仅当\(m|(a-b)\)时,我们称\(a\)与\(b\)对模\(m\)同余,记作\(a\equiv b(mod\space m)\) (这里总视\(m>0\))

性质

①\(a\equiv a(mod\space m)\)

②对称性:若\(a\equiv b(mod \space m),\)则$ b\equiv a(mod\space m)$

③传递性:若\(a\equiv b (mod \space m),b\equiv c (mod \space m)\)则\(a\equiv c(mod \space m)\)

④同加同乘性:若\(a\equiv b(mod\space m),c\equiv d (mod \space m)\)则有

\(a\pm c(mod\space m)\equiv b\pm d(mod \space m),\)

\(ac(mod\space m)\equiv bd(mod \space m)\)

⑤若\(n|m,a\equiv b (mod \space m)\)则\(a\equiv b(mod\space n)\)

完全剩余系

对于一个正整数\(n\),如果一个剩余系包含了它所有可能的余数(大多数来讲为\(0,1,\ldots,n-1\)),那么这个剩余系被称为是模\(n\)的一个完全剩余系。记作\(Z_n\)

简化剩余系就是完全剩余系中与\(n\)互素的数,记作\(Z^*_n\)

线性同余方程

数论中,线性同余方程是最基本的同余方程,“线性”表示方程的未知数次数是一次.

即形如\(ax\equiv b(mod\space n)\)的方程\((n>0)\)

求解\(ax\equiv b(mod \space n)\)

关于方程\(ax\equiv b(mod\space n)\),当且仅当\(gcd(a,n)|b\)时有解。

(因为由方程可以得到:\(ax+kn=b\),

可以将此视为另一个方程,由裴蜀定理可得,当且仅当\(gcd(a,n)|b\)时此方程有解)

那么对于上面的方程$ax+kn=b,

\(令\)d=gcd(a,n)\(,则有\)d|b$

又因为\(d|a,d|n\),令\(a_0=\frac ad,n_0=\frac nd\)

有方程\(a_0x+n_0k=\frac bd\)

因为\(gcd(a_0,n_0)=1\),这个方程就可以由扩展欧几里得算法来求得

练习:青蛙的约会

题外话:裴蜀定理的证明

设\(d=gcd(a,b)\),

则有\(d|a,d|b\),易得\(d|(ax+by)\),

故\(\forall x,y\in Z,\)有\(d|(ax+by)\),

则设\(s=(ax+by)\),使\(s\)为满足\(d|(ax+by)\)的最小正值,则有\(d|s\)

令\(q=\lfloor \frac a,s\rfloor,r=a\space mod\space s=a-qs,\)

\(r=a-qax-qby=(1-qx)a+(-qy)b\)

可以看出\(r\)也表示的是\(a,b\)的线性组合,

又因为\(0\leq r<s\),\(s\)又是满足\(d|(ax+by)\)的最小正值,

所以\(r=0\),则有\(s|a,\) 同理\(s|b\),则\(s|d\),

因此可得\(d=s\),命题得证。

初等数论-Base-2(扩展欧几里得算法,同余,线性同余方程,(附:裴蜀定理的证明))的更多相关文章

  1. 详解扩展欧几里得算法(扩展GCD)

    浅谈扩展欧几里得(扩展GCD)算法 本篇随笔讲解信息学奥林匹克竞赛中数论部分的扩展欧几里得算法.为了更好的阅读本篇随笔,读者最好拥有不低于初中二年级(这是经过慎重考虑所评定的等级)的数学素养.并且已经 ...

  2. [数学基础] 4 欧几里得算法&扩展欧几里得算法

    欧几里得算法 欧几里得算法基于的性质: 若\(d|a, a|b\),则\(d|(ax+by)\) \((a,b)=(b,a~mod~b)\) 第二条性质证明: \(\because a~mod~b=a ...

  3. 题解——洛谷P2613 【模板】有理数取余(扩展欧几里得算法+逆元)

    题面 题目描述 给出一个有理数 c=\frac{a}{b}  ​ ,求  c mod19260817  的值. 输入输出格式 输入格式: 一共两行. 第一行,一个整数 \( a \) .第二行,一个整 ...

  4. 【初等数论】裴蜀定理&扩展欧几里得算法

    裴蜀定理: 对于\(a,b\in N^*, x, y\in Z\),方程\(ax+by=k\)当且仅当\(gcd(a, b)|k\)时有解. 证明: 必要性显然. 充分性:只需证明当\(k=gcd(a ...

  5. vijos1009:扩展欧几里得算法

    1009:数论 扩展欧几里得算法 其实自己对扩展欧几里得算法一直很不熟悉...应该是因为之前不太理解的缘故吧这次再次思考,回看了某位大神的推导以及某位大神的模板应该算是有所领悟了 首先根据题意:L1= ...

  6. 『扩展欧几里得算法 Extended Euclid』

    Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...

  7. 扩展欧几里得算法详解(exgcd)

    一.前言 本博客适合已经学会欧几里得算法的人食用~~~ 二.扩展欧几里得算法 为了更好的理解扩展欧几里得算法,首先你要知道一个叫做贝祖定理的玄学定理: 即如果a.b是整数,那么一定存在整数x.y使得$ ...

  8. 扩展欧几里得算法(extgcd)

    相信大家对欧几里得算法,即辗转相除法不陌生吧. 代码如下: int gcd(int a, int b){ return !b ? gcd(b, a % b) : a; } 而扩展欧几里得算法,顾名思义 ...

  9. noip知识点总结之--欧几里得算法和扩展欧几里得算法

    一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a  ...

随机推荐

  1. kubectl 常用命令一

    1.kubectl logs <options>  <PodName> -f -p, --previous --since= No. --since-time= --tail ...

  2. sklearn KMeans聚类算法(总结)

    基本原理 Kmeans是无监督学习的代表,没有所谓的Y.主要目的是分类,分类的依据就是样本之间的距离.比如要分为K类.步骤是: 随机选取K个点. 计算每个点到K个质心的距离,分成K个簇. 计算K个簇样 ...

  3. 第二季第八天 part2

    for (let i = 0; i < 3; i++) { log(i) } log(i) // 结果是 undefined let和const的作用域只在花括号内 let和const不能重复声 ...

  4. 剑指offer【10】- 变态跳台阶

    题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 关于本题,前提是n个台阶会有一次n阶的跳法.分析如下: f(1) = 1 f(2) ...

  5. logstash 使用glusterfs网络存储偶发性文件解析异常的问题

    其实问题到现在为止也没有解决 因为服务是部署在k8s上,挂载的,偶发性的出现文件解析异常 bom头已经验证过了 手动重新解析这些文件完全正常,问题无法复现,文件本身并没有问题. 最后怀疑到了最不该怀疑 ...

  6. [SDOI2010]魔法猪学院(k短路)

    A*板子题.我的code只能在luogu上过,bzoj上RE/MLE不清楚为啥. 蒟蒻到AFO前2个月不到的时间才学A*,A*其实就是bfs过程中进行剪支删除没必要的搜索.然后其实上这样剪支即可:如果 ...

  7. IE浏览器弹出的文件下载工具条实现自动另存为

    IE浏览器中如果有一个文件可以下载,用鼠标点击一下文件的超链接,会在IE浏览器下方出现一个工具条,工具条上主要有“打开” “保存”两个按钮. 如果点击“保存”按钮,会把附件保存到系统的“下载”或“Do ...

  8. axios 模拟同步请求

    axios本身没有同步请求,但是我们很多情况下必须得需要同步请求.那么应该怎么做? 上网查了一些资料有人说用es6的 async +  assert 我不知道有没有效果,因为我的功能中是没啥效果的. ...

  9. fastjon案例

    --json为json串JSONObject obj = JSON.parseObject(json);String x = obj.getString("cropId");JSO ...

  10. Momentum(动量)方法的python实现

    Momentum方法可以说是对SGD的进一步优化,细节可以参考这里 这里用python对其进行简单实现,如下: # coding=utf-8 """ 基于小批量梯度下降来 ...