Java 中的 Aliquot 序列

2025年5月14日 | 阅读 4 分钟

倍数序列是数论中一个引人入胜的主题,它涉及对一个数的真因子(不包括该数本身)进行迭代求和。序列会持续进行,直到它终止于零、进入一个循环,或者(在罕见的理论情况下)变得无界。对倍数序列的研究可以追溯到古希腊数学,并与完数、亲和数和社交数等概念密切相关。

关键定义

  1. 真因子(Proper Divisors): 一个数的真因子是指除该数本身以外的所有因子。例如,12 的真因子是 1、2、3、4 和 6。
  2. 倍数和(Aliquot Sum): 一个数的所有真因子的总和。例如,12 的倍数和是 1 + 2 + 3 + 4 + 6 = 16。
  3. 序列行为
    • 一个数如果是完数(Perfect Number),当它的倍数和等于该数本身时(例如,6、28)。
    • 一个数如果是亏数(Deficient Number),当它的倍数和小于该数本身时(例如,8)。
    • 一个数如果是丰数(Abundant Number),当它的倍数和大于该数本身时(例如,12)。

倍数序列示例

考虑从数字 12 开始

步骤 1: 12 的真因子是 1、2、3、4、6。总和 = 16。

步骤 2: 16 的真因子是 1、2、4、8。总和 = 15。

步骤 3: 15 的真因子是 1、3、5。总和 = 9。

步骤 4: 9 的真因子是 {1, 3}。总和 = 4。

步骤 5: 4 的真因子是 {1, 2}。总和 = 3。

步骤 6: 3 的真因子是 {1}。总和 = 1。

步骤 7: 1 的真因子是 {}。总和 = 0。

序列终止于 0。

文件名:AliquotSequence.java

输出

 
Enter a number to start the aliquot sequence: 10
Aliquot sequence starting from 10:
10 8 7 1 0   

解释

Java 程序旨在逐步计算倍数序列。首先,`getProperDivisors` 方法通过检查小于输入数一半的整数的可整除性来识别所有真因子。

这些因子会被添加到一个列表中。`calculateAliquotSum()` 方法对这些因子求和,得到倍数和。`generateAliquotSequence()` 方法以用户提供的数字开始,重复计算其倍数和,并打印每一步,直到序列在零处结束。

最后,`main()` 方法处理用户输入并协调序列生成过程。

复杂度分析

时间复杂度: `getProperDivisors()` 方法对于每个数字涉及最多迭代 n/2 次,对于单个调用,最坏情况下会产生 (O(n)) 操作。`calculateAliquotSum()` 方法调用 `getProperDivisors()`,继承了其 (O(n)) 的复杂度。

在 `generateAliquotSequence()` 方法中,迭代次数取决于序列的长度,该长度根据起始数字而变化。设序列长度为 L。总复杂度约为 (O(L*n))。

空间复杂度: 主要的空间使用来自真因子列表,在最坏情况下需要 (O(n/2)) 的空间。总体空间复杂度为 (O(n))。

分析与应用

倍数序列具有有趣的数学性质和联系。

  1. 完数: 如果序列以一个完数开始,该数字将保持不变(例如,从 28 开始)。
  2. 亲和数: 如果两个数的序列相互连接,它们就构成一个亲和对(例如,220 和 284)。
  3. 社交数: 将亲和数扩展或想象成具有两个以上数字的循环。
  4. 研究: 数学家们研究这些序列的行为,以探索数论和发现新的模式。

结论

倍数序列是数学中一个丰富的研究领域,具有计算意义。此处提供的 Java 程序是一个简单而有效的工具,可用于探索此概念。通过迭代真因子并对其求和,我们可以深入了解数字的性质和分类。