亲密数的科普及其Python实现

在数论中,亲密数是一种特殊的数字对,它们之间存在着独特的关系。简而言之,两个正整数 (a) 和 (b) 是亲密数,如果它们的因子之和等于对方,即:

  • ( \sigma(a) - a = b )
  • ( \sigma(b) - b = a )

其中,( \sigma(n) ) 是小于或等于 ( n ) 的所有正因子的和。当我们关注 ( n ) 以内的亲密数时,我们可以通过编写一个简单的Python程序来找到这些亲密数。

亲密数的特性

在展开主题之前,让我们先看看亲密数的一些特性:

  1. 亲密数一定是成对的。
  2. 最小的亲密数对是 (220, 284)。
  3. 亲密数对通常并不常见。

代码实现

下面我们将通过Python代码来查找 n 以内的所有亲密数。首先,我们需要一个函数来计算一个数的正因子之和。

计算因子之和的函数

def sum_of_divisors(n):
    total = 1  # 因为1是所有正整数的因子
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            total += i
            if i != n // i:  # 确保不重复计数平方根
                total += n // i
    return total

在这个函数中,我们从1开始计算因子的和,直到平方根的整数部分。这样可以提高效率。

查找亲密数的主函数

接下来,我们可以编写另一个函数,来查看给定范围内的所有亲密数。

def find_amicable_numbers(n):
    amicable_pairs = []
    for i in range(1, n):
        mate = sum_of_divisors(i)
        if (mate != i) and (sum_of_divisors(mate) == i):  # 确保两者互为亲密数
            amicable_pairs.append((i, mate))
    return amicable_pairs

完整程序

组合以上两个函数,我们最终得到如下代码:

def sum_of_divisors(n):
    total = 1  
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            total += i
            if i != n // i:  
                total += n // i
    return total

def find_amicable_numbers(n):
    amicable_pairs = []
    for i in range(1, n):
        mate = sum_of_divisors(i)
        if (mate != i) and (sum_of_divisors(mate) == i):  
            amicable_pairs.append((i, mate))
    return amicable_pairs

# 调用主函数并输出结果
n = 3000
amicable_numbers = find_amicable_numbers(n)
print("亲密数对:", amicable_numbers)

结果演示

例如,若我们在3000以内寻找亲密数对,输出结果为:

亲密数对: [(220, 284)]

这表明220和284是我们所寻找的亲密数对。

状态图示例

在实现该程序的过程中,我们可以借助状态图来可视化程序的执行过程。下面是一个简化的状态图:

stateDiagram
    [*] --> Start
    Start --> SumOfDivisors
    SumOfDivisors --> FindAmicableNumbers
    FindAmicableNumbers --> [*]

旅行图示例

此外,我们也可以使用旅行图描述程序运行的过程:

journey
    title 程序执行流程
    section 计算因子和
      计算因子和  : 5: Me
      返回正因子之和 : 2: Me
    section 查找亲密数
      迭代每个数 : 3: Me
      检查是否形成亲密数对 : 4: Me

结尾

亲密数不仅是数学中的有趣概念,也为算法编程提供了良好的练习。通过以上的Python实现,我们了解了如何有效地在给定范围内查找亲密数对。此程序可以扩展,以适应更多的条件和功能,为我们提供了探索数字奥秘的机会。希望这篇文章能激发你对数学和编程的兴趣,继续探索更多相关的主题!