欧几里得算法求两个正整数的最大公因子

本文介绍了Euclid算法,一种高效求解两个正整数最大公因子的方法。基于定理gcd(a,b)=gcd(b,a mod b),通过迭代或递归方式实现。提供了Java语言的非递归与递归版本代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Euclid算法(即欧几里得算法)是求两个正整数的最大公因子的算法。


我们用gcd(a, b)表示a和b的最大公因子。则

    gcd(a, b) = max[k, 其中k | a 且k | b]

因为我们所求的最大公因子是正数,所以gcd(a, b) = gcd(a, -b) = gcd(-a, b) = gcd(-a,-b)。一般来说,gcd(a, b) = gcd(|a|, |b|)。

Euclid算法基于以下的定理:

对于任意非负整数a和任意正整数b,有:

gcd(a,b) = gcd(b,a mod b) (a>b 且a mod b 不为0)  (1)

定理证明:

假设d = gcd(a, b),根据gcd的定义,则有d|a,  d|b成立。对于任意正整数a, b可以表示成如下形式:

      a = kb + r≡ r mod b

      amod b = r                       其中k,r为整数。

因此,对某个整数k,有(a mod b) = a – kb。

因为 d|b, d|kb,且d|a,所以有d|(a mod b),这说明d是b和(a mod b)的公因子。反之,如果d是b和(a mod b)的公因子,那么d|kb,并且由此可知d|[kb + (a mod b)],即d|a,因此a和b公因子的集合与b和(a mod b)公因子的集合相等。因此,两对数的gcd相同,定理得证。


Euclid算法通过重复使用公式(1)来求最大公因子。算法中假设a > b > 0。因为gcd(a, b) = gcd(|a|, |b|),所以仅考虑正整数的情况即可。


算法过程如下:

1、A←a, B←b

2、若B = 0,则返回A=gcd(a, b)

3、R = A modB

4、A←B

5、B←R

6、转到2

以下Java实现Euclid算法的非递归版和递归版代码:

public class Euclid {
	public static void main(String[] args) {
		System.out.println("No recursive gcd = " + gcd(1970, 1066));
		gcdR(1970, 1066);
		System.out.println("Recursive gcd = " + gcdR(1970, 1066));
	}
	// 非递归版
	private static int gcd(int a, int b){
		if(b == 0){
			return a;
		}
		int r;
		while(b != 0){
			r = a % b;
			a = b;
			b = r;
		}
		return a;
	}
	// 递归版
	private static int gcdR(int a, int b){
		if(b == 0){
			return a;
		}
		return gcdR(b, a % b);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值