菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
54
0

欧几里德欧几里德原理和扩展的原则,(Euclidean Theory and Extended Euclidean Theory)学习笔记

原创
05/13 14:22
阅读数 95596

题记:这是我第四次审查扩展欧几里德原理,由于不经常使用。当你想使用,可以不记得细节,经常检查信息,所以,简单地梳理这一原则和扩展欧几里德的原则,以博客存档以备查用。

一个、欧几里德原理

欧几里德原理(Euclidean Theory)论中求两正整数最大公约数(Greatest Common Divisor, GCD)的方法。欧几里得原理在中国古代又称“辗转相除法”,这一称法揭示了其求最大公约数的过程。

对于两个正整数a,b。记其最大公约数为gcd (a,b)。

那么我们有 gcd (a,b) = gcd (b,a%b) 

即a与b的最大公约数也是a除以b的余数与b的最大公约数。

欧几里得原理能够通过递归实现,以下给出事实上现的C代码:

int gcd(int a, int b)
{
	if(b==0) return a;
	return gcd(b,a%b);
}
函数返回參数a,b的最大公约数。注意该gcd函数调用时參数a,b不应该同一时候为0,否则该函数将不存在实际意义。


二、扩展欧几里得原理

欧几里得原理的扩展版本号最经典的使用方法在于求二元一次不定方程的整数解。


(1)先来看一个最简单的二元一次不定方程:

a*x + b*y = 1     (*),且 gcd (a,b) = 1,设它的一组整数解为 x = x1, y = y1。

对于还有一个二元一次不定方程:

b*x + (a%b)*y = 1    (**),设它的一组整数解为 x = x2, y = y2。

那么我们能够得到 a*x1 + b*y1 = b*x2 +(a%b)*y2 = 1,又由于 a%b = a - a/b*b。带入前式,

我们能够得到 a*x1 + b*y1 = a*y2 + b*(x2-a/b*y2)。因为a,b是随意的互质正整数。故可由该式得到方程(*)与方程(**)的解的关系例如以下:

x1 = y2。

y1 = x2-a/b*y2。即方程(*)的解可由方程(**)的解得到。

若我们想要求得a*x + b*y = 1的解,能够先求b*x + (a%b)*y = 1的解。我们能够发现这两个方程其未知量x,y 的系数之间是“辗转相除”的关系。

那么终于我们仅仅须要求gcd (a,b)*x + 0*y = 1的解(这里gcd (a,b) = 1,其解为 x = 1。y随意,一般取0),逆推之就可得到原方程的解。而逆推的过程就是扩展欧几里得原理的过程。


(2)我们如今已经攻克了求二元一次不定方程 a*x + b*y = 1, gcd (a,b) = 1的解。

以下考察二元一次不定方程的普通情况:

对于一般的二元一次方程 m*x + n*y = t,

  • 若gcd (m,n) | t,亦即 t%gcd(m,n) == 0。方程的解将与方程 (m/gcd(m,n))*x + (n/gcd(m,n))*y = t/gcd(m,n) 的解同样。

    记新方程为 a*x + b*y = d。那么其解将是方程 a*x + b*y = 1的d倍。

    而方程 a*x + b*y = 1, gcd(a,b) = 1的解在(1)中已经求得。

  • 否则方程无整数解

上述过程即使用扩展欧几里德原理一般寻求解决的整个过程简单二元不定方程。


版权声明:本文博客原创文章,博客,未经同意,不得转载。

发表评论

0/200
54 点赞
0 评论
收藏