什么是拓展欧几里得?简单的说,就是求关于x,y的方程 ax + by = gcd(a,b) 的所有整数解


现在我们来解决四个问题

  • 什么是裴属定理,如何证明裴属定理?

  • 怎么用扩展欧几里得来求ax + by = gcd(a,b) 的特解?

  • 怎么求由特解推出其他的所有解?

  • 扩展欧几里得的三大应用


一、裴蜀定理内容即证明

内容

设a, b是不全为零的整数,则存在整数x, y 使得 ax + by = gcd(a, b).

证明:

  1. a, b中假如有一个为0,则上述定理完全吻合,如a = 0, 则gcd(a, b) = b , 显然成立

  2. 若a, b 都不等于0

    gcd(a, b) = d,则d != 0

    等式两边同时除以d,得:

    a1x + b1y = 1

    再利用辗转相除法:gcd(a, b) --> gcd(b, a % b) --> ……

    设模出来的余数叫做x, 则有:

    gcd(a1, b1) = gcd(b1, r1) = gcd(r1, r2) = …… = gcd(rn-1, rn) = 1

    把辗转相除法中的运算展开,做成带余数的除法,得

    • a1 = x1b + r1

    • b1 = x2r1 + r2

    • r1 = x3r2 + r3

      ……

    • rn-3 = xn-1rn-2 + rn-1

    • rn-2 = xnrn-1 + rn

    • rn-1 = xn+1rn

    不妨令辗转相除法在除到互质的时候退出则 rn = 1 , 由倒数第二行得

    • rn-2 = xnrn-1 + 1 —> 1 = rn-2 - xnrn-1

    由倒数第三行得:**rn-1 = rn-3 - xn-1rn-2**带入上式

    得:1 = (1 + xnxn-1)rn-2 - xnrn-3

    采取同样的方法,逐个消去rn-2,……, r1

    最终会得到1 = f(x)a1 + g(x)b1

    其中f(x)和g(x) 是关于x的函数

    设f(x) = x, g(x) = y,则可以得到1 = a1x + b1y, 得证!

    正常人都不喜欢看上面写的奇奇怪怪的推导,那就看下面我这个具体的推导叭,这里是假设到 r4 = 1,然后往前推导滴

二、求特解

我们都知道,欧几里得公式可以由这个式子表达

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

通过这个式子,我们可以不断递推到b = 0, 此时a即为a和b的最大公约数

现在我们对这个式子进行展开,看看有什么好玩的嘛

gcd(a, b) = a * x1 + b * x2

gcd(b, a % b) = b * x2 + (a % b) * y2

其中a % b = a - (a / b) * b

故由第一行的欧几里得公式得:

a * x1 + b * y1 = b * x2 + {a - (a / b) * b}y2

化简得a * x1 + b * y1 = a * y2 + b * {x2 - (a / b) * y2}

根据待定系数法得到

  • x1 = y2

  • y1 = x2 - (a / b) * y2

也就是说,如果有了gcd(b, a % b)的解x2, y2就可以推出gcd(a, b)的解x1, y1

那么这就和求gcd的过程一样,一直推到最后x = 1, y = 0,就可以回溯回去,得到gcd(a, b)的特解x1, y1

特解其实是最小的一个解

二、怎么利用特解推出其他所有整数解

先说结论:

x=x0+k∗bgcd(a,b)x = x0 + k * \frac{b}{gcd(a,b)}x=x0+k∗gcd(a,b)b​

y=y0−k∗agcd(a,b)y = y0 - k * \frac{a}{gcd(a,b)}y=y0−k∗gcd(a,b)a​

任意的x + y = x0 + y0

x0, y0就是方程的特解

对于a * x + b * y = g来说,让x增加b/gcd,让y增加a / gcd

这样就相当于加a * b / gcd,减去a * b / gcd,一加一减,最终不变

三、扩展欧几里得三大应用

  • 用扩展欧几里得算法解不定方程ax+by=c

如果 c % gcd(a, b) == 0,即c 是 gcd(a, b)的整数倍,则方程有解,且解就在上面的基础上乘以cgcd(a,b)\frac{c}{gcd(a, b)}gcd(a,b)c​即可

void e_gcd(int a, int b, int &gcd, int &x, int &y)
{if (b == 0){x = 1;y = 0;gcd = a;}else{e_gcd(b, a % b, gcd, y, x);y -= x * (a / b);}
}int main(){int a, b, x, y, gcd;cin>>a>>b;e_gcd(a, b, gcd, x, y);cout<<x<<' '<<y<<endl;cout<<gcd<<endl;return 0;
}
  • 用扩展欧几里得算法求解模线性方程ax≡b (mod n)

    对于模线性方程ax≡b (mod n)可以化简为ax + ny = b,设d = gcd(a, n) 当且仅当b % d == 0时有解,且有d个解

    b % d == 0时,设ax + ny = d,的特解为x,y

    等式两边同时乘以bd\frac{b}{d}db​,则方程变成axbd+nybd=bax\frac{b}{d} + ny\frac{b}{d} = baxdb​+nydb​=b

    则原方程ax + ny = b的解为**x′=x∗bd,y′=y∗bdx' = x*\frac{b}{d},y' = y*\frac{b}{d}x′=x∗db​,y′=y∗db​**

    故**ax≡b (mod n)**的特解为 x0 = x * (b / d) % n

    d个解为xi= x0 + i*(n/d) mod n,{i = 0……n-1}

    解的间隔为n/d

void exgcd(int a, int b, int &gcd, int &x, int &y)
{if (b == 0){x = 1;y = 0;gcd = a;}else{exgcd(b, a % b, gcd, y, x);y -= x * (a / b);}
}bool modular_linear_equation(int a, int b, int n){int x, y, x0, gcd;exgcd(a, n, gcd, x, y);int d = gcd;//d为gcd(a, n)if(b % d)return false;//无解x0 = x * (b/d) % n;//特解for(int i = 0; i < d; ++i)cout<<x0 + i * (n / d)<<endl;//所有的解return true;
}
  • 用欧几里德算法求乘法逆元:

什么叫乘法逆元?

ax ≡ 1 (mod p)

这里我们称x为a关于p的逆元

上述式子可以还原为:ax + py = 1,根据上面讲的扩展欧几里得算法,我们知道gcd(a, p) = 1时才有解,通过扩展欧几里得算法得到的解x0,利用x0%p就可以得到最小解

为什么呢?

因为通解为x = x0 + p * k

那么,也就是说, a 关于 p 的逆元是一个关于 p 同余的,那么根据最小整数原理,一定存在一个最小的正整数,它是 a 关于p 的逆元,而最小的肯定是在(0 , p)之间的,而且只有一个,这就好解释了。

但是,由于问题的特殊性,有时候我们得到的特解 x0 是一个负数,还有的时候我们的 p 也是一个负数这怎么办?

当 p 是负数的时候,我们取 p 的绝对值就行了,当 x0 是负数的时候,x0% p 的结果仍然是负数(在计算机计算的结果上是这样的,虽然定义的时候不是这样的),这时候,我们仍然让 x0 对abs§ 取模,然后结果再加上abs§ 就行了,于是,我们不难写出下面的代码求解一个数 a 对于另一个数 p 的乘法逆元:

int a, b, x, y, gcd, ans, p;void exgcd(int a, int b, int &gcd, int &x, int &y)
{if (b == 0){x = 1;y = 0;gcd = a;}else{exgcd(b, a % b, gcd, y, x);y -= x * (a / b);}
}inline int cal(int a, int p){exgcd(a, p, gcd, x, y);if(1 % gcd != 0)return -1;x = x * 1 / gcd;p = abs(p);ans = x % p;if(ans <= 0)ans += p;return ans;
}

浅谈扩展欧几里得算法相关推荐

  1. 扩展欧几里得算法_扩展欧几里得递推算法

    欧几里得算法 表示 整数 a 与 b 的最大公约数. 若 t = a % b, 则 证明略. 递推版 gcd 算法 gcd 接受变量元组 (a, b) 作为输入,输出最大公约数 (r). 我们很难直接 ...

  2. 欧几里得算法扩展欧几里得算法

    欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). ...

  3. 如何利用扩展欧几里得算法求解不定方程_客户端不用的算法系列:从头条笔试题认识扩展欧几里得算法...

    难度较高,阅读时间大概 28 分钟 这是数论的第二篇,在<素数筛法>中,我们重温了素数这个数学定义,并且给出了区别于教科书上更高效的 Eratosthenes 筛法和欧拉线性筛.这篇文会从 ...

  4. Codeforces 1106F Lunar New Year and a Recursive Sequence (数学、线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...

    Codeforces 1106F Lunar New Year and a Recursive Sequence (数学.线性代数.线性递推.数论.BSGS.扩展欧几里得算法) 哎呀大水题..我写了一 ...

  5. POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)

    POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法) 手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.csdn ...

  6. GCD LCM 欧几里得算法 扩展欧几里得算法

    欧几里得算法: 辗转相除法的关键恒等式:gcd(a,b)=gcd(b,a mod b); 边界条件:gcd(a,0)=a; //最大公约数 int gcd(int a,int b) {return b ...

  7. 欧几里得算法和扩展欧几里得算法(Euclidean_Algorithm and Extended_Euclidean_Algorithm)

    一.基本概念 欧几里得算法:又名辗转相除法,计算两个整数a,b的最大公约数. 扩展欧几里得算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ...

  8. 2018/7/31 -zznu-oj -问题 C: 磨刀- 【扩展欧几里得算法的基本应用】

    问题 C: 磨刀 时间限制: 1 Sec  内存限制: 128 MB 提交: 190  解决: 39 [提交] [状态] [讨论版] [命题人:admin] 题目描述 磨刀是一个讲究的工作,只能在n℃ ...

  9. 扩展欧几里得算法 POJ 1061

    根据此题 整理下 扩展欧几里得 扩展欧几里得是用来判断并求 ax + by = c 是否有解及其解的数学算法 首先列出定理 1.ax + by = gcd(a,b) 2.gcd(a,b) = gcd( ...

  10. 欧几里得算法和扩展欧几里得算法详解

    欧几里得算法: int gcd(int x,int y){if(y) return gcd(y,x%y);return x; } 扩展欧几里得算法: 先说一个整体思路: 先求Ax+By=gcd(A,B ...

最新文章

  1. Scrum卡片层次图
  2. C# ArrayList集合
  3. matlab simulink数据导出到变量区
  4. 因果推断 - 基础知识
  5. 功能强大的滚动播放插件JQ-Slide
  6. python之os、sys和random模块
  7. [CF893F]Subtree Minimum Query
  8. 上传文件到某文件夹时,提示...路径访问被拒绝
  9. R语言︱情感分析—词典型代码实践(最基础)(一)
  10. 自学JavaWeb系列-JSP教程!
  11. 再次细分防火墙 WebRAY为何定义MAF新品类
  12. 三星gsat笔试容不容易通过
  13. css城市列表,js 获取全国城市列表方法
  14. 动态规划处理长方形分割为正方形问题
  15. Sigma algebra
  16. yocto编译错误:ERROR: libtinyxml2-XXX do_fetch: Fetcher failure for URL
  17. 信号系统服务器,四大导航系统信号介绍
  18. Ubuntu18.04下 LOAM_Velodyne 的编译安装(PCL为1.8.1)
  19. 数据文件储存服务器入什么科目,云服务器会计上入什么科目
  20. 读Java核心技术36讲有感——谈谈对Java的理解,谈谈Exception和Error

热门文章

  1. 软件开发常用的四种模式
  2. windows android系统,手机装windows系统详细方法
  3. 【屏幕PrtSc键的使用,截取对话框和全屏截取】
  4. 【作图】origin制作图中图
  5. 软件开发工程师证书有用吗_java软件工程师证书有用吗?
  6. 非线性控制1.0——模糊控制理论基础
  7. 单点登录原理及简单实现
  8. JAVA SSO单点登录原理以及实现方案
  9. 关于将网易有道词典单词本导出到必应词典生词本的尝试
  10. jquery div点击展开,点击收起,点击除了该div外任何地方,该div隐藏