Python中的Collatz序列

2025年3月3日 | 阅读7分钟

考拉兹猜想简介

考拉兹猜想,也称为“3n + 1”猜想或冰雹序列,是一个多年来困扰数学家的数学问题。它以德国数学家洛塔尔·考拉兹(Lothar Collatz)的名字命名,他于1937年首次提出该猜想。该猜想提出了一个看似简单却出奇复杂的问题:对于任何一个正整数,如果它是偶数,则将其除以2;如果它是奇数,则将其乘以3再加1。一直这样进行下去,如果你从任何一个正整数开始,最终都会得到1。

尽管它具有欺骗性的简单性,但考拉兹问题已知仍未解决。数学家们已经进行了非常彻底的科学研究,探索了其许多性质并试图揭示其真实的数学行为。这个长期存在的问题尚未得到解决,即使在今天,数学家们仍在努力尝试找到答案。在本文中,我们将重点关注考拉兹序列,研究它的一些令人费解的方面,并用Python来实现它。

理解考拉兹序列

为了更好地理解考拉兹序列,让我们通过几个例子来说明。

示例 1

让我们从数字12开始

步骤1:因为12是偶数,所以我们将其除以2 => 12 ÷ 2 = 6

步骤2:6是偶数,所以我们将其除以2 => 6 ÷ 2 = 3

步骤3:3是奇数,所以我们将其乘以3并加1 => 3 × 3 + 1 = 10

步骤4:10是偶数,所以我们将其除以2 => 10 ÷ 2 = 5

步骤5:5是奇数,所以我们将其乘以3并加1 => 5 × 3 + 1 = 16

步骤6:16是偶数,所以我们将其除以2 => 16 ÷ 2 = 8

步骤7:8是偶数,所以我们将其除以2 => 8 ÷ 2 = 4

步骤8:4是偶数,所以我们将其除以2 => 4 ÷ 2 = 2

步骤9:2是偶数,所以我们将其除以2 => 2 ÷ 2 = 1

因此,从12开始的序列在9步后终止于1。

示例 2

让我们从数字15开始

步骤1:15是奇数,所以我们将其乘以3并加1 => 15 × 3 + 1 = 46

步骤2:46是偶数,所以我们将其除以2 => 46 ÷ 2 = 23

步骤3:23是奇数,所以我们将其乘以3并加1 => 23 × 3 + 1 = 70

步骤4:70是偶数,所以我们将其除以2 => 70 ÷ 2 = 35

步骤5:35是奇数,所以我们将其乘以3并加1 => 35 × 3 + 1 = 106

步骤6:106是偶数,所以我们将其除以2 => 106 ÷ 2 = 53

步骤7:53是奇数,所以我们将其乘以3并加1 => 53 × 3 + 1 = 160

步骤8:160是偶数,所以我们将其除以2 => 160 ÷ 2 = 80

步骤9:80是偶数,所以我们将其除以2 => 80 ÷ 2 = 40

步骤10:40是偶数,所以我们将其除以2 => 40 ÷ 2 = 20

步骤11:20是偶数,所以我们将其除以2 => 20 ÷ 2 = 10

步骤12:10是偶数,所以我们将其除以2 => 10 ÷ 2 = 5

步骤13:5是奇数,所以我们将其乘以3并加1 => 5 × 3 + 1 = 16

步骤14:16是偶数,所以我们将其除以2 => 16 ÷ 2 = 8

步骤15:8是偶数,所以我们将其除以2 => 8 ÷ 2 = 4

步骤16:4是偶数,所以我们将其除以2 => 4 ÷ 2 = 2

步骤17:2是偶数,所以我们将其除以2 => 2 ÷ 2 = 1

因此,从15开始的序列在17步后终止于1。

然而,这里有一些例子表明了考拉兹序列的“机会性”性质。某些序列可能在几步后就停止,而另一些序列实际上并不总是立即停止。考拉兹猜想的迷人之处在于,所有正整数都将“原子化”,即在尝试操作的过程中最终会得到1。

在Python中实现考拉兹序列

在Python中实现考拉兹序列是探索其性质的重要工具。因此,我们将用Python实现考拉兹序列。在下一步中,我们将根据一个正整数参数定义我们的函数。该函数将输出一个数字序列,直到达到1。

代码

输出

 
Enter a positive integer: 11
Collatz sequence starting with 11 : [11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1]
Length of the sequence: 15   

说明

该代码定义了一个名为'collatz_sequence'的函数,该函数从给定的正整数n开始生成考拉兹序列。然后,该函数通过用户输入序列的起始值来检查。它计算序列并打印序列及其长度。代码的工作原理如下:

  • 函数'collatz_sequence'以数字'n'(对于正整数n)开始一个序列,并将n作为参数传递。
  • 然后,程序员通过一个while循环,该循环一直运行直到n的值不等于1。在循环内:
  • 如果'n'能被2整除,则因子2将使用整除法('n //= 2')将n除以2。
  • 如果n不是偶数,则将其乘以3并加1('n = n * 3 + 1')。
  • 因此,最后一个项'n'被附加到序列列表中。
  • 一旦'n'改变或变为'1',函数就返回完整的序列,这标志着考拉兹序列的结束。
  • 当然,下一行将提示用户输入正整数(数字)。然后,将由'collatz_sequence'函数操作生成的考拉兹序列存储在名为sequence的变量中。
  • 最后,它将打印出可识别的代码及其长度。

这样,它向用户展示了考拉兹算法,并允许用户输入任何他喜欢的正数。

分析考拉兹序列

考拉兹猜想由于许多由计算分析和数学审查支持的测试,尚未被接受为事实。不同的数学家试图深入了解考拉兹序列的统计数据和行为。

因此,考拉兹序列的一个重要特征是它具有广泛不同的行为。理想情况下,一些数字会变成1,或者数字会遵循一个混沌的路径,突然增长到某个指数,而另一些则会收敛到1。这种行为的原因相当模糊,这引起了对该猜想的怀疑。

可视化考拉兹序列

同样,通过操作考拉兹序列的可视化可以获得对其行为的许多见解。让我们绘制一个有限数量的序列的图,以清晰地显示它们的演变过程。

代码

输出

Collatz Sequence in Python
Collatz Sequence in Python
Collatz Sequence in Python

说明

下面插入了 matplotlib 库的调用,这些调用逐个步骤跟踪数字6、11和27的考拉兹轨迹。其工作原理如下:

  • 使用一个起始数字'n'作为参数调用'plot_collatz_sequence'函数。
  • 在这里调用'collatz_sequence'函数,该函数生成从数字'n'开始的序列。
  • 此命令将生成的序列作为输入,然后'plt.plot()'将创建一个折线图。折线图和数据点在每个数据点上都有标记,以便于查看。
  • 该函数为 x 轴(步骤)和 y 轴(值)生成一些标签,以及图表的标题(考拉兹序列)。
  • 它使用网格来帮助可视化,使用'plt.grid(True)'
  • 最后,'plt.show()'函数绘制图表。

这个编程片段通过调用具有不同起始数字(6、11 和 27)的 `plot_collatz_sequence' 来实现这一点。这将生成一系列图表,显示这些序列如何转化为另一个序列。这种可视化让我们对序列以及它们何时开始出现差异有了直观的认识。

结论

世界闻名的考拉兹序列问题长期以来一直是不同数字爱好者的挑战。由于其简单的描述,结果的行为仍然不稳定。它是至今仍未解决的最令人费解的数学问题之一。

在本文中,我们了解了如何使用 Python 获取和重现考拉兹序列,并对序列进行了简要分析。尽管在了解它们的来源方面取得了很大进展,但所有正整数最终都将得到1的最终问题仍然未解决。寻找证明该猜想的研究继续成为数学领域的重要驱动力,好奇心在其中起着主导作用。