扩展欧几里德算法(数论初步) By ACReaper

本文详细介绍了扩展欧几里德算法,该算法用于求解形如ax+by=d的等式的整数解,特别当gcd(a,b)=d时。文章通过逐步解析算法原理并给出C语言实现代码,帮助读者深入理解。

扩展欧几里德算法主要用来求ax + by = d这样的等式的整数解,当且仅当gcd(a,b) = d时该算法可直接求该等式,当gcd(a,b) != d时,可先求ax + by = gcd(a,b),然后按照进行值统一法,见解求解。

首先统一如下知识

1. a mod b = a - floor(a / b) * b

其实这个等式只是用数学语言描述的很严格,我们以前上小学时就学过了怎么计算除法,除不进就有余数,那是的那种方法其实就是向下取整的求法。

2.其实这个算法要理解并不难,关键是人家怎么想到的,首先我们知道gcd(a,b) == gcd(b, a mod b),也就是说ax + by = gcd(b,a mod b) = .... 直到 a’ mod b‘ == 0即gcd(b’,a' mod b'== 0),此时就代表着系数a = b‘,b = 0,我们就可以直接求出x的值了,于是又可一回代入上层的gcd(a’,b')。


算法分析:

对于b != 0,Extended-Euclid(a,b),先计算d' = gcd(b, a mod b)和d‘ = bx’ + (a mod b)y‘(由ax + by = gcd(a,b)可知),于是有d = d’ = bx‘ + (a - floor(a / b) b)y’ = ay' + b(x' - floor(a/b)y')


所以算法(伪代码)可如下

Extended-Euclid(a,b)

if(b == 0)

return (a,1,0)//gcd(a,0) == a,ax + 0 = a,x == 1

             (d',x',y')  = Extend-Euclid(b, a mod b)

            (d,x,y) = (d',y',x' - floor(a / b)y')

           return (d,x,y);


我的C代码实现

#include <stdio.h>
void Extend_Eculid(int a,int b,int &d,int &x,int &y){
	if(b == 0){
		d = a,x = 1,y = 0;
	}else{
		int x1,y1;
		Extend_Eculid(b, a % b,d,x1,y1);
		x = y1,y = x1 - (a /b) * y1; 
	}
}
int main(){
	int d,x,y;
	Extend_Eculid(99,78,d,x,y);
	printf("%d %d %d",d,x,y);
}


转载于:https://www.cnblogs.com/sixcoder/archive/2013/04/20/3826008.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值