最大公约数

1. 辗转相除法

辗转相除法,也称为欧几里德算法,是求两个整数的最大公约数(GCD,Greatest Common Divisor)的一种有效方法。其原理基于以下性质:对于任意两个非零整数a和b,它们的最大公约数等于b和a除以b的余数的最大公约数。数学表达式如下:

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

其中,“mod” 表示取模运算,即 a mod b 表示 a 除以 b 的余数。

辗转相除法通过不断用较小的数去除较大的数,直到其中一个数变为0,此时另一个数就是原始两个数的最大公约数。

  1. 假设两个输入的非零整数为 a 和 b,其中 a >= b。
  2. 计算 a 除以 b 的余数,记为 r(r = a mod b)。
  3. 如果 r 等于 0,则 b 就是最大公约数,算法结束。
  4. 如果 r 不等于 0,则令 a = b,b = r,并返回步骤 2。

这样,通过反复执行步骤 2 和步骤 3,直到余数为 0,最终得到的 b 就是原始两个数 a 和 b 的最大公约数。

	def gcd_euclidean(a, b):
    while b != 0:
        a, b = b, a % b
    return a

	# 示例
	num1 = 48
	num2 = 18
	result = gcd_euclidean(num1, num2)
	print(f"辗转相除法:{result}")

2.质因数分解法

质因数分解法:将两个整数分别质因数分解,然后找出它们共有的所有质因数,并将这些质因数相乘得到最大公约数。

def prime_factors(num):
    factors = []
    divisor = 2

    while divisor <= num:
        if num % divisor == 0:
            factors.append(divisor)
            num = num // divisor
        else:
            divisor += 1

    return factors

def gcd_prime_factorization(a, b):
    factors_a = prime_factors(a)
    factors_b = prime_factors(b)
    common_factors = set(factors_a) & set(factors_b)
    return max(common_factors)

# 示例
num1 = 48
num2 = 18
result = gcd_prime_factorization(num1, num2)
print(f"质因数分解法:{result}")

3.更相减损术

更相减损术:也称为欧几里德更相减损法,是欧几里德算法的变体。不同于取模运算,它使用两个数之间的差来逐步减小较大的数,直到两个数相等。然后,这两个数就是原始两个数的最大公约数。

def gcd_subtraction(a, b):
    while a != b:
        if a > b:
            a = a - b
        else:
            b = b - a
    return a

# 示例
num1 = 48
num2 = 18
result = gcd_subtraction(num1, num2)
print(f"更相减损术:{result}")

4.Stein算法(二进制GCD算法)

stein算法:这是一种用于快速计算最大公约数的算法。它基于位运算和移位操作来减小数的规模,比较适用于大整数计算。

def gcd_stein(a, b):
    if a == b:
        return a
    if a == 0:
        return b
    if b == 0:
        return a

    # 若 a 和 b 均为偶数,求得公因子2,继续化简
    if a & 1 == 0 and b & 1 == 0:
        return gcd_stein(a >> 1, b >> 1) << 1

    # 若 a 为偶数,b 为奇数,化简 b
    elif a & 1 == 0:
        return gcd_stein(a >> 1, b)

    # 若 b 为偶数,a 为奇数,化简 a
    elif b & 1 == 0:
        return gcd_stein(a, b >> 1)

    # 若 a 和 b 均为奇数,使用更相减损术,即 a - b 或 b - a
    else:
        if a > b:
            return gcd_stein(a - b, b)
        else:
            return gcd_stein(a, b - a)

# 示例
num1 = 48
num2 = 18
result = gcd_stein(num1, num2)
print(f"Stein算法:{result}")

总结

在一般情况下,Stein算法(二进制GCD算法)通常被认为是最高效的求解最大公约数的方法。它是辗转相除法的优化版本,通过使用位运算和移位操作来加快计算速度。

Stein算法具有以下优势:

  • 减少了大整数的除法操作,使用位运算和移位操作,这在计算机中更高效。

  • 在一次循环中可以消除多个公因子2,因此对于包含大量公因子2的数,效率更高。

  • 与辗转相除法相比,减少了迭代次数,因此在某些情况下,计算速度更快。

尽管Stein算法在一般情况下效率较高,但它不一定在所有情况下都是最优的。对于较小的整数,其他方法如辗转相除法、更相减损术或质因数分解法也可能表现得很好。然而,在大多数情况下,特别是处理大整数时,Stein算法通常是推荐的选择,因为它在大整数计算中表现出色。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_56318237

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值