在 JavaScript 中使用超限序数

Log*_*n M 5 javascript math numbers calculator

我正在尝试用 JavaScript 编写一个超限序数计算器。也就是说,找到一种在js中处理序数运算的方法。

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

如果有人能够对我如何解决这个问题提供任何见解,我将不胜感激。

Log*_*n M 5

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

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

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

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

扩展康托范式是类似的,尽管每一项的指数也可以是序数,这使事情变得复杂,尽管将其限制扩展到 e0 (a -> w^a 的最小不动点。我们可以将序数存储为数组对的第一个元素可以是项的系数,第二个元素是指数,由另一个对的数组表示。以这种形式需要解决的第一件事是标准化。首先你需要删除所有为 0 的项,然后迭代数组并跟踪最大指数,如果遇到指数低于当前最高指数的元素,则将其从数组中拼接出来。完成此操作后,您检查对于具有相同指数的项,并将另一个的系数添加到一个,删除另一个。然后数组将被标准化(可能有更有效的方法来做到这一点,留下评论)。加法随后变得微不足道。简单地串联other和的数组this进行标准化。乘法与之前类似。如果other.length > 1那么我们可以使用分配律(不适用于其他方式)并返回乘以this每个项的总和other。否则,如果this有多项,如果other是有限的,则将最高有效项乘以thisother返回other。在最后一种情况下,忽略除最重要的项之外的所有项this并乘以otherother然后只需将唯一项的指数与this唯一项相加并返回this。求幂不再是微不足道的事情,但也不困难。首先,从 中删除除了最重要的项之外的所有项this,然后将指数乘以other。完毕。

Googology* 社区的成员 TGR 创建了 TAN 作为一种用于生成大量数字的极其强大的数组表示法,尽管它本质上是具有类似数组序数表示法的快速增长的层次结构。序数符号虽然可以很好地理解,但定义并不明确。。请注意,为了简单起见,我只会对没有“分隔符”的数组进行编码。序数可以存储为数组,其中元素可以是数组或整数。可以通过从数组末尾弹出 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 层次结构可以与 TAN 类似地存储,但存储 CNF 和 ECNF 等术语数组,并且每个术语都是 Veblen 样式中的一个数组,尽管每个元素也必须是术语数组以允许存储所有序数。序数折叠函数会更困难,我建议将符号字符串存储为抽象语法树,主要问题是规范化,因为这很容易失控,

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