c语言扩展欧几里得算法编程实现,C语言实现欧几里得算法与扩展欧几里得算法.doc...

C语言实现欧几里得算法与扩展欧几里得算法

1、欧几里得算法

1.1 原理阐述

欧几里得算法求最大公约数原理主要依赖于以下定理:gcd(a,b)=gcd(b,a%b)。其证明过程如下:a可以表示成a = kb + r,则r = a mod b假设d是a,b的一个公约数,则有d|a,d|b,而r = a - kb,因此d|r因此d也是(b,a mod b)的公约数因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证

1.3 C语言编程实现

以下是C语言程序代码:

#include

long Eucli(long a,long b,long &n)

{

if(b==0) return a;

{n=n+1;return Eucli(b,a%b,n);}

}

int main()

{

long a,b,n=0,d,t=0;

printf("enter the first number:\n");

scanf("%ld",&a);

printf("enter the second number:\n");

scanf("%ld",&b);

if(a

d=Eucli(a,b,n);

printf("gcd=%ld\n",d);

printf("迭代次数:%ld\n",n);

return 0;

}

下图是用VC6运行代码时的截图。

扩展欧几里得算法

2.1 原理阐述

扩展欧几里德算法是用来在已知a, b求解一组x和y,使它们满足等式: ax+by =?gcd(a, b) =d(解一定存在,根据数论中的相关定理)。即对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x和y,使得 gcd(a,b)=ax+by。

2.2 算法设计

扩展欧几里得算法,精髓在于对x和y的赋值。对于a' = b,b' = a % b 而言,我们求得 x,y使得 a'x + b'y = Gcd(a',b')由于b' = a% b = a - a / b * b 那么可以得到:a'x + b'y= Gcd(a',b') ,因而bx + (a - a / b * b),y = Gcd(a',b') = Gcd(a,b)进而可得ay +b(x - a / b*y) = Gcd(a,b)因此对于a和b而言,他们的相对应的p,q分别是y和(x-a/b*y)。具体流程图如下:

2.3 C语言编程实现

以下是C语言程序代码:

#include

long exEucli(long a,long b,long & x,long & y,long & n){

if(b == 0){ x = 1; y = 0; return a;}

n+=1;

long r = exEucli(b, a%b, x, y,n);

long t = y;y = x - (a/b)*y;x = t;

return r;

}

int main()

{

long a,b,x,y,n=0,t;

printf("enter the first number:\n");

scanf("%ld",&a);

printf("enter the second number:\n");

scanf("%ld",&b);

if(a

exEucli(a,b,x,y,n);

printf("gcd=%ld\n",a*x+b*y);

printf("迭代次数:%ld\n",n);

return 0;

}

下图是在VC6中运行代码时的截图。

两种算法运行效率比较

通过对两种算法的原理进行研究,再结合以上两张截图,我们发现,76512348两数进行最大公约数的求解中,两种递归算法的迭代次数都是12次。但是,有所不同的是,在欧几里得算法中,每次迭代进行的操作是对a和b求余数。而在扩展欧几里得算法中,每次迭代时,除了要做一次求商的之外,还要做一次乘法和减法。因此,运用欧几里得算法和扩展欧几里得算法对两个整数求最大公约数时,欧几里得算法更为高效。

1

1

开始

对a和b进行赋值

b=t

a=b

t=mod(a,b)

结束

输出最大公约数b

a%b=0

N

Y

开始

x=t

y=x-(a/b)*y

t=y

结束

输出最大公约数a*x+b*y

b=0

输入a和b

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值