初等函数与 EML 算子
Warning
AI 声明
本文由 GLM-5-Turbo 撰写!暂未经过人工校对!请读者谨慎辨别文章内容的准确性和可靠性!如果你发现了任何错误或者有任何建议,欢迎在评论区留言!
内容链:从两颗种子到整个计算器¶
整篇文章的构造路线如下:
起点:eml 算子 \(\text{eml}(x, y) = e^x - \ln(y)\) + 常数 \(1\)。所有计算在复数域 \(\mathbb{C}\) 上进行(对数取主值分支)。
推导链:
- 基本常数与函数:从 eml 和 1 直接得到 \(e\)、\(e^x\)、\(\ln(x)\)
- 减法:\(\ln x - \ln y\) 搭配 eml 的 \(e^x - \ln y\) 结构,消去超越函数部分,留下纯减法
- 零与负数:有了减法就能造 \(0 = x - x\)、\(-1 = 0 - 1\),进而 \(2 = -(-1)\)
- 取反:利用后继、前驱、倒数三个操作组合出 \(-x\)
- 四则运算:取反 + 减法 → 加法;通过 exp-log 恒等式 → 乘法、除法、幂运算
- 代数运算:开方 \(x^{1/2} = e^{\frac{1}{2}\ln x}\)
- 复数域:\(\ln(-1) = i\pi\) → 提取 \(\pi\) 和虚数单位 \(i\)
- 三角函数:欧拉公式 \(e^{ix} = \cos x + i\sin x\) + 取虚部/实部 → \(\sin\)、\(\cos\)、\(\tan\) 及其反函数、双曲函数
到达第 8 步后,科学计算器上的全部按键都可以用 eml 树表达出来。语法规则自始至终只有一条:
EML 算子:定义¶
EML,全称 Exp-Minus-Log。一个二元运算,配上常数 \(1\),就能构造出科学计算器上的全部功能。
常数 \(1\) 的作用是"消掉"对数项:\(\ln(1) = 0\),所以 \(\text{eml}(x, 1) = e^x - 0 = e^x\),直接就是指数函数。
下面按推导链的顺序,一步步展开。
第一步:基本常数与函数¶
常数 \(e\)¶
RPN 代码:1 1 eml,长度 \(K = 3\)。
指数函数 \(e^x\)¶
把 \(y = 1\) 代入,\(\ln(1) = 0\),剩下 \(e^x\)。这是整个体系中最简单的函数,深度 1。
自然对数 \(\ln(x)\)¶
这个构造有点绕,展开来看:
- 内层:\(\text{eml}(1, x) = e^1 - \ln(x) = e - \ln(x)\)
- 中层:\(\text{eml}(\text{eml}(1, x), 1) = e^{e - \ln(x)} - \ln(1) = e^{e - \ln(x)} = e^e / x\)
- 外层:\(\text{eml}(1, e^e / x) = e - \ln(e^e / x) = e - (e - \ln x) = \ln x\)
等价地,\(\ln x = e - \ln(e^e / x)\)。验证无误。
这是整个推导链中最难的一步。RPN 代码:1 1 x eml 1 eml eml,长度 \(K = 7\)。
第二步:减法¶
拿到 \(\ln\) 之后,减法是一个关键突破口。观察 eml 的结构:
这就是减法。eml 本身就是 \(e^x - \ln y\) 的形式,当第一个参数是对数、第二个参数是指数时,超越函数部分恰好对消,留下纯减法。
RPN 代码:ln x exp y eml,长度 \(K = 5\)。
第三步:零与整数常数¶
有了减法,造 \(0\) 就很直接了:
然后是负整数:
更大的整数可以通过反复加减得到。不过用 eml 直接表示时,嵌套深度会急剧增加——比如 \(2\) 用编译器输出 \(K = 27\),直接搜索最短表达式也要 \(K = 19\)。简单来说,"自然"的递推表达式和"最短"的 eml 表达式通常不是同一个。
第四步:取反¶
光有减法还不够,我们需要能对任意 \(x\) 取反。论文中的做法是先构造三个辅助函数——后继(suc)、前驱(pre)和倒数(inv),再用它们拼出取反。
这个构造来自有理函数生成的一个经典练习(参见 Halmos 的 A Problem Seminar):只用 \(\text{suc}(x) = x + 1\)、\(\text{pre}(x) = x - 1\)、\(\text{inv}(x) = 1/x\) 三个操作,构造 \(-x\)。
答案是:
展开验证,从内到外逐步算:
- \(\text{inv}(x) = 1/x\)
- \(\text{suc}(1/x) = 1/x + 1\)
- \(\text{inv}(1/x + 1) = 1/(1/x + 1) = x/(x+1)\)
- \(\text{pre}(x/(x+1)) = x/(x+1) - 1 = -1/(x+1)\)
- \(\text{inv}(-1/(x+1)) = -(x+1)\)
- \(\text{suc}(-(x+1)) = -(x+1) + 1 = -x\)
嵌套深度 6,验证通过。
在 eml 体系中,这三个辅助函数各自有对应的 eml 表达式(其中 pre 本身就是减法的特例,suc 也是减法加上 \(-1\) 的组合),拼在一起后取反的总嵌套深度相当深——编译器输出 \(K = 57\),但直接搜索可以缩到 \(K = 15\)。
第五步:四则运算¶
加法¶
有了取反和减法,加法就来了:
编译器输出 \(K = 27\),直接搜索 \(K = 19\)。
乘法¶
乘法走 exp-log 路线:
右边就是 \(\text{eml}(\text{加法}(\ln x, \ln y), 1)\)。把每一步中间结果替换成 eml 表达式后,编译器输出 \(K = 41\),直接搜索 \(K = 17\)。
除法¶
先取倒数再乘。编译器 \(K = 105\),直接搜索 \(K = 17\)。
幂运算¶
编译器 \(K = 49\),直接搜索 \(K = 25\)。
到这里,四则运算加幂运算全部到位。回头看,整个体系的核心思路是:exp 和 ln 互为逆运算,eml 把它们不对称地塞进同一个二元算子,减法刚好消掉超越部分。剩下的四则运算全靠 exp 和 ln 之间的经典恒等式来翻译。
第六步:代数运算¶
开方是幂运算的特例:
编译器 \(K = 139\),直接搜索 \(K \geq 35\)(搜索超时,只找到了下界)。
类似地,\(x^2 = x \times x\)(\(K = 17\)),\(x/2\) 等分数也都能构造。
第七步:复数域——\(\pi\) 和 \(i\) 的登场¶
推导链到现在一直在实数域上操作。要从三角函数突破,必须进入复数。
关键事实是复数域上的对数有一个特殊值:
其中 \(i\) 是虚数单位,\(\pi\) 是圆周率。注意这里取的是主值分支。
常数 \(\pi\)¶
\(\ln(-1)\) 的模是 \(\pi\),平方后取负再开方,就得到 \(\pi\)。编译器 \(K = 193\)。
虚数单位 \(i\)¶
有了 \(\pi\) 之后:
需要用到取虚部操作。实际构造中,\(i\) 的 eml 表达式相当深(编译器 \(K = 131\)),因为它需要在复数运算中正确处理分支切割。
值得一提的是,整个体系必须工作在复数域上——至少内部计算如此。就像量子计算用复振幅来算实概率,eml 用复数中间结果来算实数初等函数。这是因为要得到 \(\pi\) 和 \(i\),就必须对负数取对数,而纯实数域上的 \(\ln\) 对负数没有定义。作者在论文中提到,他尝试过用三角/双曲函数替代 exp/ln 来寻找纯实数域的 Sheffer 算子,但一无所获。纯实数域上的连续 Sheffer 算子是否存在,仍然是个开放问题。
第八步:三角函数¶
有了 \(i\) 之后,欧拉公式就可以工作了:
三角函数的标准分解:
其中 \(e^{ix} = \text{eml}(ix, 1)\),\(e^{-ix} = \text{eml}(-ix, 1)\),取虚部/实部可以通过 eml 的组合来实现。剩下的操作全是前面已经构造好的除法和加法。
\(\tan x = \sin x / \cos x\),\(\cot x = \cos x / \sin x\),以此类推。反三角函数通过反函数关系构造——比如 \(\arcsin x = \pi/2 - \arccos x\)。
双曲函数更直接:
这些都可以用已经有的 exp 和加法/减法/除法组合出来。
至此,科学计算器上的所有按键——加减乘除、幂运算、开方、\(\ln\)、\(e^x\)、\(\sin\)、\(\cos\)、\(\tan\)、\(\arcsin\)、\(\sinh\)、\(\cosh\)、\(\tanh\)、\(\text{arsinh}\)、\(\text{arcosh}\)、\(\text{artanh}\)——都能用 eml 树表达。
一棵树,一条文法¶
所有 eml 表达式共享同一个上下文无关文法:
要么是常数 \(1\),要么是把两个子表达式丢进 eml。每一个初等函数公式都可以表示成一棵完全二叉树,每个内部节点都是 eml。输入变量 \(x\) 作为额外的叶节点加入。
这种结构和 Catalan 数、满二叉树等组合对象同构。本质上,初等函数并不像课本上看起来那样五花八门——加法、乘法、三角函数、对数,它们都是同一种树状结构的实例。和数字电路用 NAND 门搭建任意布尔电路的思想如出一辙。
下表列出了各个操作的 eml 表达复杂度(RPN 代码长度 \(K\)):
| 操作 | 编译器 | 直接搜索最短 |
|---|---|---|
| \(1\) | 1 | 1 |
| \(e\) | 3 | 3 |
| \(e^x\) | 3 | 3 |
| \(\ln x\) | 7 | 7 |
| \(x - y\) | 83 | 11 |
| \(-x\) | 57 | 15 |
| \(1/x\) | 65 | 15 |
| \(x + y\) | 27 | 19 |
| \(x \times y\) | 41 | 17 |
| \(x / y\) | 105 | 17 |
| \(x^y\) | 49 | 25 |
| \(\sqrt{x}\) | 139 | ≥ 35 |
编译器的输出远不是最优的——直接穷举搜索能找到短得多的表达式。但即便是最短表达式,像 \(\sqrt{x}\) 这样的操作也要 \(K \geq 35\) 条 RPN 指令。eml 表达式的嵌套深度普遍在 5 到 9 层之间,论文原文说这些公式"defy intuitive construction"——不太直觉,但验证无误。
符号回归:从数据中发现公式¶
论文后半部分做了一个有意思的应用。既然 eml 树能表示一切初等函数,那能不能反过来——给一组 \((x, y)\) 数据,自动发现背后的公式?
作者的思路是构造一个"主公式"(master formula):一棵参数化的 eml 二叉树,每个节点的输入是 \(\alpha_i + \beta_i x + \gamma_i f\)(\(\alpha, \beta, \gamma\) 是可训练参数,\(f\) 是来自下层节点的输出)。通过 softmax 把 \(\alpha, \beta, \gamma\) 归一化为概率,再用 Adam 优化器做梯度下降。
当数据的生成规律确实是一个初等函数时,训练得到的权重会收敛到精确的 \(0\) 或 \(1\)(对应"选 1"、"选 x"或"选下层结果"),从而恢复出精确的闭式公式。论文展示了成功恢复 \(\ln x\) 等函数的实验结果。
在深度不超过 4 的树上,盲恢复成功率在深度 2 时是 100%,深度 3-4 时约 25%,深度 5 时不到 1%,深度 6 在 448 次尝试中一次也没成功。但如果把正确答案的权重加上高斯噪声,优化器在深度 5-6 时仍能 100% 收敛回去——说明正确解的吸引盆确实存在,只是从随机初始化出发很难找到。
传统的符号回归(比如遗传编程)需要在一个没有结构的表达式空间里暴力搜索,而 eml 树提供了一个有结构的、同构于完全二叉树的搜索空间,梯度方法可以更高效地探索。
为什么之前没人发现?¶
eml 的形式并不复杂,\(e^x - \ln(y)\) 这种组合在高数课本上随处可见。但把它提升到"通用算子"的位置,需要跨越几道坎:
-
搜索空间巨大。可能的二元算子太多了,穷举不现实。作者是通过系统性的数值筛选方法——把代数无关的超越数(欧拉-马斯刻若尼常数 \(\gamma\)、Glaisher-Kinkelin 常数 \(A\) 等)代入验证,排除伪解——才锁定 eml 的。
-
非对称性被忽视。之前人们倾向于找对称的、可交换的运算,而 eml 关于两个参数是不对称的——\(e^x\) 和 \(-\ln(y)\) 扮演完全不同的角色。
-
验证本身就很困难。典型的 eml 表达式嵌套深度 5-9 层,符号化简 exp-ln 组合在 Mathematica 里都会触发内核崩溃。作者不得不改用数值方法:在一个点上验证等式成立(基于 Schanuel 猜想,代数无关的超越数代入时,两个不等表达式的数值几乎不可能碰巧相等),再在补充材料中用四种实现(C、NumPy、PyTorch、mpmath)交叉验证。
并不唯一¶
EML 不是唯一的功能完备算子。论文还提到了几个变体:
- EDL:\(\text{edl}(x, y) = e^x / \ln(y)\),除法代替减法,常数换成 \(e\)
- \(-\text{eml}(y, x)\):\(\ln(x) - e^y\),参数交换加取反,常数换成 \(-\infty\)
这说明 eml 的"万能性"并不是一个巧合,而是一类算子共享的性质。
更有意思的是,作者已经找到了一个三元算子的候选 \(T(x, y, z) = e^x / \ln x \times \ln z / e^y\),不需要任何特殊常数。但纯实数域的 Sheffer 算子是否存在,仍然是开放问题。
一个两按钮的计算器¶
写到最后,想想这个体系:一个只有两个按钮的科学计算器——一个按钮是 eml,另一个按钮是 1。从这两颗种子出发,能长出 \(e\)、\(\pi\)、\(i\)、加减乘除、\(\sin\)、\(\cos\)、\(\ln\)、\(\sqrt{\phantom{x}}\) 以及科学计算器上的全部功能。
实现上,这种纯 eml 表达式可以跑在符号计算引擎(Mathematica)或 IEEE 754 浮点(C 的 <math.h>)上。作者甚至做了 FPGA 和模拟电路的类比图。当然,由于嵌套太深,实际计算效率不如直接调用标准库函数,但作为一种结构性的理论结果,它确实把初等函数的"基因"揭示得很清楚。
参考来源:
- Odrzywolek, A. (2026). All elementary functions from a single binary operator. arXiv:2603.21852v2. | 论文链接 | 代码仓库 | 数据集