关于的扩展的欧几里德算法:
扩展欧几里德定理
对于与不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数。那么存在整数 x,y 使得 gcd(a,b)=ax+by。
现在我们要求求出这个x和y,以及最大公约数,怎么办?下面给你解答!
关于代码的实现:
总体来说,有两种方式,以下一一概述:
1.递推法:
具体代码实现如下:
#include<iostream>
#include<cstdio>
using namespace std;
int extended_euclidean(int n,int m,int &x,int &y)//扩展的欧几里德算法的另一种形式
{
int x1=1, x2=0, x3=n;
int y1=0, y2=1, y3=m;
while(x3%y3!=0)
{
int d=x3/y3;
int t1,t2,t3;
t1=x1-d*y1;
t2=x2-d*y2;
t3=x3-d*y3;
x1=y1; x2=y2; x3=y3;
y1=t1; y2=t2; y3=t3;
}
x=y1; y=y2;
return y3;
}
//关于递推式的推法以前听老师讲过,不过忘了,现在就只有结论了
int main()
{
int g,x,y;
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
g=extended_euclidean(n,m,x,y);
printf("%d和%d的最大公约数是:%d\n",n,m,g);
printf("%d=%d*%d+%d*%d\n",g,x,n,y,m);
}
return 0;
}
递推法的关键在于递推公式:
这个公式以前我们老师推导过,不过,现在我已经忘了,无妨,大家拿过来用就可以了!
上面的算法依靠的也是这个递推式!
2.递归法:
代码如下:
//扩展的欧几里德算法的递归形式,可以推广至全部整数范围
//回代形式
#include<iostream>
using namespace std;
int extended_euclidean(int n,int m,int &x,int &y)
{
if(m==0) { x=1;y=0;return n; }
int g=extended_euclidean(m,n%m,x,y);
int t=x-n/m*y;
x=y;
y=t;
return g;
}
int main()
{
int g,x,y;
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
g=extended_euclidean(n,m,x,y);
printf("%d和%d的最大公约数是:%d\n",n,m,g);
printf("%d=%d*%d+%d*%d\n",g,x,n,y,m);
}
}
求解 x ,y 的方法的理解
我们不妨设 n>m。
1,显然当 m=0,gcd(n,m)=n。此时 x=1,y=0;
2,nm<>0 时
设 nx1 +my1
=gcd(n,m);
mx2 +(n%m)y2
=gcd(m,n%m);
根据朴素欧几里德原理有 gcd(n,m)=gcd(m,n%m);
则:nx1 +my1 =mx2 +(n%m)y2
;
即:nx1 +my1 =mx2 +(n-(n/m)*m)y2 =ny2 +mx2-(n/m)*my2
;
根据恒等定理得:x1 =y2 ; y1 =x2-(n/m)*y2
;
这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2.
上面的思想是递归定义了,因为 gcd 不断的递归求解一定会有个时候 m=0,所以递归可以
结束。
分享到:
相关推荐
欧几里德算法和扩展欧几里德算法,经典算法系列
欧几里德算法和扩展欧几里德算法.doc
欧几里德算法和扩展欧几里德算法--透彻理解 模P乘法逆元 对于整数a、p,如果存在整数b,满足a×b mod p =1,则说,b是a的模p乘法逆元。
扩展欧几里德算法 欧几里德算法 代码 不可多得的资源
欧几里德算法和扩展欧几里德算法。用C和C++实现。.zip
acm 扩展欧几里德算法与中国剩余定理ppt教程 acmer教程系列 acm 扩展欧几里德算法与中国剩余定理ppt教程 acmer教程系列 很详细的讲解哦!
就是扩展欧几里德算法
RSA扩展欧几里德算法算例,说明RSA密钥计算过程.
Matlab,扩展欧几里德算法,求模b条件下,a的乘法逆元,函数Eulid.m,直接调用传入参数就可以用,含参数使用注释。
实现扩展欧几里得算法的代码,很简单,能够成功运行。
个人初学C++,小试身手,供参考,网上有很多,我的是原创,但不是最好的
两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们 很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为 止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的...
欧几里德算法 欧几里德算法 欧几里德算法 欧几里德算法欧几里德算法欧几里德算法欧几里德算法欧几里德算法欧几里德算法欧几里德算法欧几里德算法
包含两个功能。 one 函数计算两个多项式 a(x) 和 b(x) 在 GF(2^m) 上... 另一个函数执行扩展的欧几里德算法,其中除了 a(x) 和 b(x) 的 gcd 之外,还计算了两个多项式 u(x) 和 v(x),使得 gcd = u(x)a(x) + v(x)b(x)。
扩展欧几里得算法求逆元
------------------------------- 主要执行参考用法:usage_extendedEuclidean.m 还请在文件夹 [document] 中找到简化示例。 警告:仅供参考。 如果该实用程序有更优化的方法,请不要犹豫,建议并向作者发送反馈...
欧几里德算法和扩展.doc
用递归实现的求逆元的代码,使用中的算法是扩展的欧几里得算法。输入本元和模数,得到乘法逆元。
欧几里得是数论中的一个最初步的概念,它用来判断两个数的最大公因子,扩展的欧几里得能够进一步实现在两个数互素情况下的乘法可逆元。求可逆元是一些算法的基础。
编程实现扩展欧几里德算法,编程实现模幂运算,编程计算欧拉函数Ø(n) 编程计算欧拉函数Ø(n):编写程序, 计算自然数n(1)的欧拉函数Ø(n). 要求: 函数输入 : 自然数 n (1 ) 函数输出 : Ø(n) 利用编写的函数计算100~...