Pythonでコラッツ逆計算を二次元配列として書き出すコード

## コラッツ予想とは
:::note info
**コラッツ予想は未解決問題だそうです**
任意の正の整数nに対して、以下で定められる操作について考える。
・nが偶数の場合、nを2で割る
・nが奇数の場合、nに3をかけて1を足す
このとき、どんなnからはじめても、有限回の操作のうちに必ず1に到達する。
:::
## ボトムアップ方式によるアプローチ
すべての正の整数がコラッツ計算によって最終的に1に到達するという代わりに、1から逆計算をするとすべての正の整数につながるボトムアップ方式で考えてみました。

ここで、1から逆にとらえた計算の、奇数の遷移を考えると、

<table>
<tr>
<td>1　→　{1, 5, 21, 85, 341,…}</td> 
</tr>
<tr>
<td>5　→　{3, 13, 53, 213, 853,…}</td> 
</tr>
<tr>
<td>7　→　{9, 37, 149, 597, 2389,…}</td> 
</tr>
<tr>
<td>11　→　{7, 29, 117, 469, 1877,…}</td> 
</tr>
<tr>
<td>13　→　{17, 69, 277, 1109, 4437,…}</td> 
</tr>
<tr>
<td>17　→　{11, 45, 181, 725, 2901,…}</td> 
</tr>
</table>

のように遷移します。
（＊＊＊一番左の、元の奇数は、6t-5と6t-1で表わせます＊＊＊）

右側の{}の奇数は、左側の元の奇数に2を何乗か、かけて、1を引いて3で割り切れるときの奇数です。

元の奇数が、1,7,13,19,…のように6で割ったときに余りが1であるとき、
次の奇数は、4倍16倍64倍…とかけていって、1を引いて3で割り切れるときの奇数です。
（→元の奇数が6t-5で表わせる奇数のとき、2をかける回数は偶数回になる）

元の奇数が、5,11,17,23,…のように6で割ったときに余りが5であるとき、
次の奇数は、2倍8倍32倍…とかけていって、1を引いて3で割り切れるときの奇数です。
（→元の奇数が6t-1で表わせる奇数のとき、2をかける回数は奇数回になる）

法則があるので一般項の式で表わせます。

変数は二つになります。
正の奇数の数列の一般項b は、
①2をかける回数が偶数回のとき
b_e (s,t) = (4 × 4^(s-1) - 1)/3 + (t - 1) × 8 × 4^(s - 1)
②2をかける回数が奇数回のとき
b_o (s,t) = (10 × 4^(s - 1) - 1) / 3 + (t - 1) × 4 × 4^(s - 1)
です。

偶数は、奇数になるまで２で割り続けるので、逆に考えると、奇数をそれぞれ２倍２倍にした数が連なります。

<table>
<tr>
<td>2 → 4 → 8 → 16 → 32 → 64 → 128…</td> 
</tr>
<tr>
<td>6 → 12 → 24 → 48 → 56 → 112 → 224…</td> 
</tr>
<tr>
<td>10 → 2 → 40 → 80 → 160 → 320 → 640…</td> 
</tr>
<tr>
<td>14 → 28 → 56 → 112 → 224 → 448 → 896…</td> 
</tr>
<tr>
<td>18 → 36 → 72 → 144 → 288 → 576 → 1152…</td> 
</tr>
<tr>
<td>22 → 44 → 88 → 176 → 352 → 704 → 1408…</td> 
</tr>
</table>

（＊＊＊一番左の数は2t-1の奇数に連結＊＊＊）


奇数と奇数間に現れる偶数も、同じように二変数で表わせます。
a (s,t) = 2 ^ s × (2t - 1)

これで、コラッツ逆計算過程を、偶数奇数それぞれ３つの式で表わせました。

:::note warn
未解決問題と言われていますが…
コラッツ計算の数の遷移を、式によって重複なくもれなく表わせるのでは？？？
:::

## ３つの式を使ってPythonで値を書き出してみる

```python:
n = 10	# 計算したい列数
m = 10	# 計算したい行数

print('=======偶数の二次元配列=======')
even_list = []	# 偶数の二次元配列を用意

for t in range(1, n + 1): 	# 列を指定
	even_sublist = []	# 列を用意
	for s in range(1, m + 1): 	# 行を指定
		even_sublist.append((2 * t - 1) * 2 ** s) # 計算した偶数を列に追加
	even_list. append(even_sublist)	# 列を連結

print(even_list)

print('=======奇数eの二次元配列=======')


odd_list_e = []		# 奇数の二次元配列eを用意

for t in range(1, n + 1): 	# 列を指定
	odd_sublist_e = [] 	# 列を用意
	for s in range(1, m + 1): 	# 行を指定
		odd_sublist_e.append(int((4 ** (s - 1) * 4 - 1) / 3 + 8 * (t - 1) * 4 ** (s - 1) )) 	# 計算した奇数を列に追加
	odd_list_e. append(odd_sublist_e) 	# 列を連結

print(odd_list_e)

print('=======奇数oの二次元配列=======')
odd_list_o = []		# 奇数の二次元配列oを用意

for t in range(1, n + 1): 	# 列を指定
	odd_sublist_o = [] 	# 列を用意
	for s in range(1, m + 1): 	# 行を指定
		odd_sublist_o.append(int((4 ** (s - 1) * 10 - 1) / 3 + 4 * (t - 1) * 4 ** (s - 1) )) 	# 計算した奇数を列に追加
	odd_list_o. append(odd_sublist_o) 	# 列を連結

print(odd_list_o)

```
このコードを実行すると、下のような結果になります。
```:実行結果
=======偶数の二次元配列=======
[[2, 4, 8, 16, 32, 64, 128, 256, 512, 1024], 
[6, 12, 24, 48, 96, 192, 384, 768, 1536, 3072], 
[10, 20, 40, 80, 160, 320, 640, 1280, 2560, 5120], 
[14, 28, 56, 112, 224, 448, 896, 1792, 3584, 7168], 
[18, 36, 72, 144, 288, 576, 1152, 2304, 4608, 9216], 
[22, 44, 88, 176, 352, 704, 1408, 2816, 5632, 11264], 
[26, 52, 104, 208, 416, 832, 1664, 3328, 6656, 13312], 
[30, 60, 120, 240, 480, 960, 1920, 3840, 7680, 15360], 
[34, 68, 136, 272, 544, 1088, 2176, 4352, 8704, 17408], 
[38, 76, 152, 304, 608, 1216, 2432, 4864, 9728, 19456]]
=======奇数eの二次元配列=======
[[1, 5, 21, 85, 341, 1365, 5461, 21845, 87381, 349525], 
[9, 37, 149, 597, 2389, 9557, 38229, 152917, 611669, 2446677], 
[17, 69, 277, 1109, 4437, 17749, 70997, 283989, 1135957, 4543829], 
[25, 101, 405, 1621, 6485, 25941, 103765, 415061, 1660245, 6640981], 
[33, 133, 533, 2133, 8533, 34133, 136533, 546133, 2184533, 8738133], 
[41, 165, 661, 2645, 10581, 42325, 169301, 677205, 2708821, 10835285], 
[49, 197, 789, 3157, 12629, 50517, 202069, 808277, 3233109, 12932437], 
[57, 229, 917, 3669, 14677, 58709, 234837, 939349, 3757397, 15029589], 
[65, 261, 1045, 4181, 16725, 66901, 267605, 1070421, 4281685, 17126741], 
[73, 293, 1173, 4693, 18773, 75093, 300373, 1201493, 4805973, 19223893]]
=======奇数oの二次元配列=======
[[3, 13, 53, 213, 853, 3413, 13653, 54613, 218453, 873813], 
[7, 29, 117, 469, 1877, 7509, 30037, 120149, 480597, 1922389], 
[11, 45, 181, 725, 2901, 11605, 46421, 185685, 742741, 2970965], 
[15, 61, 245, 981, 3925, 15701, 62805, 251221, 1004885, 4019541], 
[19, 77, 309, 1237, 4949, 19797, 79189, 316757, 1267029, 5068117], 
[23, 93, 373, 1493, 5973, 23893, 95573, 382293, 1529173, 6116693], 
[27, 109, 437, 1749, 6997, 27989, 111957, 447829, 1791317, 7165269], 
[31, 125, 501, 2005, 8021, 32085, 128341, 513365, 2053461, 8213845], 
[35, 141, 565, 2261, 9045, 36181, 144725, 578901, 2315605, 9262421], 
[39, 157, 629, 2517, 10069, 40277, 161109, 644437, 2577749, 10310997]]
```
:::note warn
値を縦に見ると…等差数列であることに気づきますね！
その公差は、4,8,16,32,64…と増えていきます（奇数は両方で見てくださいね！）
数学的な証明の手段を経なくても、このことから、重複なくもれもないということが直感できる方もいるでしょうね。
:::

## 自然数を重複なくもれなく表わせる二次元配列
奇数の遷移においては、各ノードにおいて、複数の上位ノードが存在し、それらが一つの下位ノードに収束する形のツリー構造であるので、多数の枝は1点に集まります。どのノードから始めても進む方向は一つであるため、ループや逆戻りする経路は存在しません。
そして、このツリー構造内には、上記の一般項で正の奇数が重複も、もれもなく、存在することが示せる（別で記述）ので、どんな奇数から始めても、一番下の1に到達します。
正の偶数も、二次元配列で重複なくもれなく表わせます。

なので、コラッツの計算を施せば必ず1に到達すると言えるのではないでしょうか。

最後までご覧いただき、ありがとうございました！