考拉茲猜想的旋轉視角與字語言分析
一份方法論偵察報告
作者: Neo.K 機構: 一言諾科技有限公司(EveMissLab) 理論協作: Theia 日期: 2026 年 5 月
定位聲明
本文不是考拉茲猜想的證明嘗試,也不聲稱推進了它的解決。本文是一份方法論偵察報告:記錄一條以「二叉樹旋轉」為起點的探索路徑,誠實標明它在何處撞牆、為何撞牆,以及撞牆後問題被翻譯成了什麼形態。本文最硬的成果是兩個負面結果與一個等價翻譯——它們的價值不在於更接近答案,而在於精確劃定了一整類方法的失效邊界,並把困難搬到一張新的工具桌上。
對「為何正常數學家不證考拉茲」這個老問題,本文提供一個結構性的回答:因為它的困難不在技巧層,而在邏輯類型層;任何只操作結構與形狀的方法,對它的核心困難結構性失明。
1. 二叉逆樹的形式定義
1.1 基本構造
考拉茲映射定義為
我們不從正向迭代切入,而是構造一棵以 為根、節點為正整數的有根二叉樹。
定義 1(考拉茲逆樹 )。 對任意節點 :
排除 的平凡回邊(即不把 當作 的右子的下游)。
定義 2(中序遍歷 )。 , 。
定義 3(顏色)。 。
定義 4(深度/旋轉距離 )。 為 在 中到根的路徑長度。
關於右子條件的一個註記: 蘊含 永遠為奇數,故「 為奇」這個附加條件自動滿足,無需單獨檢查。
1.2 關鍵引理:父節點即正向一步
引理 1。 在 中,節點 ( )的父節點為
證明。 若 偶,則 ,故父為 。若 奇,則 只能是某節點的右子: ,且 (因 奇)滿足右子條件。故父為 。
引理 1 說明:在 中沿樹往根走一步,恰好等於對 施加正向考拉茲一步。於是得到一個立即的推論。
推論 1( 塌縮)。 對任意 ,其深度 恆等於 的完整考拉茲停止時間 (含偶數步)。
這個推論有一個方法論後果:把「旋轉距離」當作一個獨立於停止時間的新不變量,是錯誤的期望。 沒有提供任何 之外的信息。任何關於 上界的猜想(如 )僅僅是停止時間上界問題的改寫。數值上,在 範圍內 平均約 ,上界約 (且不隨範圍上升刷新)——這就是經驗停止時間常數本身。
1.3 覆蓋性等價
命題 1。 考拉茲猜想 。
由引理 1, (根為 )等價於 的正向軌跡到達 。
2. 第一個負面結果:旋轉不可見性
二叉樹旋轉是平衡樹算法的核心操作。它的定義性質是:保持節點集合與中序遍歷不變,只改變樹的拓撲形狀。 這正是它在資料結構中有用的原因——重組樹形不丟失資料。
但這個性質對考拉茲是致命的。
定理 1(旋轉不可見性 No-go)。 覆蓋性(命題 1)是旋轉等價類商空間上的不變量。任何只操作樹形狀的方法——旋轉、splay、平衡——都無法觸及覆蓋性。
論證。 旋轉按定義保持節點集合不變。考拉茲的全部困難在於節點集合是否等於 (命題 1)。一個不改變節點集合的操作,無論如何組合,都不可能改變「節點集合是否等於 」這一事實。
此外,由 Sleator–Tarjan–Thurston 的經典結果,固定節點集的所有二叉樹形狀在旋轉下構成連通圖(associahedron 的 1-骨架),即旋轉在形狀空間上本來就傳遞。因此「旋轉群是否傳遞」這個問題,若指形狀空間則 trivially true 且與考拉茲無關;若指作用在 上,則旋轉根本不是數字上的操作,構不成。兩種詮釋都是死路。
方法論教訓。 考拉茲的困難不在「樹擺成什麼形狀」,而在「哪些數字進入樹」。前者是旋轉管轄的自由度,後者是生成規則管轄的自由度。把賭注押在形狀自由度上的整類方法,注定失明。
3. 從旋轉到么半群:正確的代數對象
既然自由度不在形狀,就只能在節點生成規則本身。正確的代數對象是兩個生成算子的么半群。
定義 5。 令 (無條件), (僅當 )。考慮么半群 在 上的作用。
命題 2。 考拉茲猜想 在 下的軌道等於 。
等價地,反向觀察每個 到根的路徑,得到一個正向軌跡的奇偶字
問題從「群的傳遞性」轉為「字語言 的形式語言類別」。這是真正的技術棧轉移——從代數轉到自動機理論。
4. 字語言的局部結構(實證)
以下結論皆由對 的窮舉計算得出(代碼見附錄 A.2)。
4.1 禁止因子與唯一下降閘門
觀察 1。 在 個字中,因子 uu 出現 0 次;最大 -run 長度為 。
命題 3。 字語言滿足 ,即每個 後必接至少一個 。
證明。 對應 。 奇時 必偶,故下一步必為 。等價地, 算子的值域為奇數( ),而 的定義域為 的偶數,二者不交,故 永不可能連續發生。
換言之,所有「下降」(縮小數值的潛在能力)的閘門完全鎖死在 的節點上;所有奇數節點都是純鏈節點,只有左子 。
4.2 比例不變量
觀察 2。 在 時為 ,在 時為 ,隨範圍微升。
推導(標為推導,非定理)。 兩條獨立關係:
聯立得 , ,總長 ,與 4.1.2 節獨立測得的 自洽。微升項即 的修正。注意 是天真比例估計,被真實的 d-run 期望(=2)主導後修正為約 2。
4.3 d-run 分佈
觀察 3。 d-run 長度( )的計數為 ,呈幾何衰減,期望 ,與 的幾何分佈理論一致。
4.4 公共後綴森林
觀察 4。 不同起點的字常共享相同後綴。例: (長 111)與 (長 118)的軌跡字後段完全相同。
這是軌跡匯流的直接體現:兩條軌跡一旦到達同一個值,到根的剩餘路徑即鎖死為同一條。因此 並非任意字集,而是一個共享公共後綴森林的語言——每個字的後綴即它與其他節點的公共祖先路徑。匯流結構等同於樹結構本身。
5. 通用指紋提取器
上述分析的全部機制可抽象成一個與「考拉茲是否被解」完全脫鉤的工具:對任意迭代映射 (奇)/ (偶),提取其字語言指紋。
對三個參數運行同一套程式(代碼見附錄 A.3),結果如下:
| 映射 | 收斂率 | uu 禁止 | 吸引子數量 | ||
|---|---|---|---|---|---|
| 100% | 1.94 | True | 1(全歸於 1) | 1.98 | |
| 100% | 1.99 | True | 3(1, 5, 17) | 2.04 | |
| 7.26% | 2.69 | True | 3 | 2.75 |
幸存者偏差作為指紋。 的 高於收斂的 (1.94),直覺上「除更多 2 應更收斂」,但它 92.7% 發散。原因是統計僅在收斂軌跡上進行,2.69 只是 7% 倖存者的數字; 的真實生成偏好是發散(每壓縮步 )。這個異常本身即指紋:當收斂樣本的比例反常偏高,它指示該映射的收斂是被篩選的少數而非常態。逼近的偏差不是噪音,是訊號。
6. 第二個負面結果:局部正則 ≠ 全局可判定
第 5 節的三映射數據蘊含一個比定理 1 更乾淨的結論。
定理 2(實證版分離)。 局部語言約束對全局判定幾乎零預測力。
論證。 、 、 共享完全相同的局部語言(皆禁 uu,皆為 奇的族不變量),但其全局行為天差地別: 單吸引子收斂、 三吸引子收斂、 主導發散。三個系統擁有相同的有限自動機層級結構,卻有完全不同的命運。
這是用三個並排實例實證了「局部正則性無法決定全局終止性」——不是抽象援引 Post 定理,而是直接擺出三個有相同局部語法、不同全局歸宿的具體系統。困難因此被定位:它不在自動機可見的局部層,而在自動機不可見的全局判定層。
7. 方法論結算
本文的三個主要成果,按誠實的當量排列:
- 旋轉不可見性(定理 1):拓撲重組類方法對覆蓋性結構性失明。一整類方法被排除。
- 么半群字語言翻譯(命題 2、第 4 節):問題被乾淨地搬入自動機理論,局部結構完全鎖定(單一禁止因子
uu,比例與分佈不變量自洽)。 - 局部正則 ≠ 全局可判定(定理 2):用三映射實證困難所在的精確層級。
沒有一個成果讓我們更接近證明。但它們合起來劃定了一條清晰的不可能邊界:旋轉、形狀代數、初等自動機——這些工具對考拉茲的核心困難全部失效。殘存的希望被逼到唯一的活門: 與 這組特定常數的算術特殊性,而非任何可推廣的結構。
這條偵察路徑的真正產物,不是地圖上的前進,而是地圖上劃掉的死路,以及一個可獨立使用的工具(指紋提取器,第 5 節)。
附錄 A:代碼範例
A.1 二叉逆樹與覆蓋性
def parent(m):
if m == 1:
return None
return m // 2 if m % 2 == 0 else 3 * m + 1
def right_child(n):
# n ≡ 4 mod 6 → (n-1)/3 = 2k+1 永遠為奇, 條件自動滿足
if n > 1 and n % 6 == 4:
return (n - 1) // 3
return None
def left_child(n):
return 2 * n
def stopping_time(n):
t = 0
while n != 1:
n = n // 2 if n % 2 == 0 else 3 * n + 1
t += 1
if t > 100000:
return -1
return t
# 推論 1: rho(n) = stopping_time(n) 恆成立
A.2 字語言分析(禁止因子、比例、run-length)
def collatz_word(n):
"""返回正向軌跡的 u/d 字"""
w = []
while n != 1:
if n % 2 == 1:
w.append('u'); n = 3 * n + 1
else:
w.append('d'); n = n // 2
if len(w) > 100000:
return None
return ''.join(w)
def analyze(N):
uu_hits = 0
sum_u = sum_d = 0
from collections import Counter
d_runs = Counter()
for start in range(1, N + 1):
w = collatz_word(start)
if w is None:
continue
sum_u += w.count('u'); sum_d += w.count('d')
if 'uu' in w:
uu_hits += 1
i = 0
while i < len(w):
j = i
while j < len(w) and w[j] == w[i]:
j += 1
if w[i] == 'd':
d_runs[j - i] += 1
i = j
return uu_hits, sum_d / sum_u, dict(sorted(d_runs.items()))
A.3 通用指紋提取器(任意 qn+c)
from collections import Counter
def trajectory_word(n, q, c, max_steps=2000, max_val=10**15):
"""返回 (狀態, u/d字, 吸引子標籤)
狀態: 'halt'=進入循環 | 'escape'=逃逸"""
seen, w, step = {}, [], 0
while step < max_steps:
if n in seen:
idx = list(seen.values()).index(seen[n])
cycle_min = min(list(seen.keys())[idx:] + [n])
return 'halt', ''.join(w), cycle_min
if n > max_val:
return 'escape', ''.join(w), None
seen[n] = step
if n % 2 == 1:
w.append('u'); n = q * n + c
else:
w.append('d'); n = n // 2
step += 1
return 'escape', ''.join(w), None
def fingerprint(q, c, N):
halt = escape = sum_u = sum_d = uu_hits = 0
attractors = Counter()
for start in range(1, N + 1):
state, w, attr = trajectory_word(start, q, c)
if state == 'halt':
halt += 1
attractors[attr] += 1
sum_u += w.count('u'); sum_d += w.count('d')
if 'uu' in w:
uu_hits += 1
else:
escape += 1
return {
'map': f"{q}n{'+' if c>=0 else ''}{c}",
'halt_rate': halt / N,
'd/u': (sum_d / sum_u) if sum_u else float('nan'),
'uu_forbidden': uu_hits == 0,
'num_attractors': len(attractors),
'top_attractors': attractors.most_common(3),
}
# 用法: 同一套程式, 不同參數
# for q, c in [(3,1), (3,-1), (5,1)]: print(fingerprint(q, c, 10000))
我們想用形狀解開它,它告訴我們形狀無關;我們想用結構解開它,它告訴我們結構有限而判定無窮。這份報告唯一確定的成果,是把幾條路標上了「此路不通」——而在一片宣稱走通了的喧嘩裡,誠實地劃掉死路,本身就是一種前進。