C语言计算贝祖算法,欧几里德算法及贝祖公式

一、欧几里德算法

欧几里德算法是一个用来求两个整数的最大公约数的算法,他也叫辗转相除法。定理如下:

gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b

不为0) gcd(greatest

common divisor)

证明如下:

a可以表示成a = kb + r,则r = a mod b

假设d是a,b的一个公约数,则有a能被d整除,b能被d整除,所以r=a-kb也能被d整除,因此d也是(b,a mod

b)的公约数;

反推,假设d是a,a mod b 的公约数,则有b能被d整除,r能被d整除,所以a = kb+r

也能被d整除,因此d是(a,b)的公约数。

因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证

通过该定理,要如何求最小公约数呢?就是不断的运用原理“两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。”,将两个数缩小,直到一个数为0,另一个数就是最小公约数。

例如:求9和12的公约数,gcd(9,12)= gcd(9,12-9)=gcd(9,3)  =

gcd(9-3,3)=gcd(6,3) =gcd(6-3,3)=gcd(3,3) =gcd(3-3,3) = gcd(0,3) =

3。这个过程可以在计算机中迭代完成。

二、扩展欧几里德算法

仅仅求最大公约数,貌似没什么牛逼的,但由欧几里德算法也可以推出,两数的最大公约数可以用两数的整数倍相加来表示,如3=

1 × 9+ (−1) × 12。这个重要的等式叫做贝祖等式。定理如下:

给予二整数 a 与 b, 必存在有整数 x 与 y 使得ax +

by = gcd(a,b)

且:gcd(a,b)是a,b的最小正线性组合。例如:9x+12y无论如何都得不到2或1。

关键是,如何求x,y???

当b=0时,gcd(a,b)=1*a+0*b。即x=1 y=0。

当b≠0时: 假设gcd(a,b)=d,则gcd(b,a mod b)=d。若我们已经求出了gcd(b,a mod b)的线性组合表示

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'。

那要怎么知道gcd(b,a mod b)的线性组合呢?通过辗转相除不是可以将gcd(a,b)化成gcd(d,0)吗?这样就可以求出初始的x0,y0;然后不断迭代,求出x,y。(迭代公式:x=y',y=x'-[a/b]y')如果x,y符合要求,那么

x+bk,y-ak也符合要求。

如果

x,y

符合要求,那么

x+bk,y-ak

也符合要求。

例如:求47*x+30*y=1 的x,y。

通过欧几里德算法求得a,b值如下表,对应由下之上递推求出x,y

a

b

47

30

30

17

17

13

13

4

4

1

1

0

x=y'

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

1

0

0

1-[4/1]*0 =1

1

0-[13/4]*1 = -3

-3

1-[17/13]*-3 = 4

4

-3-[30/17]*4 = -7

-7

4-[47/30]*-7 = 11

从而得到最终的x=-7,y=11 即-7*47 + 30*11 = 1。 且-7+30*1=23

11-47*1=-36 也符合要求。

c++语言实现:

int x,y;

void extend_Eulid(int a,int b)

{

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

else

{

extend_Eulid(b,a%b);

int temp = x;

x = y; y = temp - a/b*y;

}

}

三、不定方程ax+by=c 对于不定方程ax+by=c,设gcd(a,b)=d,如果ax+by=c有解,则c一定能被d整除。

当c不能被d整除时,那么 ax+by=c一定无解。

当c能被d整除时,先通过上述算法求出ax'+by'=d=gcd(a,b)的x'和y',则x=x'*c/d,y=y'*c/d。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值