一個運算子統治所有函數:EML 算子與連續數學的 NAND 閘

前陣子在 arXiv 上看到一篇論文,看完之後我整個人愣住了

標題很樸素,All elementary functions from a single operator,作者是波蘭 Jagiellonian 大學的理論物理學家 Andrzej Odrzywolek,他發現了一件事:

一個二元運算子 eml(x, y) = exp(x) − ln(y),配上常數 1,就能建構出科學計算機上的所有函數

sin, cos, tan, log, sqrt, 加減乘除, 指數, 反三角函數, 雙曲函數,全部都可以

這等於是在說,你手上那台科學計算機的 36 個按鈕,其實只需要 2 個就夠了

為什麼這件事不平凡

學過數位邏輯的人都知道 NAND 閘,在布林邏輯的世界裡,NAND 是一個「萬能閘」:AND, OR, NOT, XOR… 所有邏輯運算都可以只用 NAND 組合出來,這是數位電路的基石,也是為什麼晶片上可以只用一種電晶體結構就建構出任意複雜的邏輯

但在連續數學的世界裡,從來沒有人找到過這樣的東西

我們知道很多函數之間有冗餘關係,tan = sin/cos,√x = x^(1/2),sinh 和 cosh 可以用 exp 表達,Euler 公式把三角函數和指數函數統一了。歷史上對數的發明把乘法化約成加法,Euler 公式進一步把 exp 和 ln 確立為核心,但化約到 exp 和 ln 之後就一直卡在那裡

幾百年來沒有人再往下走一步

Odrzywolek 做的事情是用系統性的窮舉搜尋,一步步把科學計算機的 36 個基本元素(常數、函數、運算子)往下削減,從 36 個削到 Wolfram Mathematica 的 7 個,再到 6 個、4 個、3 個,最後削到只剩 2 個:一個運算子 EML,一個常數 1

EML 怎麼運作

定義極其簡單:

$$\text{eml}(x, y) = e^x - \ln(y)$$

幾個直觀的例子:

  • e = eml(1, 1),因為 e¹ − ln(1) = e − 0 = e
  • exp(x) = eml(x, 1),因為 eˣ − ln(1) = eˣ
  • ln(x) = eml(1, eml(eml(1, x), 1)),這個就開始反直覺了

到了乘法和三角函數,EML 表達式的深度可以到 8 層甚至更深,論文中有一個完整的推導鏈(Figure 1),從 eml 和 1 出發逐步建構出 e → exp → ln → 0 → −1 → minus → i → π → 加法 → 減法 → 乘法 → 除法 → 指數 → 所有三角函數

整條鏈的文法極其簡單:S → 1 | eml(S, S),就這樣,一個 context-free grammar 就能生成所有基礎數學函數

這套文法我照著論文寫成了一個小編譯器,也放上來讓你自己玩。輸入任何公式,它會即時把式子拆成一棵只剩 eml 和 1 的樹,連 sin、cos 這種看起來很基本的函數,都會被展開成好幾百個節點:

EML 編譯器 · 線上實驗

eml(x, y) = eˣ − ln(y)
>

0節點數
0葉子(1 與變數)
0巢狀深度
emltree — 只用 eml 與 1 疊出來
ASCII 樹
巢狀式
RPN 逆波蘭
數值驗算

每個 eml 節點都是 eˣ − ln(y),整棵樹就只有這一種運算子,外加常數 1 和變數。試試 sin²+cos²,看它在數值上剛好收斂到 1。

這個發現的搜尋過程本身就很精彩

論文裡有一個小例子很好地說明了為什麼這類問題不能靠直覺解決

假設你只有三個運算:suc(x) = x + 1,pre(x) = x − 1,inv(x) = 1/x,請問怎麼算出 −x?

答案是:

$$\text{suc}(\text{inv}(\text{pre}(\text{inv}(\text{suc}(\text{inv}(x)))))) = -x$$

深度 5 的巢狀,完全違反直覺,而 EML 的建構過程中充滿了這種 Kolmogorov 複雜度在 7 到 9 之間的表達式,根本不可能靠人腦硬想

Odrzywolek 的方法是混合式的,先把代數無關的超越常數(像 Euler-Mascheroni 常數)代入變數,用數值計算篩選候選公式,再用符號計算驗證,整個搜尋過程用 Mathematica 實作,後來又用 GPT Codex 翻譯成 Rust,速度快了三個數量級

為什麼我覺得這對量化交易和深度學習有重大意義

這裡才是我真正想說的

符號回歸:從數據中發現精確公式

量化交易和科學建模中有一個核心問題,你有一堆數據,你想找到背後的精確數學公式,這就是符號回歸(Symbolic Regression)的領域

傳統的符號回歸方法不管是遺傳演算法還是更現代的方法,都面臨一個根本困難:搜尋空間是異質的,你需要同時搜尋要用哪些運算子(+, −, ×, sin, log…)以及它們的組合方式,這讓搜尋空間既巨大又不規則

EML 徹底改變了這個局面

因為所有基礎函數都可以用同一個運算子表達,搜尋空間變成了一棵均質的二元樹,每個節點都是 eml,每個葉子不是 1 就是輸入變數 x,你不需要決定「這裡該放 sin 還是 log」,只需要決定樹的結構和每個葉子的值

更關鍵的是這棵樹是可微分的,論文中展示了一個「master formula」的概念:在樹的每個輸入位置放一個線性組合 αᵢ + βᵢx + γᵢf,其中 α, β, γ 是可訓練的參數,然後用 Adam optimizer 做梯度下降,訓練完之後把權重 snap 到最近的 0 或 1,就能恢復出精確的符號表達式

論文的實驗結果是在深度 2 的樹上從隨機初始化出發,100% 的實驗都能恢復出正確的公式,深度 3-4 約 25%,深度 5 以上就很難了,但重點是:當你從正確解附近出發時,即使深度 5 和 6 也能 100% 收斂回去,這意味著正確的 basin of attraction 是存在的,問題只在於如何找到它

對量化交易的意義

在量化交易中我們經常需要從市場數據中挖掘出有預測力的因子或公式,傳統做法要嘛是人工構造因子(依賴領域知識和直覺),要嘛是用機器學習的黑箱模型(有效但不可解釋)

EML 提供了一個中間路線:用梯度下降來搜尋精確的數學公式

想像一下,你把價格序列、成交量、波動率等數據餵進一個 EML tree,訓練後得到的不是一個不可解釋的神經網路權重矩陣,而是一個可以寫成封閉形式的數學公式,你可以直接看到這個因子的數學結構,理解它為什麼有效,判斷它是過擬合還是真的捕捉到了某種市場規律

這在風險管理和模型審計上的價值是巨大的

對深度學習的意義

論文中有一個很妙的觀察:任何傳統神經網路都是 EML tree 的特例

因為標準的激活函數(ReLU, sigmoid, tanh…)本身就是基礎函數,所以任何用這些激活函數建構的神經網路理論上都可以用 EML 表達,但反過來不成立,EML tree 能表達的東西比傳統神經網路更多

更重要的是可解釋性,傳統神經網路訓練完之後你得到的是一堆浮點數權重,沒有人能從中讀出物理意義,但 EML tree 訓練完之後如果權重能 snap 到精確值,你得到的是一個可讀的數學公式,這是一種傳統架構根本不可能提供的可解釋性

論文的原話是:

When this succeeds, the discovered circuits are legible as elementary function expressions — a form of interpretability unavailable to conventional architectures.

開放問題

這篇論文讓我最興奮的,反而是它還沒解決的問題

EML 需要一個特定常數 1 作為起點,NAND 閘不需要,它可以從任意輸入生成 0 和 1,那有沒有一個連續的二元運算子不需要任何特定常數就能生成所有基礎函數?Odrzywolek 自己也在找,他已經發現了一個三元版本 T(x, y, z) = eˣ/ln(x) × ln(z)/eʸ,滿足 T(x, x, x) = 1,但完整的驗證還在進行中

另一個問題是有沒有一個一元的 Sheffer,也就是一個激活函數既能像 ReLU 一樣用在神經網路中,又能精確計算所有基礎函數?如果這個東西存在,那深度學習的架構設計可能會被徹底改寫

最後

這篇論文讓我想起當初讀到那篇關於十二平均律的文章時的感覺,表面上看是一個純數學的發現,但它觸及的是一個非常根本的結構性問題:我們以為需要很多不同工具才能描述的世界,其實可能只需要一個

從 36 個按鈕到 2 個按鈕,這不只是一個數學遊戲,它揭示了基礎函數之間的冗餘程度遠遠超出我們的想像,而這種冗餘一旦被正確利用就能打開全新的計算範式

論文的 arXiv 編號是 2603.21852,程式碼和驗證工具都開源在 GitHub 上,如果你對符號回歸或數學基礎有興趣,這篇值得從頭到尾讀一遍


三個月後的後續(2026-07-04 更新)

這篇發出去之後我一直在追它的後續,本來以為這種純數學小圈子的話題很快就會安靜下去,結果三個月內它長出了一整片生態:跟進理論、機器驗證的證明、兩篇應用論文,還有一篇正經的反駁

一條一條講

它為什麼成立,現在有答案了

Odrzywolek 是用暴力搜尋找到 EML 的,搜到了,但沒有回答那個更根本的問題:憑什麼是它?

四月底 Tomasz Stachowiak 給出了答案(arXiv:2604.23893):EML 身上同時帶著阿貝爾群結構函數反演兩種成分,這對組合才是它能生成所有函數族的來源,一個「碰巧搜到」的算子,現在有了講得清楚的代數骨架

Lean 形式化,順手抓到論文裡的一個 bug

後續裡最硬核的是 eml-lean 這個專案,用 Lean 4 把 36 個基元全部形式化驗證了一遍,32 個檔案

驗證過程中它真的抓到一個 bug:原論文延伸出的一條引理是錯的,p=2, k=0 就是反例,要補上一個模性假設才成立,這正是形式化的價值:人眼會放過的東西,Lean 不會

更離奇的是這個專案從 exp(x) + ln(x) 這類東西一路延伸進了解析數論和模形式(Hecke 算子),一個計算機算子的玩具接到了數論,大概是所有支線裡最沒人料到的一條,R 生態也有人跟進寫了實作(emlR)

第一批應用出現了,附帶一盆冷水

有人把 EML 塞進了混合神經網路(arXiv:2604.13871):一般的 DNN 主幹,後面接一顆淺層的 EML「符號頭」,瞄準車用安全關鍵的邊緣運算,電動車動力系統、ISO 26262 認證這類場景

冷水是論文自己潑的:EML 每個節點要 111 FLOPs,普通激活函數只要 1 到 30,所以在 CPU/GPU 上它不會變快,好處要等客製 FPGA 或類比電路才拿得到,它還把復原率量了出來:深度 2 是 100%,深度 5 掉到 1% 以下,前面講的那道深度天花板,現在有實驗數字了

另一組人拿 EML 去做電池特性建模(arXiv:2604.13873),兩個都還在概念驗證階段,但至少有人動手了

機器學習拿它來做什麼

四月的時候我只敢說它對可解釋性「可能」有幫助,三個月後,有三件具體的事可以指著講

符號回歸引擎真的能跑了,eml-sr 這個專案把「均質可微分二元樹」做成能用的東西,ln(x) 還原到機器精度(RMSE 7.3e-17),exp(x) 深度 1 完美復原,還包了 sklearn 相容介面,「用梯度下降搜封閉形式公式」不再是紙上談兵

可解釋性也從口號變成了設計,DNN-EML 混合架構讓 MLP 主幹抽特徵 z,EML 樹當符號頭接在後面,葉子是仿射組合 αᵢ + βᵢᵀz + γᵢ·f,訓練完把權重逼到 {0,1},整個頭就 snap 成一條人看得懂的公式,而且這個家族被證明在 C(K,ℝ) 上稠密,萬能逼近沒有丟,白箱的頭是白送的

跟 KAN 放在一起看,就知道 EML 特別在哪:Kolmogorov-Arnold Network 靠邊上可學的 spline,primitive 庫要人工策展,硬體是異質的;EML 只有一顆 Sheffer cell,普適性是數學白給的,FPGA 上一顆 cell 就能實現任意初等函數,連 per-activation 查表都省了,這種硬體均質性,KAN 給不出來

「統治所有函數」,其實要打一個星號

反方也來了,而且打得有道理

stylewarning 寫了一篇 Not all elementary functions can be expressed with exp-minus-log,指出「all elementary functions」這句話只在 Odrzywolek 自訂的 36 個計算機符號的定義下成立,按數學界十九世紀以來的嚴格定義,EML 表達不出任意多項式的根,反例就是一般五次方程

證明走 Khovanskii 的拓撲伽羅瓦理論:每個 EML 項的單值群必然可解,而一般五次方程的單值群是不可解的 S₅,矛盾,所以嚴格說,EML 能表達的只是初等函數的真子集

所以這篇的標題「統治所有函數」,統治的是科學計算機那 36 顆按鍵,不是數學意義上的全部初等函數,這個限定原論文其實寫了,四月的我讀得太興奮,沒把它端上來

這裡有個很容易踩的坑:上面這個「五次方程」跟符號回歸那邊的「深度 5」毫無關係,兩個 5 純屬巧合,深度 5 是軟牆,正確的樹存在、算出來也對,只是梯度下降從隨機初始化找不到它,換好一點的 optimizer 或從解附近出發就能 100% 收斂,它是「不好找」;五次方程的根是硬牆,任何深度都寫不出來,這是 1824 年 Abel–Ruffini「五次無根式解」的延伸,加了 exp 和 ln 也救不回來,它是「根本不存在」,一個是最佳化問題,一個是表達能力問題

三個月看下來

理論、證明、應用、反駁,一個純數學小話題三個月跑完這一圈,擴散速度算很快了,但實用上的「厲害」還是被兩件事卡著:符號回歸的深度 5 天花板,和普通硬體上毫無速度優勢,此刻的 EML 依然是優雅多過好用

倒是那條從計算機算子一路接到模形式的支線,可能才是整件事最沒人預料到的地方,我會繼續追

後記:我自己也下場了

追後續追到手癢,我把四月自己寫的 Python 實作 emltree 移植成零依賴的 JS 版,兩邊一起發佈了,在這之前 npm 上一個 EML 套件都沒有,這個位置現在是我的了

  • Python 版:pip install emltree
  • JS 版:npm install emltree,附 npx emltree CLI,丟公式進去,吐 EML 樹出來

最有梗的是移植過程把 eml-lean 那段劇情重演了一次:JS 版測試一跑,抓到 Python 原版一個活了三個月的 bug,atan 的恆等式我寫成了 (i/2)·ln((i−x)/(i+x)),這個式子恆等於 −atan(x),正確的是 (i+x)/(i−x),而舊測試只蓋了 sin/cos/tan,它就一直安然無恙,用第二個實作交叉驗證第一個實作,跟用 Lean 驗證論文是同一件事的不同強度,換個語言重寫一遍,就是最便宜的形式化

延伸連結

文中提到的論文與專案: