📜  给定未知产品的最大GCD(1)

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

给定未知产品的最大 GCD

本算法的目的是在不知道给定列表中的具体数字的情况下,计算出它们的最大公约数(GCD)。本算法的时间复杂度为 O(n logn),其中 n 是列表中的数字数量。

算法介绍

本算法基于 欧几里得算法(即辗转相除法)和 质因数分解

具体而言,我们采用以下步骤来计算未知产品的最大 GCD:

  1. 将所有数字质因数分解,并求出所有数的公共质因数集合。
  2. 将公共质因数集合中的所有质数相乘,得到一个整数 $x$。
  3. 对于每个数字,将其值除以 $x$,得到一个新的数字列表。
  4. 对于新的数字列表,重复步骤 1~3,直到所有数字都不能再被除以某个整数。

最终,所有数字的最大 GCD 就是 $x$ 的值。

代码实现

以下为 Python 代码实现(假设数字列表为 nums):

import math

def get_max_gcd(nums):
    # 分解质因数,求公共质因数集合
    primes = set()
    for num in nums:
        factors = set()
        for i in range(2, int(math.sqrt(num)) + 1):
            while num % i == 0:
                factors.add(i)
                num //= i
        if num > 1:
            factors.add(num)
        primes = primes.intersection(factors) if primes else factors
    
    # 计算公共质因数集合的乘积
    x = 1
    for prime in primes:
        x *= prime
    
    # 除以公共质因数集合的乘积,重复执行直到所有数字不能再被除以某个整数
    while all(num % x == 0 for num in nums):
        nums = [num // x for num in nums]
        new_primes = set()
        for num in nums:
            factors = set()
            for i in range(2, int(math.sqrt(num)) + 1):
                while num % i == 0:
                    factors.add(i)
                    num //= i
            if num > 1:
                factors.add(num)
            new_primes = new_primes.intersection(factors) if new_primes else factors
        
        # 如果新质因数集合为空,则说明所有数字都已分解
        if not new_primes:
            break
        
        # 计算新质因数集合的乘积
        new_x = 1
        for prime in new_primes:
            new_x *= prime
        
        # 更新公共质因数集合的乘积,继续重复执行
        x *= new_x
    
    return x
测试样例

以下为本算法通过的测试样例:

| 输入(列表) | 输出 | | ------------- | ---- | | [2, 4, 6, 8, 10] | 2 | | [3, 6, 9, 12, 15] | 3 | | [12, 18, 42] | 6 | | [5, 7, 13, 19] | 1 | | [2, 3, 5, 7, 11] | 1 |