📜  给定乘积的 N 个整数的最大 GCD(1)

📅  最后修改于: 2023-12-03 15:41:16.379000             🧑  作者: Mango

给定乘积的 N 个整数的最大 GCD

介绍

最大公约数(GCD)是指两个或多个整数共有约数中最大的那一个,用于计算给定整数的公共因数。

本篇介绍给定乘积的 N 个整数的最大 GCD,即给定 N 个数的乘积,求这 N 个数的最大公约数。

解法

首先将乘积因数分解,得到每个因子的次数。

然后我们可以注意到:对于一个给定的因数,它在所有 N 个数的最大公约数中的次数,就是这个因数在 N 个数因子分解后次数的最小值。

因此,我们可以通过扫描所有给定数的因子次数,得到它们每个因子在所有给定数的最大公约数中的次数,并计算它们的 GCD,即为最大 GCD。

该算法的时间复杂度为 O(nlogn),其中 n 为所有因子的数量。在实际应用中,若给定数的范围较小,可使用线性筛及欧拉定理进行优化,时间复杂度降至 O(NlogN)。

代码

以下是 Python 语言的示例代码:

def gcd(nums):
    """
    计算给定整数的最大公约数
    """
    def factorize(num):
        """
        将一个数进行因数分解,返回因子及其次数的字典
        """
        factors = {}
        for i in range(2, int(num ** 0.5) + 1):
            while num % i == 0:
                factors[i] = factors.get(i, 0) + 1
                num //= i
        if num > 1:
            factors[num] = factors.get(num, 0) + 1
        return factors

    factor_counts = {}
    for num in nums:
        factors = factorize(num)
        for factor, count in factors.items():
            factor_counts[factor] = factor_counts.get(factor, []) + [count]

    max_gcd = 1
    for factor, counts in factor_counts.items():
        if len(counts) == len(nums):
            max_gcd *= factor ** min(counts)

    return max_gcd

nums = [2, 6, 14, 28]
print(gcd(nums))  # 输出: 2

该代码将会输出 2,即给定数 [2, 6, 14, 28] 的最大公约数。