跳转至

初等函数与 EML 算子

Warning

AI 声明

本文由 GLM-5-Turbo 撰写!暂未经过人工校对!请读者谨慎辨别文章内容的准确性和可靠性!如果你发现了任何错误或者有任何建议,欢迎在评论区留言!

内容链:从两颗种子到整个计算器

整篇文章的构造路线如下:

起点:eml 算子 \(\text{eml}(x, y) = e^x - \ln(y)\) + 常数 \(1\)。所有计算在复数域 \(\mathbb{C}\) 上进行(对数取主值分支)。

推导链:

  1. 基本常数与函数:从 eml 和 1 直接得到 \(e\)、\(e^x\)、\(\ln(x)\)
  2. 减法:\(\ln x - \ln y\) 搭配 eml 的 \(e^x - \ln y\) 结构,消去超越函数部分,留下纯减法
  3. 零与负数:有了减法就能造 \(0 = x - x\)、\(-1 = 0 - 1\),进而 \(2 = -(-1)\)
  4. 取反:利用后继、前驱、倒数三个操作组合出 \(-x\)
  5. 四则运算:取反 + 减法 → 加法;通过 exp-log 恒等式 → 乘法、除法、幂运算
  6. 代数运算:开方 \(x^{1/2} = e^{\frac{1}{2}\ln x}\)
  7. 复数域:\(\ln(-1) = i\pi\) → 提取 \(\pi\) 和虚数单位 \(i\)
  8. 三角函数:欧拉公式 \(e^{ix} = \cos x + i\sin x\) + 取虚部/实部 → \(\sin\)、\(\cos\)、\(\tan\) 及其反函数、双曲函数

到达第 8 步后,科学计算器上的全部按键都可以用 eml 树表达出来。语法规则自始至终只有一条:

\[S \to 1 \mid \text{eml}(S, S)\]

EML 算子:定义

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

EML,全称 Exp-Minus-Log。一个二元运算,配上常数 \(1\),就能构造出科学计算器上的全部功能。

常数 \(1\) 的作用是"消掉"对数项:\(\ln(1) = 0\),所以 \(\text{eml}(x, 1) = e^x - 0 = e^x\),直接就是指数函数。

下面按推导链的顺序,一步步展开。

第一步:基本常数与函数

常数 \(e\)

\[e = \text{eml}(1, 1) = e^1 - \ln(1) = e - 0 = e\]

RPN 代码:1 1 eml,长度 \(K = 3\)。

指数函数 \(e^x\)

\[e^x = \text{eml}(x, 1)\]

把 \(y = 1\) 代入,\(\ln(1) = 0\),剩下 \(e^x\)。这是整个体系中最简单的函数,深度 1。

自然对数 \(\ln(x)\)

\[\ln(x) = \text{eml}(1, \text{eml}(\text{eml}(1, x), 1))\]

这个构造有点绕,展开来看:

  • 内层:\(\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 的结构:

\[\text{eml}(\ln x, \exp y) = e^{\ln x} - \ln(e^y) = x - y\]

这就是减法。eml 本身就是 \(e^x - \ln y\) 的形式,当第一个参数是对数、第二个参数是指数时,超越函数部分恰好对消,留下纯减法。

RPN 代码:ln x exp y eml,长度 \(K = 5\)。

第三步:零与整数常数

有了减法,造 \(0\) 就很直接了:

\[0 = x - x\]

然后是负整数:

\[-1 = 0 - 1\]
\[2 = -(-1)\]

更大的整数可以通过反复加减得到。不过用 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\)。

答案是:

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

展开验证,从内到外逐步算:

  1. \(\text{inv}(x) = 1/x\)
  2. \(\text{suc}(1/x) = 1/x + 1\)
  3. \(\text{inv}(1/x + 1) = 1/(1/x + 1) = x/(x+1)\)
  4. \(\text{pre}(x/(x+1)) = x/(x+1) - 1 = -1/(x+1)\)
  5. \(\text{inv}(-1/(x+1)) = -(x+1)\)
  6. \(\text{suc}(-(x+1)) = -(x+1) + 1 = -x\)

嵌套深度 6,验证通过。

在 eml 体系中,这三个辅助函数各自有对应的 eml 表达式(其中 pre 本身就是减法的特例,suc 也是减法加上 \(-1\) 的组合),拼在一起后取反的总嵌套深度相当深——编译器输出 \(K = 57\),但直接搜索可以缩到 \(K = 15\)。

第五步:四则运算

加法

有了取反和减法,加法就来了:

\[x + y = x - (-y)\]

编译器输出 \(K = 27\),直接搜索 \(K = 19\)。

乘法

乘法走 exp-log 路线:

\[x \times y = e^{\ln x + \ln y}\]

右边就是 \(\text{eml}(\text{加法}(\ln x, \ln y), 1)\)。把每一步中间结果替换成 eml 表达式后,编译器输出 \(K = 41\),直接搜索 \(K = 17\)。

除法

\[x / y = x \times (1/y)\]

先取倒数再乘。编译器 \(K = 105\),直接搜索 \(K = 17\)。

幂运算

\[x^y = e^{y \ln x}\]

编译器 \(K = 49\),直接搜索 \(K = 25\)。

到这里,四则运算加幂运算全部到位。回头看,整个体系的核心思路是:exp 和 ln 互为逆运算,eml 把它们不对称地塞进同一个二元算子,减法刚好消掉超越部分。剩下的四则运算全靠 exp 和 ln 之间的经典恒等式来翻译。

第六步:代数运算

开方是幂运算的特例:

\[\sqrt{x} = x^{1/2} = e^{\frac{1}{2}\ln x}\]

编译器 \(K = 139\),直接搜索 \(K \geq 35\)(搜索超时,只找到了下界)。

类似地,\(x^2 = x \times x\)(\(K = 17\)),\(x/2\) 等分数也都能构造。

第七步:复数域——\(\pi\) 和 \(i\) 的登场

推导链到现在一直在实数域上操作。要从三角函数突破,必须进入复数。

关键事实是复数域上的对数有一个特殊值:

\[\ln(-1) = i\pi\]

其中 \(i\) 是虚数单位,\(\pi\) 是圆周率。注意这里取的是主值分支。

常数 \(\pi\)

\[\pi = \sqrt{-\left(\ln(-1)\right)^2}\]

\(\ln(-1)\) 的模是 \(\pi\),平方后取负再开方,就得到 \(\pi\)。编译器 \(K = 193\)。

虚数单位 \(i\)

有了 \(\pi\) 之后:

\[i = e^{i\pi/2}\]

需要用到取虚部操作。实际构造中,\(i\) 的 eml 表达式相当深(编译器 \(K = 131\)),因为它需要在复数运算中正确处理分支切割。

值得一提的是,整个体系必须工作在复数域上——至少内部计算如此。就像量子计算用复振幅来算实概率,eml 用复数中间结果来算实数初等函数。这是因为要得到 \(\pi\) 和 \(i\),就必须对负数取对数,而纯实数域上的 \(\ln\) 对负数没有定义。作者在论文中提到,他尝试过用三角/双曲函数替代 exp/ln 来寻找纯实数域的 Sheffer 算子,但一无所获。纯实数域上的连续 Sheffer 算子是否存在,仍然是个开放问题。

第八步:三角函数

有了 \(i\) 之后,欧拉公式就可以工作了:

\[e^{ix} = \cos x + i\sin x\]

三角函数的标准分解:

\[\sin x = \frac{e^{ix} - e^{-ix}}{2i}, \quad \cos x = \frac{e^{ix} + e^{-ix}}{2}\]

其中 \(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\)。

双曲函数更直接:

\[\cosh x = \frac{e^x + e^{-x}}{2}, \quad \sinh x = \frac{e^x - e^{-x}}{2}\]

这些都可以用已经有的 exp 和加法/减法/除法组合出来。

至此,科学计算器上的所有按键——加减乘除、幂运算、开方、\(\ln\)、\(e^x\)、\(\sin\)、\(\cos\)、\(\tan\)、\(\arcsin\)、\(\sinh\)、\(\cosh\)、\(\tanh\)、\(\text{arsinh}\)、\(\text{arcosh}\)、\(\text{artanh}\)——都能用 eml 树表达。

一棵树,一条文法

所有 eml 表达式共享同一个上下文无关文法:

\[S \to 1 \mid \text{eml}(S, S)\]

要么是常数 \(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)\) 这种组合在高数课本上随处可见。但把它提升到"通用算子"的位置,需要跨越几道坎:

  1. 搜索空间巨大。可能的二元算子太多了,穷举不现实。作者是通过系统性的数值筛选方法——把代数无关的超越数(欧拉-马斯刻若尼常数 \(\gamma\)、Glaisher-Kinkelin 常数 \(A\) 等)代入验证,排除伪解——才锁定 eml 的。

  2. 非对称性被忽视。之前人们倾向于找对称的、可交换的运算,而 eml 关于两个参数是不对称的——\(e^x\) 和 \(-\ln(y)\) 扮演完全不同的角色。

  3. 验证本身就很困难。典型的 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 和模拟电路的类比图。当然,由于嵌套太深,实际计算效率不如直接调用标准库函数,但作为一种结构性的理论结果,它确实把初等函数的"基因"揭示得很清楚。


参考来源:

评论