在 JavaScript 中使用超限序数

Working with transfinite ordinals in JavaScript

我正在尝试在 JavaScript 中编写一个超限序数计算器。也就是说,想办法在js中处理ordinal arithmetic

我计划使用 ES6 的 classes,使用某种形式的构造函数,以及处理项比较和操作(例如对序数集的加法或乘法)的方法。问题是我不知道从哪里开始。我首先需要一种在 Ordinal class 的实例中存储序数的方法,以及一种与 Ordinals 进行比较的方法。在那之后一切都应该一帆风顺。

如果有人能提供任何关于我如何处理这个问题的见解,我将不胜感激。

在过去的 6 个月里,我发现了几种存储序数的方法,包括:

  • 作为数组的 Cantor 范式
  • 作为成对嵌套数组的扩展 Cantor 范式
  • 由 Googology 社区的成员开发的序数表示法(称为 TAN)
  • 凡勃伦的不动点层次
  • 序数折叠函数

免责声明:我在写序数时使用通用约定。我用 w 来表示 omega,最小的超限序数; e 表示 epsilon 数(a -> w^a 的不动点)或枚举它们的函数;类似地,在 Veblen 层次结构的情况下,我将使用 phi 来表示这样的序数折叠函数,我将使用 psi。在解释操作如何工作时,我将使用 this 表示第一个操作数,other 表示第二个。

Cantor Normal Form 将序数表示为 w^b * a 形式的项之和,因此具有 w^w 的极限,直观上它可以表示为数组,其中第 i 个元素term 表示 term w^i * a 中的 a,例如数组 [4, 5, 6] 表示序数 w^2*6 + w*5 + 4。添加非常简单。根据1+w=w,w+w^2=w^2等的原理,我们可以用0填充数组直到第other.length - 1个元素,然后将[=中的元素相加11=] 到它们在 this 中的相应元素。乘法更棘手。如果 other 包含多个非零元素,我们可以使用分配律(不适用其他方式)和 return this 的总和乘以每个 other的条款。否则,如果 this 有多个非零元素,如果 other 是有限的 (other.length == 1),则将 this 的最高有效项乘以 other 和 return other。在最后一种情况下,忽略除 this 最重要的项外的所有项并乘以 other。如果两个操作数只有一个项,则将一串 0 移入 this(特别是 other.length - 1)和 return this。求幂是微不足道的,因为 other 必须是有限的,否则结果会超出此方法的范围,并且可以通过迭代乘法来完成,因为我很懒,以后可以做得更好。

Extended Cantor Normal Form 类似,虽然每个项的指数也可以是序数,这使事情复杂化,但将其限制扩展到 e0(a -> w^a 的最小固定点。我们可以将序数存储为对数组。对的第一个元素可以是项的系数,第二个元素是指数,由另一个对数组表示。在这种形式中需要解决的第一件事是归一化。首先,您需要删除所有为 0 的项,然后遍历数组并跟踪最大指数,如果遇到指数低于当前最高指数的元素,您会将其从数组中拼接出来。一旦这是完成的你检查具有相同指数的项并将另一个的系数添加到一个,删除另一个。然后数组将被归一化(可能有更有效的方法来做到这一点,发表评论)。然后添加变得微不足道。简单地连接数组otherthis 并归一化。乘法与之前类似。如果 other.length > 1 那么我们可以使用分配律(不适用于其他方式)和 return this 的总和乘以 other 的每一项。否则,如果 this 有多个项,如果 other 是有限的,则将 this 的最重要项乘以 other 和 return other。在最后一种情况下,忽略除 this 最重要的项外的所有项并乘以 other。然后简单地将 other 的唯一项的指数添加到 this 的唯一项和 return this。求幂不再是微不足道的,但并不困难。首先,从 this 中删除除了最重要的项之外的所有项,然后将指数乘以 other。完成。

Googology* 社区的成员 TGR 创建了 TAN 作为用于生成大量数字的极其强大的数组表示法,尽管它本质上是具有类似数组的序数表示法的快速增长的层次结构。序号表示法没有明确定义,但可以很好地理解它。 TAN。请注意,为了简单起见,我只会对没有 'separators' 的数组进行编码。序数可以存储为数组,其中元素是数组或整数。规范化可以通过从数组末尾弹出 0 并检查是否有任何元素的值大于外部数组(没有该元素)来完成,如果是,则删除外部数组。这是因为数组的每个元素都枚举为 a + b、a * w^b、e、phi_2、phi_3 等形式的函数,而这样的数组就像 [0 , 0, [0, 0, 0, 1]] 将是 e(psi_2(0)) 等于 phi_2(0) 因为 phi_2(0) 是枚举 epsilon 数的函数的不动点。添加这个符号很简单,取 this 的第一个元素,然后是那个的第一个元素,依此类推,直到我们得到一个整数,然后如果 other 是有限的,只需将它添加到,如果 other 是超限的,则替换 this 中的整数。乘法是类似的,尽管你增加了第二项。必要时再次应用分配律,并确保认识到将第二个元素增加 a 与乘以 w^a 相同。如上所述,求幂等于乘以指数,然后去掉相加的部分。这是我最喜欢的存储序数的方法,因为它非常独特和有趣,而且有一个容易达到的上限。

其他两种表示法很可能是可行的,我已经有了如何实现的想法。 Veblen Hierarchy 可以像 TAN 一样存储,尽管它存储了一个术语数组,如 CNF 和 ECNF,并且每个术语都是一个 Veblen 样式的数组,尽管每个元素也必须是一个术语数组以允许存储所有序数。序数折叠函数会更困难,我建议将符号字符串存储为抽象语法树,主要问题是归一化,因为它很容易失控,

*大型有限数的研究和命名法,尽管随着快速增长和其他序数层次结构在其中发挥重要作用,开发了各种各样的序数符号,尽管大多数都很难编程。