总结——数论:欧几里得算法&扩展欧几里得证明

一 欧几里得辗转相除法算法

  设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),又因 r = a mod b,所以 gcd(a,b)=gcd(b,a mod b)

  证明:①证明充分性。

    设 d 为 a,b 的公约数,记作 d|a , d|b ,即a和b都可以被d整除

    又因 r=a-kb , 两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数, d|r , 即 d 是 (b,a mod b)的公约数,

    ②证明必要性

    设 d 为 b, a mod b 的公约数,则 d|b , d|r

    又因 a=r+kb ,所以 d 为 a 的因子,即 d|a ,因此 d 是 a,b 的公约数。

    综上,(a,b) 和 (b,a mod b) 的公约数一样,其最大公约数必然相等。

二 扩展欧几里得算法

  如果 gcd(a,b)=d , 那么一定存在整数 x,y 满足 ax+by=d.

  个人并未在网上搜到关于如上定理的严格证明,大多的关注点是求 x,y 的值。注意因为这是一个不定方程,所以解不只有一组。如果大家有相关证明可以留言讨论。x,y 值的求解:

    设存在 ax+by=gcd(a,b)

    根据欧几里得定理 gcd(a,b)=gcd( b,a mod b) ,

    可得 ax+by = gcd(a,b) = gcd(b,a mod b) = bx′+(a mod b)y′ = bx′+(a?b?[a/b])y′ = ay‘ +b(x‘ - [a/b]y‘),

    由恒等定理可知,x=y‘

            y=x‘ - [a/b] y‘

  可以看到,x,y 的值由 x‘,y‘ 得出。而 x‘,y‘ 又如何得到?

  重新来看看我们得到的两个等式。x 和 y 是 gcd(a,b)=ax+by 的解,而 x’ 和 y’ 是在对 gcd(a,b) 按欧几里德算法进行一步后的结果对应的贝祖等式 gcd(b,a mod b)=bx′+(a mod b)y′ 的解。也就是说,gcd(a,b) 对应的贝祖等式的解 x,y 可以由 gcd(b,a mod b) 对应等式的解x’,y’计算得出。

  由于欧几里德算法最后一步为 gcd(d,0)=d,此时对应等式存在解 x=1,y=0, 因此只要如上述代码,从 gcd(d,0) 往前处理,在进行欧几里德算法的递归的时候根据相邻两次调用间 x,y 和 x’,y’ 的关系计算即可求出 ax+by=gcd(a,b) 的解。

  更进一步,对于任意不定式ax′+by′=c,只需要在等式ax+by=gcd(a,b)=d两边乘上c/d即可得到解为x′=x?c/d,y′=y?c/d

原文地址:https://www.cnblogs.com/travelller/p/8452373.html

时间: 2024-10-13 08:49:59

总结——数论:欧几里得算法&扩展欧几里得证明的相关文章

[模板]欧几里得算法/扩展欧几里得

最大公因数(欧几里得算法) $gcd(a,b)=gcd(b\%a,a)$(不一定需要a<b) $gcd(0,b)=b$ 1 inline int gcd(int a,int b){ 2 return a==0?b:gcd(b%a,a); 3 } 扩展欧几里得 寻找$ax+by=gcd(a,b)$的一组解x,y(一定存在整数解) $ax+by=gcd(a,b)=gcd(b\%a,a)=(b-\lfloor\frac{b}{a}\rfloor*a)x'+ay'$ 所以有一组解$x=y'-\lfloo

【数论】【扩展欧几里得】Codeforces 710D Two Arithmetic Progressions

题目链接: http://codeforces.com/problemset/problem/710/D 题目大意: 两个等差数列a1x+b1和a2x+b2,求L到R区间内重叠的点有几个. 0 < a1, a2 ≤ 2·109,  - 2·109 ≤ b1, b2, L, R ≤ 2·109, L ≤ R). 题目思路: [数论][扩展欧几里得] 据题意可得同余方程组 x=b1(mod a1) 即 x=k1*a1+b1 x=b2(mod a2) x=k2*a2+b2 化简,k1*a1=k2*a2

【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】

Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到Catalan数,但是我却花了两个小时去找递推式. 首先 Catalan数 : 基本规律:1,2,5,14,42,132,.......... 典型例题: 1.多边形分割.一个多边形分为若干个三角形有多少种分法. C(n)=∑(i=2...n-1)C(i)*C(n-i+1) 2.排队问题:转化为n个人

数论学习之扩展欧几里得

数论之扩欧 QB_UDG 2016年11月8日11:34:40 1.       扩展欧几里德算法 用途:在已知整数a,b的情况下求不定方程ax+by=gcd(a,b)的一组整数解x,y; 原理: 设 a*x1+b*y1=gcd(a, b); 设 b*x2+(a%b)*y2=gcd(b, a%b); 由欧几里德定理知: gcd(a, b)==gcd(b, a%b) 所以==>a*x1+b*y1=b*x2+(a%b)*y2 也就是==>a*x1+b*y1=b*x2+(a-(a/b)*b)*y2

数论杂谈——欧几里得算法及扩展欧几里得

数学是oi的重要基础,所以说数论在oi中占据了非常重要的地位,因此,学好数学,对于一个oier来说也是非常重要的. oi中的数学,其实也就和数竞并没有什么区别. 欧几里得法辗转相除法求最大公约数 我们可以证明gcd(a,b)=gcd(b,a%b),也就是我国古代数学智慧的结晶,更相损减术.并且一直递归下去,直到b的值为零,最大公约数值即为a.在这里就不给出详细证明了,大家可以代几个数据去验证它一下.谁叫我数学太菜. 代码如下 int GCD(int a,int b) { if(!b) { ret

数论(欧几里得,扩展欧几里得,欧拉)

今天考试了,三道题分别是求欧拉,逆欧拉,欧拉求和 对于我这样的蒟蒻来说,我选择狗带. 爆零稳稳的. 现在整理一下: φ(n)(欧拉函数值)为不大于n的正整数中与n互质的数的个数: 有几条这样的性质: 1.欧拉函数是积性函数,但不是完全积性函数,即φ(mn)=φ(n)*φ(m)只在(n,m)=1时成立. 2.对于一个正整数N的素数幂分解N=P1^q1*P2^q2*...*Pn^qn. φ(N)=N*(1-1/P1)*(1-1/P2)*...*(1-1/Pn). 3.除了N=2,φ(N)都是偶数.

JZYZOJ1371 青蛙的约会 扩展欧几里得 GTMD数论

http://172.20.6.3/Problem_Show.asp?id=1371 http://www.cnblogs.com/jackge/archive/2013/04/22/3034925.html详细的题解,大概是网上能看到的最简单易懂的扩展欧几里得讲解了 代码 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include&

HDU 2669 (扩展欧几里得入门)

练习一下数学知识了.. [题目链接]click here~~ [题目大意]Find the nonnegative integer X and integer Y to satisfy X*a + Y*b = 1. If no such answer print "sorry" instead. 求满足式子的x和y否则输出"sorry" [解题思路]扩展欧几里得的基础了, 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足 等式: ax+by = gcd

UVa 11768 格点判定(扩展欧几里得求线段整点)

https://vjudge.net/problem/UVA-11768 题意: 给定两个点A(x1,y1)和B(x2,y2),均为0.1的整数倍.统计选段AB穿过多少个整点. 思路: 做了这道题之后对于扩展欧几里得有了全面的了解. 根据两点式公式求出直线 ,那么ax+by=c 中的a.b.c都可以确定下来了. 接下来首先去计算出一组解(x0,y0),因为根据这一组解,你可以写出它的任意解,其中,K取任何整数. 需要注意的是,这个 a' 和 b' 是很重要的,比如说 b' ,它代表的是x每隔 b