将自然数分组为互质数对
将序列 {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)。
第一组包含:
- 1
- 所有质数
剩余组(k ≥ 2):
- 第一个位置:偶数 2k
- 第二个位置(可选):奇合数 x,其中 pos_x = k
某些组可能包含 0 或 2 个奇数(例如:k=3,7 — 空;k=14,16 — 各两个)。
n=24 的示例
一个表格展示了分配情况:
| 第一组 | 1, 2, 3, 5, 7, 11, 13, 17, 19, 23 |
| 第二组 | 4, 9, 15, 21 |
| 第三组 | 6 |
| 第四组 | 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
暂无评论。