0.前言

相信大家对于欧几里得算法都已经很熟悉了。再学习数论的过程中,我们会用到扩展欧几里得算法(exgcd),大家一定也了解过。这是本蒟蒻在学习扩展欧几里得算法过程中的思考与探索过程。

1.Bézout定理

扩展欧几里得算法利用归纳法,证明了Bézout定理。

Bézout定理:对于任意整数 \(a\),\(b\) ,存在一对整数 \(x\),\(y\),满足 \(ax+by=gcd(a,b)\)

在扩展欧几里得的算法中,我们求出 \(x\),\(y\) 的值。

2.证明

2.1 \(gcd\)

首先,我们来看一下 \(gcd\) 函数

int gcd (int a, int b) {
if(b == 0) return a;
else return gcd(b, a % b);
}

在第二行,也就是递归终止时,\(b=0\) 且 \(a=gcd(a,b)\)。 我们可以发现存在一对整数 \(x\),\(y\) 满足条件 \(ax+by=gcd(a,b)\)。

将已知的值代入可得:\(ax+b*0=gcd(a,b)\)

∵\(a=gcd(a,b)\)

∴\(gcd(a,b)*x=gcd(a,b)\)

∴\(y\)在终止时可取任意值,\(x=1\)

2.2归纳法

我们在2.1中得到了 \(b=0\) 时的解。现在,我们用归纳法一步步得到最终解。当 \(b>0\) 时,我们假设 \(b*x\) 满足条件 \(b*x+(a\,mod\,b*y)gcd(b,a\,mod\,b)\)(代入的值也正是我们平时进行gcd的转移方程)

\(∵ bx+(a\,mod\,b)y=bx+[a-b(a/b)]y\)

\(∴ bx+(a\,mod\,b)y=bx+ay-by(a/b)\)

\(∴ bx+(a\,mod\,b)y=ay+bx-by(a/b)\)

\(∴ bx+(a\,mod\,b)y=ay+b[x-(a/b)y]\)

令 \(x_1=y\), \(y_1=x-(a\,mod\,b)y\),再代入已得到的式子,就能得到:

\(ax_1+by_1=gcd(a,b)\),所以可以得出Bézout定理成立。

3.代码实现

3.1思路简述

我们的代码在截止条件上与 \(gcd\) 相同,都是 if(b == 0)时停止递归。我们在此基础上再改变 \(x\) 和 \(y\) 的值。

3.2参考代码及注释

大部分都按照前面的推导过程

int exgcd(int a, int b, int &x, int &y) { //x,y的初始值无关
if(b == 0) {
x = 1, y = 0;//改变x,y的值(y可取任意值)
return a;
} else {
int tmp = exgcd(b, a % b, x, y);//保存下一次的最大公约数
int z = x; //存储上一次的x
y = x; //及上文中的y1
x = z - y * (a / b); //及上文中的x_1
return tmp;//返回最大公约数
}
}

扩展欧几里得算法(EXGCD)学习笔记的更多相关文章

  1. 扩展欧几里得算法(exGCD)学习笔记

    @(学习笔记)[扩展欧几里得] 本以为自己学过一次的知识不会那么容易忘记, 但事实证明, 两个星期后的我就已经不会做扩展欧几里得了...所以还是写一下学习笔记吧 问题概述 求解: \[ax + by ...

  2. 浅谈扩展欧几里得算法(exgcd)

    在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当a%b==0的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by ...

  3. gcd(欧几里得算法)与exgcd(扩展欧几里得算法)

    欧几里得算法: 1.定义:gcd的意思是最大公约数,通常用扩展欧几里得算法求 原理:gcd(a, b)=gcd(b, a%b) 2.证明: 令d=gcd(a, b)  =>  a=m*d,b=n ...

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

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

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

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

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

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

  7. 欧几里得算法与扩展欧几里得算法_C++

    先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...

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

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

  9. exgcd学习笔记

    扩展欧几里得算法是当已知a和b时,求得一组x和y使得 首先,根据数论中的相关定理,解一定存在        //留坑待填 之后我们可以推一推式子 将a替换掉 展开括号 提出b,合并 且 设 现在已经将 ...

随机推荐

  1. 手工数据结构系列-C语言模拟队列 hdu1276

    #include <stdio.h> #include <stdlib.h> #define init_size 1000 typedef struct { int head, ...

  2. HTML教程(看完这篇就够了)

    HTML教程 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言.您可以使用 HTML 来建立自己的 WEB 站点,HTML 运 ...

  3. vue 如何重绘父组件,当子组件的宽度变化时候

    vue 如何重绘父组件,当子组件的宽度变化时候 vue & dynamic el-popover position demo https://codepen.io/xgqfrms/pen/wv ...

  4. Dart All In One

    Dart All In One dart & flutter https://github.com/dart-lang https://github.com/dart-lang/sdk win ...

  5. div & drop

    div & drop uplaod file & prevent dropleave https://www.runoob.com/jsref/event-ondrop.html ht ...

  6. Flutter NotificationListener 监听列表的滚动

    import 'package:flutter/material.dart'; import 'package:flutter_imagenetwork/flutter_imagenetwork.da ...

  7. NGK.IO网络安全大会暨区块链安全与应用创新论坛圆满落幕

    近日,NGK.IO网络安全大会暨区块链安全与应用创新论坛于美国McCormick Place国际会议中心圆满落幕. 论坛围绕"进化繁荣发展·安全链接未来"这一主题,由NGK.IO硅 ...

  8. 2. Vue语法--插值操作&动态绑定属性 详解

    目录 1. 设置vue模板 2. vue语法--插值操作 3. 动态绑定属性--v-bind 一. 设置vue模板 我们经常新建一个vue项目的时候, 会写如下的一段代码 <!DOCTYPE h ...

  9. 【微前端】微前端最终章-qiankun指南以及微前端整体探索

    序 这才2月中旬,广州就已经渐渐地进入了夏季,--夏天总是让人焦虑的.过年闲暇时间写下了微前端这系列的终章,欢迎拍砖.如果你习惯直接上手代码,不妨跳到实践一节,直接上代码教程玩一玩. qiankun原 ...

  10. 喜忧参半的SQL Server触发器

    SQL Server触发器在非常有争议的主题.它们能以较低的成本提供便利,但经常被开发人员.DBA误用,导致性能瓶颈或维护性挑战. 本文简要回顾了触发器,并深入讨论了如何有效地使用触发器,以及何时触发 ...