[博客翻译]科拉茨蚂蚁与科拉茨序列的相似性


原文地址:https://gbragafibra.github.io/2025/01/08/collatz_ant2.html

代码地址:https://github.com/gbragafibra/collatz-ant

科拉茨蚂蚁基于科拉茨函数
\[f(n) = \begin{cases} n/2 & if \quad n \equiv 0 \quad (mod2) \\ 3n + 1 & if \quad n \equiv 1 \quad (mod 2) \\ \end{cases}\]
此外,如果$n \equiv 0 (mod2)$,蚂蚁会顺时针旋转90度,否则蚂蚁会逆时针旋转90度。在这两种情况下,单元格的状态都会翻转,蚂蚁向前移动一个单位。这个过程会一直重复,直到$n = 1$。以下动画展示了一个例子:

从$n = 10^{40}$到$n = 10^{40} + 20$的连续轨迹示例。

尽管这种表示方式很有趣,但状态翻转最终可能会导致一些模糊的场景,使得轨迹看起来因为省略而相似。

因此,下图展示了蚂蚁在没有状态翻转的情况下的轨迹(最终快照),以及相应的停止时间。这是通过简单地给蚂蚁经过的每个坐标增加一个$+1$计数来实现的。

其他一些例子

从$n = 2$到$n = 102$的前100个数字。

从$n = 10^{9}$到$n = 10^{9} + 100$。

从$n = 10^{20}$到$n = 10^{20} + 100$。

从$n = 10^{200}$到$n = 10^{200} + 10$。

一些有趣的现象

  • 非常相似的轨迹具有相同的停止时间(或相似的停止时间),但反过来并不成立。一个反例是$n = 10^{20} + 1$(第一行,第二列)和$n = 10^{20} + 16$(第四行,第二列),它们的停止时间都是532。

如果我们检查这两个轨迹的相似性:

import numpy as np
import mpmath
def collatz_seq(n):
  seq = []
  while n != 1:
    seq.append(n)
    if n % 2 == 0:
    	n /= 2
    else:
    	n = 3*n + 1
  return seq
mpmath.mp.dps = 22
n1 = mpmath.mpf("1e20") + 1
n2 = mpmath.mpf("1e20") + 16
len(np.intersect1d(collatz_seq(n1), collatz_seq(n2)))
输出:142

如果我们在$n = 10^{20} + 16$和$n = 10^{20} + 20$之间进行同样的操作,它们的轨迹相似且停止时间相同,我们得到:

输出:527
  • 此外,如果我们现在看一个子轨迹收敛的例子,在这种情况下,每一步之间有5步的差异,我们可以看到轨迹非常相似,但旋转角度不同(似乎总体上是90度)。这当然是由于蚂蚁在早期重新定向的结果,因为多了这5步。

以$n = 18750000000000000004$和$n = 10^{20} + 16$为例,前者是在后者经过5步缩减后找到的。

现在,差异为100步时,轨迹仍然非常相似,但旋转了180度。

差异为200步时,轨迹之间的细节开始减少。

差异为300步时,两个轨迹之间只有一些较大尺度的特征仍然相似。