一切运算的根本 是 加法
这篇文章是关于"加法"这个概念本身的看法。
加法看起来太简单了——幼儿园就会。但恰恰因为它太简单,反而最容易被忽略。这里提出三个论证,重新审视加法到底是什么。
论证一:拆——一切算法、一切算术,都是加法
"无论多复杂的系统,底层拆开都是加法"——这句话听起来像夸张,但逐层拆解会发现确实如此。
算术层:拆四则运算
从最基础的算术开始,拆解每一个运算的底层:
- 加法——原子操作,不可再分。1 + 1 = 2,运算的最小单位
- 减法 = 加负数。
。减去一个数,就是加上它的相反数。减法不是独立运算,它是加法在数轴反方向的延伸 - 乘法 = 连加。3 × 5 = 3 + 3 + 3 + 3 + 3
- 除法 = 乘倒数 = 连加的逆用。
。除以一个数,就是乘以它的倒数——而乘法本身又是连加,所以除法是两层加法的嵌套 - 指数 = 连乘 = 加法的叠加。2³ = 2 × 2 × 2 = (2+2)+(2+2)
- 多项式 = 乘积累加。
底层的计算单元:乘 → 加
四则运算在小学课本上是四个并列的概念,但拆开来看,减和乘是加法的变体,除法是加法的两层嵌套——真正独立的运算只有一个:加法。
线性代数层:拆矩阵运算
- 矩阵乘法
: ——对应元素相乘再求和 - 向量点积:
——乘积累加 - 所有线性变换,最终都是加权求和
深度学习层:拆神经网络
- 一个神经元:
——加权加法 + 激活 - 全连接层 = 矩阵乘法 = 大量加法的集合
- 卷积层 = 滑动窗口内的加权求和
- Transformer Attention:
——不管中间的 softmax 多复杂,最后一步还是加权求和 - 残差连接:
——最简单的加 - 梯度下降:
——参数更新就是加法(加上负梯度)
从最简单的感知机到最大的 LLM,前向传播、反向传播、参数更新——每一层拆到底都是加法。
分析层:拆微积分
- 积分 = 无穷小量的无限累加
- 傅里叶级数 = 正弦波的加权叠加
- 泰勒展开 = 多项式的逐项累加
- 全概率公式 = 条件概率的加权求和
东方数术层:拆推演
- 奇门遁甲:排盘就是干支的叠加运算。值符随旬首飞转、值使随地支流转——每一步都是对一个静态符号加上一个偏移量。奇门排盘的本质,是对符号系统叠加时间偏移量的加法展开。
- 八字:大运是月柱的步进叠加(阳男阴女顺推,阴男阳女逆推,每步加 10 天干或 12 地支)。流年是年柱的逐年加 1。命理推步的本质,是干支的周期加法。
- 《周易》:太极生两仪,两仪生四象,四象生八卦…… 每一层叠加都是"二进制的加法展开":两仪(0/1)→ 四象(2 bit)→ 八卦(3 bit)→ 六十四卦(6 bit)。卦序的排列,就是布尔加法在圆圈上的遍历。
- 五行生克:生 = 增益(加),克 = 减损(减)。五行本身是静态的标签(木火土金水),但生克关系一旦建立,就变成了一个运算系统——五行不是一个分类系统,它是一个加法群。
- 六十甲子:天干 × 地支 = LCM(10, 12) = 60。六十甲子本身就是乘加运算的产物——把两个度量周期"乘"在一起,获得一个更大的周期,然后在那个大周期里逐次加 1 遍历。
论证一结论:拆到底,一切算法、一切算术、一切推演的底层原子操作,只有一个——加法。减法、乘法、除法、指数、矩阵、神经网络、积分、卦象展开,都是加法在不同尺度上的包装。
论证二:数与算——两个截然不同的概念
拆完之后,需要把两个经常被混为一谈的概念——"数"和"算"——分清楚。
什么是"数"?
数,是静态的、记录的、存在的。在古代,数字不是一个抽象符号,它就是写在竹简或纸上的文字——甲、乙、子、丑、乾、坤、一、二、三。
- 古代:干支文字、卦象文字、节气名、星宿名——这些都是"数"
- 现代:数字、数据(data)、Tensor、参数、权重、内存中的 0 和 1
"数"的共同特征:放在那里,它不会自己变。 "甲"就是"甲",一万年不动还是"甲"。"子"不会自己变成"丑"。
什么是"算"?
算,是动态的、计算的、变化的。
- 古代:加法、推步、生克、纳甲——这些都是"算"
- 现代:计算(computation)、前向传播、梯度更新、Attention、卷积
"算"的共同特征:它能改变"数"。一个数字加上另一个数字,就变了。"甲子"加上 1,"乙丑"就出来了。
归类:把数和算分开
很多人把静态的"数"和动态的"算"混在一起说,但两者完全不同:
| 数(静态) | 算(动态) | |
|---|---|---|
| 是什么 | 记录的、存在的 | 执行的、变化的 |
| 状态 | 被操作的对象 | 操作本身 |
| 古代 | 干支、卦象、五行 | 加法、推步、生克、纳甲 |
| 现代 | 数据、Tensor、参数 | 计算、前向传播、梯度更新 |
| 哲学 | 阴(静) | 阳(动) |
| 特性 | 可以不动 | 必须动才有意义 |
数没有"算",就是死的。算没有"数",就是空的。 两者缺一不可——只有放在一起,数才有意义,算法才能发生。
一段"甲子乙丑丙寅"的文字放在那里,不去推算、不去步进——它就是一串死字符,什么也读不出来。一个"加 1"的算法没有操作对象——它就是一个空转的指令,什么也产生不了。
数和算必须同时存在。数不管多精准,不算就是死的。算不管多复杂,不作用在数上就是空的。离开任何一个,两者都没有意义。
这种"两者相互依存、缺一不可"的关系,和阴阳有些相似——阴阳也是独则无意义,合则生万物。但我不确定是否等于阴阳,只是注意到有相似之处。这里不做过度类比,点到为止。
论证二结论:把"数"(静态数据)和"算"(动态运算)归为两个独立的概念。数是静态的库存,算是动态的加工。两者缺一不可,但必须分清楚。
论证三:时间与空间——算与数的物理对应
前两个论证分别说了"加法是最底层的原子运算"和"数(静态)与算(动态)的区别"。但还有一个更根本的问题:外在世界谁对应"数",谁对应"算"?
空间对应"数"——可以不动,没有定论
空间可以不动——一座山千年不动,一个坐标万年不变。空间和数据一样:
- 可以静态:经纬度固定在那里,不随时间变化
- 可以无限大:向外没有边界
- 可以无限小:向内可以细分到无穷
- 没有定论:空间是什么样的,取决于你怎么定义它——跟数据一样,同一个事物可以有不同的数值表示
空间和数据是同一类概念:它们都是容器,本身不产生变化。
时间对应"算"——只有加法,不可逆转
时间不一样。
- 时间只有加法。每一秒都在加 1,你不需要给时间施力,它自己就在持续叠加。没有人见过时间静止,更没有人见过时间倒流。
- 时间不可逆转。你可以把空间坐标减回去(往后退一步),但你无法把时间减回去(回不到上一秒)。
时间是宇宙级的加法器。在这个意义上:
时间就是最原初的加法。一切系统的加法,都是时间在底层的回响。
时间驱动力在算法中的体现
- 深度学习:每一个训练步(step)就是时间的一个滴答。梯度更新是时间推动的加法:
。没有时间维度,就没有"学习"这个概念——学习本身就意味着参数随时间变化。 - Transformer 位置编码:用三角函数给每个 token 加上它在序列中的位置——本质是把时间信息加到静态的词向量上。没有这个加法,模型分不清"我打你"和"你打我"。
- LLM 自回归生成:每生成一个 token,就把这个 token 拼回序列,再进行下一步——每一步都在做"序列 + 新 token"的加法。生成就是时间在语言上的展开。
- 奇门遁甲:时辰在变,值符值使在飞。每换一个时辰,就是时间加了一个单位,整个盘面随之流转。时间不动,奇门就是一盘死棋。
- 八字推运:大运是月柱加倍数,流年是年柱逐年加 1。命理推演的本质,是把先天静态的八字放到时间轴上,看它每一步加出来什么结果。
- 本站的罗盘:每一个罗盘都有一个
controlledTime。时间不动时,数据都在——六十甲子、二十八宿、节气——但都是静态的快照。只有时间持续加 1,罗盘才会活过来——星辰西移、斗柄转向、干支流转。你在罗盘上看到的一切"动态",底层都是时间在加法。 useLiveClock:每秒让controlledTime加 1 秒——这是时间加法最直接的代码化:setInterval(() => now.value = new Date(), 1000)。一秒就是一次加法。
完整映射
| 物理世界 | 概念对应 | 特性 |
|---|---|---|
| 空间 | 数(数据) | 静态、可无限大、可无限小、无定论 |
| 时间 | 算(加法) | 只有向前、不可逆转、持续运行 |
论证三结论:时间是加法的物理化身,加法是时间的数学表达。空间是"数"的容器,时间是"算"的驱动力。
结语
三个论证,层层递进:
- 拆:一切算法、一切算术,拆到底都是加法。加法是运算的原子单位。
- 归类:把"数"(静态数据)和"算"(动态计算)明确分开。两者性质完全不同,不能混为一谈。
- 映射:空间对应"数"——可以不动、可以无限。时间对应"算"——只有加法、只有向前。
数静,算动。时间驱动,空间承载。
时间只有不断地加,我没有发现时间可以倒退。空间和数据一样,可以静态,也可以无限大,也可以无限小,没有定论。
加法既不是道也不是器——它是道器之间的那一步。