我恨数论

因为打这篇的时候以为a|b是a是b的倍数,但是懒得改了,索性定义 a|b 为 a是b的倍数

咳咳,那么进入正题,如何证明gcd,也就是 gcd(a,b) = gcd(b,a%b)?

首先,设

p = a/b,c = a mod b

则a = p*b + c

m = gcd(a,b),n = gcd(b,c)

因为m = gcd(a,b),所以 a | m 且 b | m

因为 b | m

所以 b * p | m                //  a|b,则a*k|b (k为整数)

因为a | m

所以a - b * p | m           //   a|b,则k*b - a | b (k为整数)

因为 a = p*b + c

所以 c = a - p*b

所以 c | m

因为c | m,且b | m

所以m为 c,b的公约数

因为n为 c,b的最大公约数

所以m <= n

因为n = gcd(b,c)

所以 b | n , c | n

因为 b | n

所以 b * p | n

因为 c | n

所以 b * p + c | n

因为 a = b * p + c

所以a | n

因为a | n,且 b | n

则n为a,b的公约数

因为m为a,b的最大公约数

所以 n <= m

因为m <= n

所以m = n

所以gcd(a,b) = gcd(b,c)

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

整体思路是:

先设出一个关系,然后通过关系证明它们的另一个关系

从gcd(a,b)转换得到b,c是公约数关系,

从gcd(b,c)转换得到a,b是公约数关系,

分别得到它们的大小关系,最后求公共解集,得到两个gcd相等

然后把c带上去,得到我们要证的式子

证完了gcd,下面可以证exgcd

exgcd 可以求

ax + by = gcd(a,b) 中的x,y

那么,我们设

ax1 + by1 = gcd(a,b)

由gcd得出

ax1 + by1 = gcd(b,a mod b)

设bx2 + a mod b y2 = gcd(b,a mod b)

下面用x2开始化简:

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

gcd(b, a mod b) = b * x2 + (a - floor(a/b) * b) * y2

gcd(b, a mod b) = b * x2 + a * y2 - floor(a/b) * b * y2

gcd(b, a mod b) = a * y2 + b * x2 - floor(a/b) * b * y2

gcd(b, a mod b) = a * y2 + b * (x2 - floor(a/b) * y2)

所以

ax1 + by1 = gcd(b, a mod b) = bx2 + a mod b y2 = a * y2 + b * (x2 - floor(a/b) * y2)

所以第一个式子与最后一个式子等量代换得到

x1 = y2

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

然后可以通过以上等价式子写出递归,得到x1、y1。

【数论】如何证明gcd/exgcd的更多相关文章

  1. 数论入门2——gcd,lcm,exGCD,欧拉定理,乘法逆元,(ex)CRT,(ex)BSGS,(ex)Lucas,原根,Miller-Rabin,Pollard-Rho

    数论入门2 另一种类型的数论... GCD,LCM 定义\(gcd(a,b)\)为a和b的最大公约数,\(lcm(a,b)\)为a和b的最小公倍数,则有: 将a和b分解质因数为\(a=p1^{a1}p ...

  2. gcd, exgcd的证明

  3. Gcd&Exgcd算法学习小记

    Preface 对于许多数论问题,都需要涉及到Gcd,求解Gcd,常常使用欧几里得算法,以前也只是背下来,没有真正了解并证明过. 对于许多求解问题,可以列出贝祖方程:ax+by=Gcd(a,b),用E ...

  4. 简单数论总结1——gcd与lcm

    并不重要的前言 最近学习了一些数论知识,但是自己都不懂自己到底学了些什么qwq,在这里把知识一并总结起来. 也不是很难的gcd和lcm 显而易见的结论: 为什么呢? 根据唯一分解定理: a和b都可被分 ...

  5. gcd&&exgcd&&斐蜀定理

    gcd就是求a和b最大公约数,一般方法就是递推.不多说,上代码. 一.迭代法 int gcd(int m, int n) { ) { int c = n % m; n = m; m = c; } re ...

  6. Gcd&Exgcd

    欧几里得算法: \[gcd(a,b)=gcd(b,a\bmod b)\] 证明: 显然(大雾) 扩展欧几里得及证明: 为解决一个形如 \[ax+by=c\] 的方程. 根据裴蜀定理,当且仅当 \[gc ...

  7. 【数论】二进制GCD

    二进制GCD     GCD这种通用的算法相信每个OLER都会 ,辗转相除,代码只有四行 : int GCD(int a,int b){ if(b==0) return a; return GCD(b ...

  8. 约数,gcd,exgcd.

    很多题都是要求出什么最大公约数或者最小公倍数什么的,也有一些题目是和约数个数有关的,所以需要总结一下. 首先最大公约数和最小公倍数怎么求呢? 当然是观察法了,对于一些很聪明的孩纸他们一般随便一看就秒出 ...

  9. 算法马拉松35 E 数论只会Gcd - 类欧几里得 - Stern-Brocot Tree - 莫比乌斯反演

    题目传送门 传送门 这个官方题解除了讲了个结论,感觉啥都没说,不知道是因为我太菜了,还是因为它真的啥都没说. 如果 $x \geqslant y$,显然 gcd(x, y) 只会被调用一次. 否则考虑 ...

随机推荐

  1. Android SDK上手指南:下一步学习方向

    Android SDK上手指南:下一步学习方向 2014-02-28 11:01 核子可乐 译 51CTO 字号:T | T 到目前为止,我们已经介绍过的知识足以帮助大家从非常理想的起点开始进行And ...

  2. 499 单词计数 (Map Reduce版本)

    原题网址:https://www.lintcode.com/problem/word-count-map-reduce/description 描述 使用 map reduce 来计算单词频率http ...

  3. grpc之protobuf常用语法速学

    1,语法速学(1):返回商品”数组”.repeated修饰符 Repeated:是一个修饰符,返回字段可以重复任意多次(包括0次) 可以认为就是一个数组(切片) 服务端: 创建protobuf文件 s ...

  4. 二、Python安装和第一个程序

    <1.Python语言介绍1.官方介绍:Python 是一款易于学习且功能强大的编程语言. 它具有高效率的数据结构,能够简单又有效地实现面向对象编程.Python 简洁的语法与动态输入之特性,加 ...

  5. HBase 三维模型解析

    总结下一直想写hbase的实践经验,在用hbase的过程中,我们都知道,rowkey设计的好坏,是我们能最大发挥hbase的架构优势,也是我们是否正确理解hbase的一个关键点.闲话少说,进入正题. ...

  6. Hadoop 集群网络拓扑

  7. Leetcode400Nth Digit第N个数字

    在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字. 注意: n 是正数且在32为整形范围内 ( n < 231). 示例 1: ...

  8. Linux驱动手动绑定和解绑定方法

    linux内核从2.6.13-rc3开始,提供了在用户空间,可动态的绑定和解绑定设备和设备驱动之间关系的功能.在这之前,只能通过insmod(modprobe)和rmmod来绑定和解绑,而且这种绑定和 ...

  9. IntersectionObserver API 使用教程(转载)

    作者: 阮一峰 日期: 2016年11月 3日 网页开发时,常常需要了解某个元素是否进入了"视口"(viewport),即用户能不能看到它. 上图的绿色方块不断滚动,顶部会提示它的 ...

  10. Redis使用:聚合类型为空时,会自动被Redis删除

    项目中使用Redis来记录用户的上线和下线信息,其中用到了集合(sets)类型,某用户上线时,向sets中添加数据,下线时将相应数据从sets中删除,考虑当该用户的所有实例都下线时,需要将sets删除 ...