扩展欧几里得算法详细举例解析
欧几里得(扩展)算法
![欧几里得(扩展)算法](https://img.taocdn.com/s3/m/3d8960d688eb172ded630b1c59eef8c75fbf95e4.png)
欧⼏⾥得(扩展)算法欧⼏⾥得算法欧⼏⾥得算法⼜称辗转相除法,是指⽤于计算两个⾮负整数a,b的最⼤公约数。
应⽤领域有数学和计算机两个⽅⾯。
计算公式gcd(a,b) = gcd(b,a modb)。
证明记a|d表⽰a可以整除d(d为a的倍数)设d为a和b的公约数,即d|a,d|b。
a modb = a-kb,显然d也为a mod b 的和b的公约数。
设d为a mod b和b的公约数,即d|b,d|(a mod b)则有d|(a-kb),因为ad−kbd和bd为整数,所以ad必为整数,即d也为a和b的公约数。
综上,(a,b)与(b,a mod b)有相同的公约数,故其最⼤公约数也相等。
C++实现int gcd(int a,int b){return b==0?a:gcd(b,a%b);//其实b⽐a⼤时也是对的}扩展欧⼏⾥得算法扩展欧⼏⾥得算法是欧⼏⾥得算法(⼜叫辗转相除法)的扩展。
除了计算a、b两个整数的最⼤公约数,此算法还能找到整数x、y(其中⼀个很可能是负数)。
通常谈到最⼤公因⼦时, 我们都会提到⼀个⾮常基本的事实: 给予⼆整数 a 与 b, 必存在有整数 x 与 y 使得ax + by = gcd(a,b)。
有两个数a,b,对它们进⾏辗转相除法,可得它们的最⼤公约数——这是众所周知的。
然后,收集辗转相除法中产⽣的式⼦,倒回去,可以得到ax+by=gcd(a,b)的整数解。
证明我们先假设ax+by=gcd(a,b)①存在整数解,令r=a%b,根据假设我们⼜可以得到个式⼦:bx′+ry′=gcd(b,r)=gcd(a,b)存在整数解,将r=a−⌊ab⌋b带⼊并整理得:b(x′−⌊ab⌋y′)+ay′=gcd(a,b)②我们发现①②具有相同的形式,即①式的解可以从②式中获得:x=y′,y=x′−⌊ab⌋y′这就是说只要我们找到②式的解,就能得到①式(上⼀层)的解。
根据相同的形式,从②式的原式我们⼜可以得到rx′′+r′y′′=gcd(r,r′)=gcd(a,b),r′=b%r...根据欧⼏⾥得,这个过程会有⼀个尽头:dx+0y=gcd(a,b),其中d=gcd(a,b),为使等式成⽴,我们可以令x=1,y=0(当然也可以为其他值)这就找到了⼀组可⾏解,在⼀层层倒退回去,就能得到原始⽅程的⼀组整数解。
扩展欧几里得迭代算法
![扩展欧几里得迭代算法](https://img.taocdn.com/s3/m/71199735b6360b4c2e3f5727a5e9856a57122647.png)
扩展欧几里得迭代算法
欧几里得迭代算法是一种求解最大公约数的算法,它可以求出两个正整数a和b的最大公约数。
算法的基本思想是:
1. 计算a除以b的余数,记为r;
2. 如果r=0,则b即为最大公约数;
3. 否则,用b除以r,得到的余数记为r’;
4. 重复步骤2,直至r’=0,则最后一次计算的r即为所求的最
大公约数。
可以将欧几里得迭代算法扩展为求多个数的最大公约数的算法。
假设要求多个数a1,a2,...,an的最大公约数,算法的步骤如下:
1. 令x=a1,y=a2;
2. 计算x除以y的余数,记为r;
3. 如果r=0,则y即为所求的最大公约数;
4. 否则,令x=y,y=r;
5. 重复步骤2,直至r=0,则最后一次计算的r即为所求的最
大公约数;
6. 将a3,a4,...,an依次与最大公约数比较,如果都能整除,则最
大公约数即为所求;否则,重复步骤1,令x=最大公约数,y=a3,重新计算最大公约数,直至所有数都能整除。
扩展欧几里得算法以及求逆元的几种方法
![扩展欧几里得算法以及求逆元的几种方法](https://img.taocdn.com/s3/m/077afe7f59fafab069dc5022aaea998fcc224024.png)
扩展欧⼏⾥得算法以及求逆元的⼏种⽅法扩展欧⼏⾥得算法:ax+by=gcd(a,b)a x+by=gcd(a,b)a x+by=gcd(a,b)求出满⾜条件唯⼀的x,y的值设:设:设:r0=q1∗r1+r2r_{0}=q_{1}*r_{1}+r_{2}r0=q1∗r1+r2r1=q2∗r2+r3r_{1}=q_{2}*r_{2}+r_{3}r1=q2∗r2+r3r2=q3∗r3+r4r_{2}=q_{3}*r_{3}+r_{4}r2=q3∗r3+r4..............................rk−1=qk∗rk r_{k-1}=q_{k}*r_{k}r k−1=qk∗rk其中rk r_{k}r k就是最⼤公约数,因为rk r_{k}r k可由rk−1r_{k-1}r k−1和rk−2r_{k-2}r k−2,且rn=rn−2−qn−1∗rn−1r_{n}=r_{n-2}-q_{n-1}*r_{n-1}r n=rn−2−qn−1∗rn−1故rk−1r_{k-1}r k−1可表⽰为rk−2r_{k-2}r k−2和rk−3r_{k-3}r k−3的线性组合同理rk−2r_{k-2}rk−2也可向上表⽰。
这样得到最⼤公约数之后,⼀直向上回溯即可找到满⾜条件的x,y#include<cstdio>#include<algorithm>using namespace std;typedef long long ll;ll ExGcd(ll a,ll b,ll &x,ll &y)//求 a b 最⼤公约数,且得到gcd(a,b)=x*a+y*b;{if(!b){x=1;y=0;return a;}ll gcd=ExGcd(b,a%b,x,y);ll temp,k;k=a/b;temp=x;x=y;y=temp-k*y;return gcd;}利⽤扩展欧⼏⾥得求⼀次同余⽅程形如式⼦a∗x=c (mod m)a*x=c\ \ \ (mod \ \ m)a∗x=c (mod m),求满⾜条件的x。
sagemath扩展欧几里得算法求x和y
![sagemath扩展欧几里得算法求x和y](https://img.taocdn.com/s3/m/0d18b5a018e8b8f67c1cfad6195f312b3169ebb8.png)
sagemath扩展欧几里得算法求x和y全文共四篇示例,供读者参考第一篇示例:Sagemath是一个开源的数学软件,它可以用于代数计算、几何、数论、统计学等领域的求解。
在数论中,扩展欧几里得算法是一个用于求解给定两个整数a和b的最大公约数以及满足ax+by=gcd(a,b)的整数解x和y的算法。
在本文中,我们将介绍如何使用Sagemath来实现扩展欧几里得算法,求得整数a和b的最大公约数以及对应的整数解x和y。
Step 1:初始化我们需要将a和b初始化为要求解的两个整数,同时设置初始值x0=1,y0=0,x1=0,y1=1,以及r0=a,r1=b。
Step 2:迭代计算然后,我们可以通过迭代计算的方式来更新r、x和y的值,直到r 的值为0为止。
具体的迭代过程如下:1. 计算商和余数:q=r0//r1,r=r0%r1。
2. 更新x和y的值:x=x0-q*x1,y=y0-q*y1。
3. 更新r、x和y的索引:r0=r1,r1=r,x0=x1,x1=x,y0=y1,y1=y。
Step 3:返回结果最终,当r的值为0时,就可以得到整数a和b的最大公约数为r0,同时满足ax+by=r0的整数解x为x0,y为y0。
在Sagemath中,我们可以使用内置的函数来实现扩展欧几里得算法。
下面是一个示例代码:```pythondef extended_euclidean_algorithm(a, b):x0, y0, x1, y1 = 1, 0, 0, 1r0, r1 = a, bwhile r1 != 0:q = r0 // r1r = r0 % r1x = x0 - q * x1y = y0 - q * y1x0, y0, x1, y1 = x1, y1, x, yr0, r1 = r1, rreturn r0, x0, y0a, b = 35, 15gcd, x, y = extended_euclidean_algorithm(a, b)通过上面的示例代码,我们可以求得整数35和15的最大公约数为5,同时满足35x+15y=5的整数解x为2,y为-5。
扩展欧几里德算法
![扩展欧几里德算法](https://img.taocdn.com/s3/m/1b0bb003ec630b1c59eef8c75fbfc77da369975e.png)
扩展欧几里德算法扩展欧几里德算法是一种求解两个整数的最大公约数和一组贝祖等式的算法。
它是欧几里德算法的扩展,用于求解不仅仅是最大公约数,还有一组贝祖等式。
扩展欧几里德算法的应用非常广泛,包括密码学、线性同余方程、模运算等。
本文将介绍扩展欧几里德算法的基本原理、算法步骤和应用实例。
一、基本原理扩展欧几里德算法的基本原理是利用欧几里德算法的递归性质,将求解最大公约数的过程中,每次递归时所得到的两个余数之间的关系,通过逆向的递归过程,得到一组贝祖等式。
贝祖等式的形式为ax+by=gcd(a,b),其中a和b是待求解的两个整数,x和y是满足等式的一组整数解,gcd(a,b)是a和b的最大公约数。
二、算法步骤扩展欧几里德算法的步骤如下:Step 1:输入待求解的两个整数a和b。
Step 2:初始化r0=a,r1=b,x0=1,y0=0,x1=0,y1=1。
Step 3:使用欧几里德算法求解a和b的最大公约数gcd(r0,r1)。
Step 4:使用递归的方式,求解贝祖等式ax+by=gcd(a,b)。
Step 5:输出结果。
算法的详细步骤如下:Step 1:输入待求解的两个整数a和b。
Step 2:初始化r0=a,r1=b,x0=1,y0=0,x1=0,y1=1。
Step 3:使用欧几里德算法求解a和b的最大公约数gcd(r0,r1)。
Step 4:使用递归的方式,求解贝祖等式ax+by=gcd(a,b)。
扩展欧几里德算法的递归过程如下:1. 如果r1=0,则返回x0和y0,此时gcd(a,b)=r0。
2. 否则,计算q=r0/r1和r2=r0-q*r1。
3. 计算x2=x0-q*x1和y2=y0-q*y1。
4. 令r0=r1,r1=r2,x0=x1,x1=x2,y0=y1,y1=y2。
5. 重复步骤1-4,直到r1=0。
Step 5:输出结果。
三、应用实例扩展欧几里德算法的应用非常广泛,包括密码学、线性同余方程、模运算等。
拓展的欧几里得算法求乘法逆元
![拓展的欧几里得算法求乘法逆元](https://img.taocdn.com/s3/m/98c09819ef06eff9aef8941ea76e58fafab04564.png)
拓展的欧几里得算法求乘法逆元拓展的欧几里得算法又叫扩展欧几里得算法,是一种求解一元线性同余方程的方法,可以用来求解乘法逆元。
假设要求a在模n下的乘法逆元,即找到x满足ax ≡ 1 (mod n)。
算法步骤如下:1. 用欧几里得算法求出a和n的最大公约数gcd(a,n)以及对应的系数s和t。
2. 如果gcd(a,n)不等于1,则a在模n下没有乘法逆元。
3. 如果gcd(a,n)等于1,则ax ≡ 1 (mod n)可以转化为ax + ny = 1的形式,其中y为x的系数。
4. 用扩展的欧几里得算法求出gcd(a,n)的系数s和t,使得sa + tn = gcd(a,n)。
5. 把等式ax + ny = 1中的a用sa + tn替换,得到(sx +n'y)a + (ty) n = 1,其中n'为n的系数。
6. 取模得到(sx + n'y)a ≡ 1 (mod n),即ax在模n下的乘法逆元为sx + n'y。
举例说明:计算16在模21下的乘法逆元。
1. 计算gcd(16,21):21 = 1 × 16 + 5,16 = 3 × 5 + 1,gcd(16,21) = 1。
2. gcd(16,21) = 1,继续下一步。
3. 转化为16x + 21y = 1的形式,求出y的系数。
4. 用扩展的欧几里得算法求出gcd(16,21)的系数s和t,使得16s + 21t = gcd(16,21),得到s = 11,t = -8。
5. 代入得到(11x - 8y)16 + 21y = 1,即(11x - 8y)16 ≡ 1 (mod 21)。
6. 求解得到x = 11,即16在模21下的乘法逆元为11。
注意事项:1. 模数n必须是正整数,且与a互质,否则a在模n下没有乘法逆元。
2. 扩展的欧几里得算法有多组解,根据具体问题设置取值范围。
扩展欧几里得算法例子
![扩展欧几里得算法例子](https://img.taocdn.com/s3/m/05fc059e29ea81c758f5f61fb7360b4c2e3f2a95.png)
扩展欧几里得算法例子假设我们要解决以下整数线性方程:ax + by = c其中a、b和c是已知整数,而x和y是未知整数变量。
首先,我们将应用欧几里得算法来找到a和b的最大公约数(gcd)。
假设a = 30和b = 18,然后我们可以应用欧几里得算法如下:1.将a除以b,得到商q和余数r:30=18*1+122.将上一步的除数(18)作为新的被除数,将余数(12)作为新的除数,再次应用步骤1:18=12*1+63.再次应用步骤1:12=6*2+0可以看出,当余数为0时,说明上一步的除数就是最大公约数。
因此,gcd(30, 18) = 6接下来,我们将应用扩展欧几里得算法来找到满足给定方程的整数解。
我们将使用前面我们找到的最大公约数(gcd)来进行计算。
1. 在这个例子中,我们的最终目标是找到一个整数对(x, y),使得ax + by = c 成立。
由于gcd(30, 18) = 6,我们需要将方程除以6,以确保方程的系数都是较小的整数。
2. 我们将ax + by = c 除以gcd(a, b),即通过将a、b和c分别除以6,我们得到一个等效的方程:5x + 3y = 10。
这是由于30/6=5,18/6=3,以及c/6=10/6=10。
3.现在,我们可以开始应用扩展欧几里得算法。
我们将从最后的一对等式开始并向前推进,直到我们找到解。
3.1.3=10-5*23.2.3=10-(18-12*1)*2(将5x替换成18-12*1)3.3.3=10-18*2+12*23.4.3=-18*2+12*2+10(重新排序项)3.5. 3 = -18 * 2 + 12 * 2 + 6 * 10/6 (将等号右侧替换成10的gcd倍数)3.6.3=-18*2+(6-2*3)*2+6*10/6(将12替换成6-2*3)3.7.3=-18*2+6*2-2*3*2+10(重新排序项)3.8. 3 = -18 * 2 + 6 * 2 - 2 * 3 * 2 + 6 * 10/6 (将等号右侧替换成10的gcd倍数)3.9.3=-18*2+6*2-2*3*2+6*(18-12*1)/6(将10替换成18-12*1)3.10.3=-18*2+6*2-2*3*2+6*18/6-6*12*1/63.11.3=-18*2+6*2-2*3*2+6*18/6-6*12*1/64.经过简化,我们得到:3=18*(-5)+12*85.最后,我们可以发现,我们的方程的一组解是:x=-5,y=8,因为a*-5+b*8=c。
欧几里得算法和扩展欧几里得算法
![欧几里得算法和扩展欧几里得算法](https://img.taocdn.com/s3/m/8292da4b02d8ce2f0066f5335a8102d276a26135.png)
欧几里得算法和扩展欧几里得算法是计算最大公约数(GCD)的两种重要算法。
本文将从介绍欧几里得算法的原理、应用和代码实现,再深入扩展欧几里得算法的原理、应用和代码实现。
通过本文的阐述,读者将对这两个算法有一个清晰的认识。
一、欧几里得算法的原理1. 欧几里得算法的原理是通过递归的方式,不断用较小的数去除较大的数,直到余数为0,最后一个被除数就是最大公约数。
2. 比如计算8和12的最大公约数,用12去除8,余数为4,然后用8去除4,余数为0,所以8和12的最大公约数为4。
二、欧几里得算法的应用1. 欧几里得算法可以用于计算两个数的最大公约数,进而可以用最大公约数来简化分数。
2. 在计算机领域,欧几里得算法常用于加密算法和数据压缩算法中。
三、欧几里得算法的代码实现下面是欧几里得算法的Python实现:```pythondef gcd(a, b):if b == 0:return aelse:return gcd(b, a b)```四、扩展欧几里得算法的原理1. 扩展欧几里得算法是计算两个数的最大公约数的找出两个数的贝祖等式解的一种算法。
2. 贝祖等式是指对于已知整数a、b和它们的最大公约数d,关于未知数x和y的方程ax+by=d有整数解。
五、扩展欧几里得算法的应用1. 扩展欧几里得算法可以用于解决一元线性不定方程。
2. 在密码学中,扩展欧几里得算法常用于计算模逆元。
六、扩展欧几里得算法的代码实现下面是扩展欧几里得算法的Python实现:```pythondef ext_gcd(a, b):if b == 0:return 1, 0, aelse:x, y, gcd = ext_gcd(b, a b)return y, x - a // b * y, gcd```欧几里得算法和扩展欧几里得算法是计算最大公约数的两种重要算法,它们在数学和计算机领域有着广泛的应用。
通过对这两个算法的原理、应用和代码实现的介绍,相信读者对它们有了更清晰的认识。
扩展欧几里得算法(求逆元)总结
![扩展欧几里得算法(求逆元)总结](https://img.taocdn.com/s3/m/987a499985868762caaedd3383c4bb4cf7ecb744.png)
扩展欧⼏⾥得算法(求逆元)总结1、在RSA算法⽣成私钥的过程中涉及到了扩展欧⼏⾥得算法(简称exgcd),⽤来求解模的逆元。
2、⾸先引⼊逆元的概念:逆元是模运算中的⼀个概念,我们通常说 A 是 B 模 C 的逆元,实际上是指 A * B = 1 mod C,也就是说 A 与 B 的乘积模 C 的余数为 1。
可表⽰为 A = B^(-1) mod C。
打个⽐⽅,7 模 11 的逆元,即:7^(-1) mod 11 = 8,这是因为 7 × 8 = 5 × 11 + 1,所以说 7 模 11 的逆元是 8。
3、在RSA算法中求私钥中的整数d时,需要使得 (e * d ) % m = 1,该⽅程等价于 e * d = 1 + y * m (y为整数),也等价于 e * d - y * m = 1。
因此求解d的过程就是求解该⼆元⼀次⽅程组(e和m已知,求解d),即求e模m的逆元。
4、在使⽤扩展欧⼏⾥德算法求解e模m的逆元前,⾸先通过证明扩展欧⼏⾥得算法来对该算法有⼀个简单的理解:引理:存在 x , y 使得 gcd(a,b)=ax+by证明: 当 b=0 时,gcd(a,b)=a,此时 x=1 , y=0 当 b!=0 时, 设 ax1+by1=gcd(a,b)=gcd(b,a%b)=bx2+(a%b)y2 ⼜因 a%b=a-a/b*b 则 ax1+by1=bx2+(a-a/b*b)y2 ax1+by1=bx2+ay2-a/b*by2 ax1+by1=ay2+bx2-b*a/b*y2 ax1+by1=ay2+b(x2-a/b*y2) 解得 x1=y2 , y1=x2-a/b*y2 因为当 b=0 时存在 x , y 为最后⼀组解 ⽽每⼀组的解可根据后⼀组得到 所以第⼀组的解 x , y 必然存在 得证根据上⾯的证明,在实现的时候采⽤递归做法先递归进⼊下⼀层,等到到达最后⼀层即 b=0 时就返回x=1 , y=0再根据 x1=y2 , y1=x2-a/b*y2 ( x2 与 y2 为下⼀层的 x 与 y ) 得到当层的解不断算出当层的解并返回,最终返回⾄第⼀层,得到原解5、使⽤扩展欧⼏⾥德算法的过程如下:求exgcd(e, m)—>利⽤欧⼏⾥得算法不断递归直到x=1,y=0—>反向递归求出第⼀层的x和y,x即为e模m的逆元。
扩展欧几里德定理
![扩展欧几里德定理](https://img.taocdn.com/s3/m/a46e2fbd960590c69ec37641.png)
“扩展欧几里德原理”是由“欧几里德原理”扩展来的(PS:废话),有的书上叫“费蜀(Bezout)定理”,总之有个这个事 c=gcd(a,b)表示a,b两数的最大公约数,则存在:ax+by=c一定存在整数x,y使等式成立 先说一下“欧几里德原理”,其实就是“辗转相除法”,也就是中国老祖先的“更相减损之术”,这个算法的主要目的是求出两个数的最 大公约数,具体是一个递归的过程,简单说来是: gcd(a,b)=gcd(b,a mod b) 终止条件是:gcd(a,b)中的a mod b=0,然后输出b 证明“欧几里德原理(算法)”: (如果看不明白就跳过,本来我是不想写的,如果你达到高中毕业的数学水平就看一看,否则就会像我一样看半天明白了一点)(PS:本 人高二) 设a,b,c为三个不全为零的整数,且有整数t使:a=b*t+c,则a、b与b、c有相同的公约数,因而,gcd(a,b)=gcd(b,c),即 gcd(a,b)=gcd(b,a-b*t)(证明这个:d是a,b的公约数,则设a=d*i,b=d*j,由a=b*t+c => c=a-b*t => c=d*(i-j*t),所以,d也是c的公 约数) 欧几里德算法(辗转相除法)的工作过程如下: 1、a=b*q[1]+r[1] 2、b=r[1]*q[2]+r[2] 3、r1=r[2]*q[3]+r[4] . . . n、r[n-2]=r[n-1]*q[n]+r[n] n+1、r[n-1]=r[n]*q[n+1]+r[n+1] 此时,r[n+1]=0,因为每次带余除法,余数至少减一(因为余数比除数小,这里以第一个式子为例,这个式子相当于a除以b商q[1]余r[1], 这里一定存在b>r[1]),即b>r[1]>r[2]>r[3]>…>r[n]>r[n+1]=0,而b为有限数,因此必有一个最多不超过b的正整数n存在,使得r[n]>0, 而r[n+1]>0,故有 r[n]=gcd(r[n+1],r[n])=gcd(r[n],r[n-1])=…=gcd(r[2],r[1])=gcd(r[1],b)=gcd(a,b) 这就是“欧几里德原理(算法)”的证明 扩展“欧几里德原理(算法)”的证明: (同样,如果没有一定的数学水平也是看不了的) 其实,刚才已经证明了,因为就是辗转相除法的递推过程,大家如果不明白的话,就自己递归一下(小提示:推出的等式应该是这样的— —c=r[n]=ax+by) 有一种特殊情况,就是当gcd(a,b)=1时,存在ax+by=1,x,y存在整数解 结论(大家都可以记住的): a*x+b*y=gcd(a,b)x,y一定有整数解
扩展欧几里德算法——求最小整数解
![扩展欧几里德算法——求最小整数解](https://img.taocdn.com/s3/m/4a884a26f011f18583d049649b6648d7c1c70813.png)
扩展欧⼏⾥德算法——求最⼩整数解这是⼀个数学推导⾸先我们已经知道了,如何通过扩展欧⼏⾥德算法,求出⽅程的其中⼀组解了那么就可以继续往下看 给出两个⽅程 ax1+by1=gcd(a,b) ax2+by2=gcd(a,b) 所以可以推出 ax1+by1=ax2+by2 a(x1-x2)=b(y2-y1) 然后我们知道gcd(a,b)为a,b的最⼤公因数,所以我们将 A=a/gcd(a,b),B=b/gcd(a,b),接着往下推出 A(x1-x2)=B(y2-y1) 现在A和B两个已经是互素了,所以⼜可以接着推出 (这个地⽅要好好理解,重点!) A*(n*B)=B*(n*A) (x1-x2)=n*B (y2-y1)=n*A 这⾥我们从x⼊⼿ (x1-x2)=n*B x1=x2+n*B 由此,我们推出了x解的通解公式 x=x0+n*B 同理,我们推出了y解的通解公式 y=y0-m*A 那么我们如果要求 x 的最⼩整数解,也就是 x0, 就是 x0=x%B 如果我们要求的是 ax+by=c,还得先转化 x=x*c/gcd(a,b). 然后套⼊我们的公式 B=b/gcd(a,b) x0=x%(b/gcd(a,b)) 嗯,到此结束,下⾯给下实现代码#include <bits/stdc++.h>#include<unordered_set>//freopen("in.txt", "r", stdin);using namespace std;typedef double dou;typedef long long ll;typedef pair<ll, ll> pii;#define M 1050#define inf 0x3f3f3f3f#define mod 1000000007#define W(a) while(a)#define lowbit(a) a&(-a)#define left k<<1#define right k<<1|1#define ms(a,b) memset(a,b,sizeof(a))#define debug(a) cout<<#a<<" == "<<a<<endl#define false_stdio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)ll exgcd(ll a, ll b, ll &x, ll &y) {if (!b) {x = 1, y = 0;return a;}ll ans = exgcd(b, a%b, y, x);y -= a / b * x;return ans;}ll solve(ll a, ll b, ll c) {ll x, y, z;z = exgcd(a, b, x, y);if (c%z)return -1;//不成⽴//return x; //不需要最⼩正整数的话直接返回xx *= c / z;b = abs(b / z);return (x%b + b) % b;}int main() {false_stdio;ll a, b, c;cin >> a >> b >> c;ll x = solve(a, b, c);ll y = (c - x * a) / b;if(x>=0)//看x⼤⼩要求⽽定cout << x << ' ' << y << endl; return 0;}。
欧几里德算法及其扩展
![欧几里德算法及其扩展](https://img.taocdn.com/s3/m/189335d4011ca300a7c39058.png)
欧几里德与扩展欧几里德算法欧几里德算法欧几里德算法乂称辗转相除法,用丁计算两个整数a,b的最大公约数。
基本算法:设a=qb+r,其中a, b, q, r都是整数,贝U gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b)。
第一种证明:a 可以表示成a = kb + r ,贝U r = a mod b假设d是a,b的一个公约数,则有d|a, d|b ,而r = a - kb ,因此d|r因此d是(b,a mod b)的公约数假设d是(b,a mod b)的公约数,贝Ud | b , d |r ,但是a = kb +r因此d也是(a,b)的公约数因此(a,b)和(b,a modb)的公约数是一样的,其最大公约数也必然相等,得证第二种证明:要证欧几里德算法成立,即证:gcd(a,b)=gcd(b,r), 其中gcd是取最大公约数的意思,r=a mod b下面证gcd (a, b) =gcd (b, r)设 c 是a, b的最大公约数,即c=gcd (a, b),贝U有a=mc, b=nc,其中m, n为正整数,且m n五为质数由r= a mod b 可知,r= a- qb 其中,q是正整数,贝U r=a-qb=mc-qnc= (m-qn) cb=nc,r=(m-qn)c ,且n, (m-qn)互质(假设n, m-qn不互质,贝U n=xd, m-qn=yd 其中x,y,d都是正整数,且d>1则a=mc=(qx+y)dc, b=xdc,这时a,b的最大公约数变成dc,与前提矛盾,所以n , m-qn一定互质)贝U gcd (b,r ) =c=gcd (a,b)得证。
算法的实现:最简单的方法就是应用递归算法,代码如下: 日巳1 int gcd( int a, int b)2 (3 if (b==0)4 return a;5 return6 gcd(b,a%b);7}代码可优化如下:1 int gcd( int a, int b)2 (3 return b ? gcd(b,a%b) : a;4 }当然你也可以用迭代形式:日电1 int Gcd( int a, int b)扩展欧几里德算法基本算法:对丁不完全为0的非负整数a , b, gcd (a, b)表示a , b 的最大公约数,必然存在整数对x , y ,使得gcd (a, b) =ax+by 。
欧几里德扩展算法
![欧几里德扩展算法](https://img.taocdn.com/s3/m/35918b15bdd126fff705cc1755270722192e5904.png)
欧几里德扩展算法
欧几里德扩展算法(Extended Euclidean Algorithm)是一种用于求解两个整数的最大公约数以及满足一定条件下的贝祖等式中未
知数的整数解的算法。
该算法的基本思想是利用辗转相除法求出两个数的最大公约数,并通过递归和反向迭代来计算贝祖等式中未知数的整数解。
具体而言,设a、b为两个非负整数,且a≥b,则可将a和b表示为如下形式:
a = bq + r
其中q、r都是非负整数,且r < b。
由此可以得到gcd(a, b) = gcd(b, r),即原问题的解等价于求解新的问题gcd(b, r)。
因此,可以通过递归调用该算法来求解最大公约数。
当需要求解贝祖等式中未知数的整数解时,可以利用反向迭代的方式,从最后一个递归调用开始,依次计算每个子问题的解,并利用这些解逐步推导出当前问题的解。
具体而言,设当前递归调用求解的是gcd(a, b),并已经递归地计算出了gcd(b, r)以及未知数x、y的值,则有如下贝祖等式:
ax + by = gcd(a, b)
将a = bq + r代入上式可得:
bx1 + (a - bq)y1 = gcd(b, r)
化简后可得:
ay1 + b(x1 - qy1) = gcd(b, r)
因此,可以通过反向迭代计算未知数的值x、y,从而得到原问
题的解。
扩展欧几里得算法通解
![扩展欧几里得算法通解](https://img.taocdn.com/s3/m/86952fcd951ea76e58fafab069dc5022aaea46f0.png)
扩展欧几里得算法通解扩展欧几里得算法是一种求解最大公约数的算法,它不仅可以求出两个整数的最大公约数,还可以计算出满足贝祖等式ax + by = gcd(a, b)的整数解x和y。
在本文中,将详细介绍扩展欧几里得算法的通解。
一、欧几里得算法简介欧几里得算法,也称辗转相除法,是一种求解最大公约数的经典算法。
其基本思想是通过不断地用较小的数去除较大的数,直到两个数相等为止。
例如,求出64和40的最大公约数可以按照如下步骤进行:1. 用64除以40得到商1余24;2. 用40除以24得到商1余16;3. 用24除以16得到商1余8;4. 用16除以8得到商2余0。
因此,64和40的最大公约数为8。
二、扩展欧几里得算法原理扩展欧几里得算法是在欧几里得算法基础上发展而来的一种求解最大公约数和贝祖等式ax + by = gcd(a, b)整数解的方法。
它利用了欧几里得算法中每次迭代中计算得到的余数和商的关系,从而递归地计算出贝祖等式的整数解。
具体来说,假设需要求解a和b的最大公约数gcd(a, b),则可以按照如下步骤进行:1. 如果b等于0,则gcd(a, b)等于a,此时x=1,y=0;2. 否则,假设gcd(b, a mod b) = x1y1 + (a div b)y1,则有:gcd(a, b) = gcd(b, a mod b)= x1y1 + (a div b)y1= y1(x1 + a div b)根据以上式子,可以递归地计算出gcd(a, b)和对应的x、y值。
三、扩展欧几里得算法实现扩展欧几里得算法可以通过递归或循环实现。
以下是递归实现的代码:```int exgcd(int a, int b, int& x, int& y){if (b == 0) {x = 1;y = 0;return a;}int gcd = exgcd(b, a % b, x, y);int tmp = x;x = y;y = tmp - (a / b) * y;return gcd;}```其中,a和b是需要求解最大公约数和贝祖等式整数解的两个整数,x 和y是对应的整数解,gcd是它们的最大公约数。
用欧几里得扩展算法求67模119的逆元
![用欧几里得扩展算法求67模119的逆元](https://img.taocdn.com/s3/m/f3fc6de3b1717fd5360cba1aa8114431b90d8e14.png)
用欧几里得扩展算法求67模119的逆元欧几里得扩展算法是一种求整数逆元的常用方法,逆元的概念在数论和密码学中经常被提及。
在本篇文章中,我将以从简到繁的方式来解释欧几里得扩展算法的原理和应用,帮助你更深入地理解这一概念。
一、欧几里得算法欧几里得算法,又称辗转相除法,是求两个正整数最大公约数的一种方法。
其基本原理是利用辗转相除的过程,即不断用较小的数去除较大的数,直到余数为0为止。
这时较大的数即为最大公约数。
以求119和67的最大公约数为例,进行辗转相除的过程如下:119 ÷ 67 = 1 (52)67 ÷ 52 = 1 (15)52 ÷ 15 = 3 (7)15 ÷ 7 = 2 (1)7 ÷ 1 = 7 0根据算法得到最大公约数为1。
二、扩展欧几里得算法扩展欧几里得算法不仅可以求出最大公约数,还可以找到一组整数x 和y,使得ax + by = gcd(a, b)。
在密码学中,扩展欧几里得算法常用于求解模的逆元。
以求67模119的逆元为例,我们需要找到一个整数x,满足67x ≡ 1 (mod 119)。
使用扩展欧几里得算法,我们可以求得x的值。
我们使用欧几里得算法求得最大公约数和辅助参数:119 ÷ 67 = 1 (52)67 ÷ 52 = 1 (15)52 ÷ 15 = 3 (7)15 ÷ 7 = 2 (1)7 ÷ 1 = 7 0根据算法,得到最大公约数为1,并且可以得到一组x和y的系数:7和(-1)。
我们可以得到67模119的逆元为7。
即67*7 ≡ 1 (mod 119)。
三、个人观点和理解欧几里得扩展算法是一种非常重要的算法,它不仅能够求出最大公约数,还可以在模运算中求出逆元。
在实际应用中,逆元的概念很常见,例如在密码学的RSA加密算法中就需要用到逆元来计算私钥。
通过学习欧几里得扩展算法,我们可以更好地理解模运算和逆元的概念,提高我们的数论和密码学知识水平。
用扩展欧几里得算法求乘法逆元例题
![用扩展欧几里得算法求乘法逆元例题](https://img.taocdn.com/s3/m/2bd2b3ccc9d376eeaeaad1f34693daef5ff71349.png)
用扩展欧几里得算法求乘法逆元例题扩展欧几里得算法是计算两个整数的最大公约数的算法,并且可以根据最大公约数得到一组解,用于求解线性同余方程的解,也可以用来求乘法逆元。
下面以求解$a$的乘法逆元为例,即寻找一个整数$x$,使得$a times x equiv 1 (text{mod} p)$,其中$p$是一个质数。
使用扩展欧几里得算法,先计算$a$和$p$的最大公约数$gcd(a,p)$,假设为$d$,则有:$gcd(a,p) = d = ax + py$,其中$x$和$y$是扩展欧几里得算法得到的一组解。
由于$d$是$a$和$p$的最大公约数,所以$d$必定是$a$的约数,即$d|a$。
同时,由于$p$是质数,所以$d$不可能是$p$的约数,即$d$与$p$互质。
因此,我们可以将等式两边同时除以$d$,得到:$dfrac{a}{d}x + dfrac{p}{d}y = 1$由于$d$与$p$互质,所以$dfrac{p}{d}$的乘法逆元存在,假设为$k$,即$dfrac{p}{d} times k equiv 1 (text{mod} d)$。
将$k$乘到等式两边,得到:$dfrac{a}{d} times k times x + dfrac{p}{d} times k times y = k$由于$dfrac{p}{d} times k equiv 1 (text{mod} d)$,所以可以将$dfrac{p}{d} times k$替换为$z$,得到:$dfrac{a}{d} times k times x + z times y = k$这个等式可以看成是一个线性同余方程$dfrac{a}{d} times k times x + z times y equiv k (text{mod} d)$,使用扩展欧几里得算法求解即可得到$x$的值。
总结一下求乘法逆元的步骤:1. 使用扩展欧几里得算法计算$a$和$p$的最大公约数$gcd(a,p)$,得到一组解$x$和$y$,使得$gcd(a,p) = ax + py$。
扩展欧几里得算法详解
![扩展欧几里得算法详解](https://img.taocdn.com/s3/m/a64977034b7302768e9951e79b89680203d86b9c.png)
扩展欧⼏⾥得算法详解本篇将附上扩展欧⼏⾥得算法的思想与推导;对于⼀个⽅程a∗x+b∗y=gcd(a,b)来说,我们可以做如下的推导:设有a∗x1+b∗y1=gcd(a,b);同时我们有b∗x2+(a%b)∗y2=gcd(b,a%b);对于这个⽅程组,我们希望知道的是x1,x2,y1,y2之间的关系,这样我们才可以递归解决这个问题我们观察b∗x2+(a%b)∗y2这个式⼦,我们可以将(a%b)写作(a−⌊ab⌋∗b),将括号打开常数a,b合并,合并之后的结果为a∗y2+b∗(x2−⌊ab⌋∗y2))由于欧⼏⾥得算法的原理gcd(a,b)==gcd(b,a%b),我们将两式⼦联⽴,对⽐系数即可得到x1=y2,y1=x2−⌊ab⌋∗y2这个递归的边界是什么呢?我们知道,当朴素欧⼏⾥得到达边界时,return gcd(a,0)=a,那么边界条件就是对a∗x0+b∗y0=a求解,很显然,此时x0=1,y0=0当我们递归求出了⼀个⽅程的特解时,如何求出这个⽅程的通解呢?⽅程a∗x+b∗y=gcd(a,b)中,如果将x加上⼀个常数k1,y减去⼀个常数k2,仍然保持原⽅程成⽴,那么x+k1,y−k2就是⽅程的⼀个新解,这个k应该如何选择呢?实际上很简单,a∗(x+k1)+b∗(y+k2)=gcd(a,b),打开括号,a∗x+a∗k1+b∗y−b∗k2=gcd(a,b);我们保证原⽅程成⽴,就需要a∗k1==b∗k2,那么显然k1=b,k2=a是⼀种合理的情况,但是这样是⽆法包含所有整数解的,因为我们加上的这个值并⾮是最⼩值那我们应该加上什么值才⾏呢?我们发现当a∗k1==b∗k2=t∗lcm(a,b)可以保证得到所有解,于是每次寻找解就可以分别在x加上bgcd(a,b),在y减去agcd(a,b)就可以了对于⽅程a∗x+b∗y=c我们⼜该如何求解?我们发现如果(c%gcd(a,b)!=0)那么这个⽅程是⽆解的,⽽如果gcd(a,b)∗t==c,我们就可以按上⾯的⽅法求解之后对我们的解乘上⼀个t(t=c gcd(a,b))code:int exgcd(int a,int b,int &x1,int &y1) {if(!b){x1=1,y1=0;return a;}int x2,y2;int d=exgcd(b,a%b,x2,y2);x1=y2,y1=x2-(a/b)*y2;return d;}Processing math: 100%。
扩展的欧几里得算法求乘法逆元举例
![扩展的欧几里得算法求乘法逆元举例](https://img.taocdn.com/s3/m/a745968cfc0a79563c1ec5da50e2524de518d0ec.png)
扩展的欧几里得算法求乘法逆元举例扩展的欧几里得算法是求解线性同余方程的一种重要方法,而乘法逆元就是线性同余方程的一种特殊情况。
本文将以扩展的欧几里得算法求乘法逆元举例,为读者介绍这一算法的基本原理和应用。
一、乘法逆元的定义在模运算中,如果存在一个数a和模数m,使得a与m互质,那么我们称a在模m下有乘法逆元。
具体来说,如果存在一个数b,满足以下条件:a*b ≡ 1 (mod m)则我们称b是a在模m下的乘法逆元。
需要注意的是,不是所有数都有乘法逆元。
例如,在模10下,数2没有乘法逆元,因为它与10不互质。
二、扩展的欧几里得算法扩展的欧几里得算法是求解线性同余方程ax ≡ b (mod m)的一种方法,其中a和m是已知正整数,b是未知数。
该算法的基本思想是利用欧几里得算法求解a和m的最大公约数,并同时求得一个关于a和m的线性组合,使得它们的最大公约数等于1。
具体来说,我们可以用以下递归式表示扩展的欧几里得算法:gcd(a, m) = gcd(m, a % m)其中,%表示模运算。
当a % m = 0时,gcd(a, m) = m。
否则,我们可以继续递归,直到a % m = 0为止。
最终得到的gcd(a, m)就是a和m的最大公约数。
在递归的过程中,我们可以维护一个关于a和m的线性组合x和y,满足以下式子:gcd(a, m) = ax + my当a % m = 0时,我们有m = gcd(a, m),此时x = 0,y = 1。
否则,我们可以通过递归求得m和a % m的线性组合y1和x1,然后可以根据以下公式求得x和y:x = y1 - (a / m) * x1y = x1当我们求得了x和y之后,我们可以利用它们来求解线性同余方程ax ≡ b (mod m)的解。
具体来说,我们可以先检查gcd(a, m)是否为b的因子,如果不是,则方程无解。
否则,我们可以将方程两边同时乘以x和b / gcd(a, m),得到以下等价方程:ax * x' ≡ b / gcd(a, m) (mod m)其中,x' = x * (b / gcd(a, m))。
扩展欧几里得算法描述
![扩展欧几里得算法描述](https://img.taocdn.com/s3/m/a2c236737fd5360cba1adb63.png)
扩展欧几里得算法:欧几里得算法中,计算x, y 的最大公约数的方法是辗转相除,例如:gcd (26, 15)26 % 15 = 1 (11)15 % 11 = 1 (4)11 % 4 = 2 (3)4 % 3 = 1 (1)3 % 1 = 3 0可知,gcd (26, 15) = 1如果gcd(x, y) = r,那么有ax + by = r,可以看出,上面的步骤实际上是可以直接得出a, b 的:null26 % 15 = 1 ... 11 => 11 = 26 - 15 1 1 -115 % 11 = 1 ... 4 => 4 = 15 - 11 = 15 - (26 - 15) = -26 + 2*15 1 -1 211 % 4 = 2 ... 3 => 3 = 11 - 4*2 = (26 - 15) - (-26 + 15) * 2 = 3*26 -5*15 2 3 -54 % 3 = 1 ... 1 => 1 = 4 - 3 = (-26 + 2*15) - (3*26 - 5*15) = -4*26 +7*15 1 -4 73 % 1 = 3 0在每一轮,我们都可以得到一个模的表达式为:ri = aix + biy如果不考虑第一轮和第二轮,那么ai 和bi 可以表示为(qi 为每一轮得到的商):a i = a i-2 - q i * a i-1b i = b i-2 - q i * b i-1证明如下:输入:x,y,则有如下:x/y=q1…..r1 =>r1=x-q1*yy/r1=q2…r2 =>r2=y-q2*r1=y-q2*(x-q1*y)=-q2*x+(1+q2*q1)*y r1/r2=q3…r3 =>r3=r1-q3*r2=(x-q1*y)-q3*(-q2*x+(1+q2*q1)*y)=(1+q2*q3)x+(-q1-q3*(1+q2*q3))*y则可以看出有:a3=1+q3*q2=a1-q3*a2B3=b1-q3*b2由此可以推测出:a i = a i-2 - q i * a i-1b i = b i-2 - q i * b i-1但是a1,b1,a2,b2比较特别:a1=1=a-1 – q1*a0b1=-q1=b-1 – q1*b0由此我们可以知道a-1=1,a0=0,b-1=0,b0=1即可满足。
二进制扩展欧几里得算法
![二进制扩展欧几里得算法](https://img.taocdn.com/s3/m/ca93123d6fdb6f1aff00bed5b9f3f90f76c64d81.png)
二进制扩展欧几里得算法
二进制扩展欧几里得算法是求两个正整数a和b的最大公约数的一种高效的算法。
与传统的欧几里得算法相比,它可以大大减少递归次数,提高算法的效率。
具体实现过程如下:首先将a和b表示成二进制形式,用x和y 分别表示a和b的二进制中第一个非零位之前的零的个数,即
a=2^x*a',b=2^y*b',其中a'和b'是奇数,然后使用递归的方式求
解a'和b'的最大公约数g,如果x>y,则g*2^y是a和b的最大公约数;如果x<y,则g*2^x是a和b的最大公约数;如果x=y,则g*2^x 是a和b的最大公约数。
由于每次递归都会将a和b除以2,因此递归次数最多为
log2(max(a,b)),其中max(a,b)表示a和b中的较大值。
与传统的
欧几里得算法相比,二进制扩展欧几里得算法可以大大减少递归次数,提高算法的效率,特别是当a和b的值非常大时,效果更为明显。
二进制扩展欧几里得算法在密码学、编码理论等领域有着广泛的应用,是一种非常重要的算法。
- 1 -。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
扩展欧几里得算法
什么是GCD?
GCD是最大公约数的简称(当然理解为我们伟大的党也未尝不可)。
在开头,我们先下几个定义:
①a|b表示a能整除b(a是b的约数)
②a mod b表示a-[a/b]b([a/b]在Pascal中相当于a div b)。
即有a|b <=> b mod a=0。
③gcd(a,b)表示a和b的最大公约数
④a和b的线性组合表示ax+by(x,y为整数)。
我们有:若d|a且d|b,则d|ax+by(这很重要!)
线性组合与GCD
现在我们证明一个重要的定理:gcd(a,b)是a和b的最小的正线性组合。
例:a=6 b=4,最小正线性组合为1*a+(-1)*b=2=gcd(a,b)。
证明:
设gcd(a,b)为d,a和b的最小的正线性组合为s
∵d|a且d|b,
∴d|s。
而a mod s=a-[a/s]s
=a-[a/s](ax+by)
=a(1-[a/s]x)-b[a/s]y
亦为a和b的线性组合
∵a mod s<s,a mod s不能是a和b的最小的正线性组合
∴a mod s=0,即s|a
同理由s|b
∴s为a,b的公约数
∴s<=d
∵d|s
∴d=s。
证毕。
由这条定理易推知:若d|a且d|b,则d|gcd(a,b)
Euclid算法
现在的问题是如何快速的求gcd(a,b)。
穷举明显不是一个好方法(O(n)),所以需要一个更好的方法。
首先我们先提出一个定理:gcd(a,b)=gcd(b,a-bx)(x为正整数)。
证明:
设gcd(a,b)=d,gcd(b,a-bx)=e,则
∵d|a,d|b
∴d|a-bx
∴d|gcd(b,a-bx),即d|e
∵e|b,e|a-bx
∴e|bx+(a-bx),即e|a
∴e|gcd(a,b),即e|d
∴d=e。
证毕。
这个定理非常有用,因为它能快速地降低数据规模。
当x=1时,gcd(a,b)=gcd(b,a-b)。
这就是辗转相减法。
当x达到最大时,即x=[a/b]时,gcd(a,b)=gcd(b,a mod b)。
这个就是Euclid算法。
它是不是Euclid提出的我不知道,但听说是在Euclid时代形成的,所以就叫Euclid算法了。
程序非常的简单:
function Euclid(a,b:longint):longint;
begin
if b=0 then exit(a)
else exit(Euclid(b,a mod b));
end;
Euclid算法比辗转相减法好,不仅好在速度快,而且用起来也方便。
两种算法都有一个隐含的限制:a>=b。
用辗转相减法时,必须先判断大小,而Euclid算法不然。
若a<b,则一次递归就会转为gcd(b,a),接着就能正常运行了。
扩展Euclid
前面我们说过,gcd(a,b)可以表示为a和b的最小的正线性组合。
现在我们就要求这个最小的正线性组合ax+by中的x和y。
这个可以利用我们的Euclid算法。
从最简单的情况开始。
当b=0时,我们取x=1,y=0。
例:a=5,b=0,最小正线性组合为5*1+y*0=5,y为任意整数。
这里为方便起见规定此时y=0。
当b≠0时呢?
假设gcd(a,b)=d ,则gcd(b,a mod b)=d 。
若我们已经求出了gcd(b,a mod b)的线性组合表示bx'+(a mod b)y',则 gcd(a,b)=d
=bx'+(a mod b)y' =bx'+(a-[a/b]b)y'
=ay'+b(x'-[a/b]y')
那么,x=y',y=x'-[a/b]y'。
这样就可以在Euclid 的递归过程中求出x 和y 。
程序:
function gcd(a,b:longint):longint;
var p,n:longint;
begin
if b=0 then
begin
x:=1;
y:=0;
exit(a);
end
else
begin
p:=gcd(b,a mod b);
n:=x;
x:=y;
y:=n-a div b*y;
exit(p);
end ;
end ;
我们现在还有一个问题:x,y 是不是确定的?答案:不是。
如果x,y 符合要求,那么x+bk,y-ak 也符合要求。
不确定的原因在于这一句:“当b=0时,我们取x=1,y=0。
”实际上y 可以取任何正整数。
以gcd(26,15)为例: (26,15)
X=-4 Y=3-1*(-4)=7 26*(-4)+15*7=1 ↑
(15,11)
X=3 Y=-1-1*3=-4 15*3+11*(-4)=1 (11,4)
X=-1 Y=1-2*(-1)=3 11*(-1)+4*3=1 (4,3)
X=1 Y=0-1*1=-1 4*1+3*(-1)=1 (3,1)
X=0 Y=1-3*0=1 3*0+1*1=1 (1,0)
X=1 Y=0 1*1+0*0=1
不定方程ax+by=c
现在终于到了本文重点:解二元一次不定方程。
看起来扩展Euclid算法是不定方程的一种特殊情况,实际上呢,不定方程却是用Euclid算法解的。
对于不定方程ax+by=c,设gcd(a,b)=d,如果ax+by=c有解,则d|c(这也是许多奥数题的切入点)。
所以一旦d不是c的约数,那么ax+by=c一定无解。
当d|c时,先求出ax’+by’=d=gcd(a,b)的x'和y',由于已经有ax’+by’=d,要求ax’+by’=c,将整个式子同乘c/d倍即可。
则x=x'*c/d,
y=y'*c/d。
由上一段可知,只要ax+by=c有一个解,它就有无数个解。
Euclid算法还可以求解同余方程ax≡b(mod m)及其最小x。
这其实和不定方程ax+my=b没有区别。
(不定方程和同余方程一般都有范围限制,这其实也很容易解决,就不说了)
其他
初等数论中最基础的就是GCD以及其相关问题了。
实际上,更深层次的初等数论还包括:◆中国剩余定理
◆Miller-Rabin素性测试
◆pollard rho算法
Jollwish原创,转载请说明出处
Htfy96@修改于2012/11/21。