介绍 :
Collatz 猜想是数学中一个难以捉摸的问题,当运行基于奇数或偶数的特定函数时,关于自然数的单一性,具体说明无论初始数如何,系列最终都会达到数字 1。 Collatz 猜想已经自 20 世纪初德国数学家 Lothar Collatz 被认为是该问题的起源以来,这是数学界的一个国际流行问题。
“猜想”的描述:
猜想陈述指出——
取任何自然数n。如果n是偶数,除以2得到n/2,如果n是奇数,乘以3再加1得到3n+1。无限期地重复这个过程。猜想是无论你从什么数字开始,你最终都会达到 1。
所以对于自然数 n,我们可以定义以下函数——
T(n) = n/2 n≡0(mod2)
= (3*n) + 1 n≡1(mod2)
一些研究:
当 n>1 时,函数在连续迭代中的进展可以在图形的帮助下轻松研究和可视化。为此,我们有相应的Python代码来模拟一些运行并创建一个绘图。
Python3
from matplotlib import pyplot as plt
n = int(input())
x = []
x.append(n)
while(n > 1):
if(n % 2 == 0):
n = n//2
x.append(n)
print(n)
else:
n = (3*n) + 1
x.append(n)
print(n)
plt.plot(x, '-ok')
plt.show()
Python3
from matplotlib import pyplot as plt
import numpy as np
y = []
n = 100
y.append(n)
while(n > 1):
if (n % 2 == 0):
n = n//2
else:
n = (3*n) + 1
y.append(n)
x = range(0,len(y))
plt.plot(x,np.log(y))
plt.show()
Python3
from matplotlib import pyplot as plt
import numpy as np
y = []
n = 100
y.append(n)
while(n > 1):
if (n % 2 == 0):
n = n//2
else:
n = (3*n) + 1
y.append(n)
x = range(0,len(y))
plt.plot(np.log(x),np.log(y[::-1]))
plt.show()
上图是100的起始值。你可以用你自己的一些起始值来尝试模拟代码。如您所见,上图非常混乱。除了最终收敛到 1 之外,没有明显的模式,因为这些值可能会很快变得非常大。 100 需要 14 步才能收敛,但其他人可能需要更多或更少。
让我们尝试更多的图形,通过在半对数网格中绘制图形,其中 y 轴为对数,x 轴保持线性。该方法的Python代码是:
蟒蛇3
from matplotlib import pyplot as plt
import numpy as np
y = []
n = 100
y.append(n)
while(n > 1):
if (n % 2 == 0):
n = n//2
else:
n = (3*n) + 1
y.append(n)
x = range(0,len(y))
plt.plot(x,np.log(y))
plt.show()
上面代码的图形是:
现在我们可以在另一种绘图方法中反转 y 轴,以研究从 1 开始的增长并创建如下图:
现在要找到一些关于输入数字收敛到 1 需要多少步的“模式”,让我们将上述绘图方法的 x 轴更改为对数刻度。所说的Python代码如下:
蟒蛇3
from matplotlib import pyplot as plt
import numpy as np
y = []
n = 100
y.append(n)
while(n > 1):
if (n % 2 == 0):
n = n//2
else:
n = (3*n) + 1
y.append(n)
x = range(0,len(y))
plt.plot(np.log(x),np.log(y[::-1]))
plt.show()
上述代码的图形如下所示,其中 y 轴是 log 中的 collatz 值,x 轴是相反的步骤顺序。
现在使用上面的绘图方法,我们可以尝试绘制一堆不同的此类系列来研究和比较每个系列的增长。