返回首页

将自然数分组为 n/2 个两两互质组

本文描述了将自然数 1..n 分成 n/2 个组的算法,组内元素两两互质。使用奇合数的公式和 4k±1 的性质。提供 Python 代码和论证。

如何将数字 1..n 分组为两两互质配对
Advertisement 728x90

将自然数分组为互质数对

将序列 {1, 2, 3, ..., n} 分成 n/2 组,每组内的所有数互质,可通过一个简单算法实现。质数和 1 被放在第一组。大于 2 的偶数作为剩余组的起始元素。奇合数使用公式 pos_{x_i} = ⌊x_i/4 + 0.5⌋ 进行分配。这确保了每个奇数与偶数组长之间的最大公约数为 1。

分配逻辑

该算法依赖于奇合数的性质:它们都可以表示为 4k ± 1 的形式,其中 k 对应组号。对于偶数组长 2k,gcd(2k, 4k ± 1) = 1,因为 4k ± 1 ≡ ±1 (mod 2k)。

第一组包含:

Google AdInline article slot
  • 1
  • 所有质数

剩余组(k ≥ 2):

  • 第一个位置:偶数 2k
  • 第二个位置(可选):奇合数 x,其中 pos_x = k

某些组可能包含 0 或 2 个奇数(例如:k=3,7 — 空;k=14,16 — 各两个)。

n=24 的示例

一个表格展示了分配情况:

Google AdInline article slot

| 第一组 | 1, 2, 3, 5, 7, 11, 13, 17, 19, 23 |

| 第二组 | 4, 9, 15, 21 |

| 第三组 | 6 |

Google AdInline article slot

| 第四组 | 8, 25?(对于 n=24:8) |

| ... | ... |

组内互质性的验证通过性质确认:质数两两互质,gcd(2k, 4k±1)=1。

数学证明

  • 质数:任意两个质数 p, q(p ≠ q)的 gcd(p,q)=1。
  • 偶数组长:2k(k≥2)是奇数,但 2k 是偶数。
  • 奇合数:x = 4k ±1,gcd(2k, x) = gcd(2k, ±1 mod 2k) =1。
  • 组内奇数之间:可能的对(罕见)也通过构造互质,因为它们按模分配。

这间接遵循狄利克雷关于算术级数中质数的定理,但直接来自奇数的形式。

Python 实现

用于自动分组的代码:

def group_naturals(n):
    primes = [1]  # 1 + 质数
    composites_odd = []
    evens = []
    
    for i in range(2, n+1):
        if i % 2 == 0:
            evens.append(i)
        elif is_prime(i):
            primes.append(i)
        else:
            composites_odd.append(i)
    
    groups = [primes]
    pos = {}
    for x in composites_odd:
        k = int(x / 4 + 0.5)
        if k not in pos:
            pos[k] = []
        pos[k].append(x)
    
    for k in range(2, n//2 +1):
        group = [2*k]
        if k in pos:
            group.extend(sorted(pos[k]))
        groups.append(group)
    
    return groups[:n//2]  # 修剪额外部分

def is_prime(num):
    if num < 2:
        return False
    for i in range(2, int(num**0.5)+1):
        if num % i == 0:
            return False
    return True

该代码为给定 n 生成组,验证性质。

关键点

  • 所有组仅包含互质数。
  • 对于任何自然数 n,组数恰好为 n/2。
  • 奇合数按 pos = ⌊x/4 + 0.5⌋ 分配。
  • 证明:x=4k±1 ⇒ gcd(2k, x)=1。
  • 第一组:1 和所有质数。

— Editorial Team

Advertisement 728x90

继续阅读