驱动Binius的域

本文深入探讨了Binius协议背后的核心数学原理,该协议利用布尔超立方体,并着重介绍了二元塔和域元素的表示,以及利用其与电路级运算的自然关系进行域元素的加法和乘法运算方法。文章还通过详细的例子,展示了如何在实践中利用二元塔进行高效的运算。

介绍

通用 zkVM 的发展使得编写可验证的应用程序变得更加容易,它允许开发人员编写高级代码,然后将其编译为 RISC-V 或其他指令集架构(ISA),并在虚拟机之上运行。然后,虚拟机使用证明系统(如 STARKs 或 Groth16)生成简洁的执行证明。证明系统的最新进展已经能够减少证明时间,并且我们正朝着以太坊区块的实时证明方向发展。Binius 是一种证明系统,其开发重点在于如何创建一种对硬件友好的技术。了解硬件的工作原理,一种在其上进行真正快速数学运算的定制证明系统可以产生显着改进。Petra 是第一个利用 Binius 的虚拟机。是什么让 Binius 与众不同,它是如何工作的?

在本文中,我们将回顾 Binius 协议背后的基本数学原理,该协议利用了布尔超立方体 Bℓ={0,1}ℓBℓ={0,1}ℓ。我们将专注于二元塔的初等描述和域元素的表示,以及利用其与电路级运算的自然关系的域元素的加法和乘法。在整篇文章中,我们将介绍一些二元塔出现并作为一种技术上有趣的对象而存在的底层材料,即:

有关更多背景材料,请参阅我们之前关于 Binius 第 1 部分的帖子Binius 第 2 部分

域扩展和域元素的表示

在下面的讨论中,我们将把 F2=0,1F2=0,1 固定为具有两个元素的域。该域的 dd 次有限域扩展可以表征为商环

Fq≡F[X]/⟨f(X)⟩Fq≡F[X]/⟨f(X)⟩

其中 ff 是任何不可约多项式 f∈F2[X]f∈F2[X],其次数为 dd:该域恰好有 q=2dq=2d 个元素,并且由多项式除以 ff 的所有余数组成。换句话说,它由次数至多为 d−1d−1 且系数在 F2F2 中的多项式组成。此外,此扩展可以看作是基域 F2F2 上维度为 dd 的向量空间,这是一个非常好的特性。集合

Bq={1,X,X2,…,Xd−1}Bq={1,X,X2,…,Xd−1}

通常称为“单项式基”,并且在固定此基后,建立了一个同构,用于识别此类多项式及其 F2F2 坐标。当域元素被视为多项式时,其加法和乘法运算是模 ff 执行的。

例子

考虑多项式 f(X)=X2+X+1f(X)=X2+X+1 作为 F2[X]F2[X] 中的一个元素。ff 是不可约的;如果它有一个非平凡因子 gg,那么 deg(g)=1deg⁡(g)=1 并且由于 g∈F2[X]g∈F2[X],那将迫使 gg 的根成为 ff 的根。由于 ff 在基域中没有根,那么我们得出结论 ff 是不可约的并且

F[X]/⟨X2+X+1⟩F[X]/⟨X2+X+1⟩

确实是 F2F2 的 2 次扩展;这意味着它可以被认为是基域上维度为 2 的向量空间。那么,这个向量空间的规范基是

B2={1,X}B2={1,X}

并且它的所有元素都可以列为 B2B2 的元素的线性组合:

F4={0,1,X,1+X}F4={0,1,X,1+X}

F4F4 在 F2F2 上的坐标表示可以在下表中查看

多项式表示 坐标表示
00 (0,0)(0,0)
11 (1,0)(1,0)
XX (0,1)(0,1)
1+X1+X (1,1)(1,1)

扩展中的域运算是 F2[X]F2[X] 中的环运算,通过考虑非平凡关系 X2+X+1=0⟺X2=1+XX2+X+1=0⟺X2=1+X 将其应用到商域。这有时以一种直接的方式解释:现在 XX 成为 ff 在域扩展 F4F4 中的根


我们观察到,在上一个示例中 ff 的不可约性很简单,因为 ff 的次数足够低:如果 deg(f)≤3deg⁡(f)≤3 那么 ff 在 F[X]⟺fF[X]⟺f 上是不可约的,则 ff 在 FF 中没有根(这是域理论中的一个定理)。

定义(二次扩展): 由次数为 2 的不可约多项式进行商运算定义的域扩展称为 二次 扩展。

定义(域塔): 只要有域 K、E、FK、E、F 使得

K,⊂,E 且 E,⊂,FK,⊂,E 且 E,⊂,F

我们就说 EE 是 KK 的扩展 (通常记为 E,|KE,|K),并且 FF 是 EE 的扩展。将这些扩展放在一起会产生一个 扩展塔,我们将其表示为 F|E|KF|E|K。

事实证明,乍一看,连接域扩展可能看起来很陌生且过于复杂,但最终会产生巨大的成果。

扩展示例:F16F16 的两种构造

让我们研究 16 个元素的域的两个不同的实现,看看域是如何构造的。

第一个构造: 通过次数为 4 的多项式进行商运算得到 F16F16:

为了构造域 F16F16,我们需要找到一个 F2={0,1}F2={0,1} 上次数为 4 的不可约多项式。其中一个不可约多项式是:

p(X)=X4+X+1p(X)=X4+X+1

为了验证这个多项式在 F2F2 上是不可约的,我们需要检查它在 F2F2 中没有根 并且 它不能被分解为 F2F2 上两个次数为 2 的不可约多项式的乘积。

  1. 在 F2F2 中没有根:

- p(0)=04+0+1=1≠0p(0)=04+0+1=1≠0

- p(1)=14+1+1=1+1+1=1(mod2)≠0p(1)=14+1+1=1+1+1=1(mod2)≠0

由于 p(X)p(X) 在 F2F2 中没有根,因此它没有线性因子 (X−a)(X−a),其中 a∈F2a∈F2

  1. 无法分解为两个次数为 2 的不可约多项式:

F2F2 上唯一的次数为 2 的不可约多项式是 X2+X+1X2+X+1。如果 X4+X+1X4+X+1 可以约简为两个次数为 2 的多项式,则它必须是 (X2+X+1)(X2+aX+b)(X2+X+1)(X2+aX+b),其中 a,b∈F2a,b∈F2。

展开这个乘积:

(X2+X+1)(X2+aX+b)=X4+(a+1)X3+(b+a+1)X2+(b+a)X+b(X2+X+1)(X2+aX+b)=X4+(a+1)X3+(b+a+1)X2+(b+a)X+b

将系数与 X4+0X3+0X2+1X+1X4+0X3+0X2+1X+1 进行比较:

- X3X3 的系数: a+1=0⟹a=1a+1=0⟹a=1

- X2X2 的系数: b+a+1=0⟹b+1+1=b=0b+a+1=0⟹b+1+1=b=0

- XX 的系数: b+a=1⟹0+1=1b+a=1⟹0+1=1 (这是一致的)

- 常数项: b=1b=1

我们有一个矛盾,因为我们发现 b=0b=0 且 b=1b=1。因此,X4+X+1X4+X+1 不能被分解为 F2F2 上两个次数为 2 的不可约多项式。

由于 p(X)=X4+X+1p(X)=X4+X+1 是 F2F2 上次数为 4 的不可约多项式,因此商环

F2[X]/⟨X4+X+1⟩F2[X]/⟨X4+X+1⟩

是一个具有 24=1624=16 个元素的域。

该域的元素可以表示为 XX 中次数最多为 3 且系数在 F2F2 中的多项式;此外,这些元素的加法是通过将多项式的系数按模 2 相加来完成的,而乘法是通过将多项式相乘 然后 将结果模 X4+X+1X4+X+1 来约简的。这种约简是通过重复使用关系 X4≡−X−1≡X+1(modX4+X+1)X4≡−X−1≡X+1(modX4+X+1) 来实现的。

例如,要将 α=1+X+X3α=1+X+X3 和 β=X2+X3β=X2+X3 相乘,

α⋅β=(1+X+X3)⋅(X2+X3)=X2+X3+X3+X4+X5+X6α⋅β=(1+X+X3)⋅(X2+X3)=X2+X3+X3+X4+X5+X6

通过使用模 2 加法,我们可以消除 XX 的三次方,并且通过定义关系式,我们可以替换 XX 的所有高于 4 的幂:

α⋅β=X2+(1+X)+X(1+X)+X2(1+X)=X2+1+X+X+X2+X2+X3α⋅β=X2+(1+X)+X(1+X)+X2(1+X)=X2+1+X+X+X2+X2+X3

再次通过模 2 加法,我们得到 α⋅β=1+X2+X3α⋅β=1+X2+X3。

我们将看到,即使很容易理解这种乘法模式的机制,它的效率也很低。我们希望有一种不同的方式来表示域扩展中的元素,以便可以快速有效地完成乘法。

第二个构造:F16F16 作为二次扩展序列

在这种方法中,我们将通过实现一个以 F16F16 为顶部的域塔来构造 16 个元素的域;我们将利用二次扩展以及当多项式的次数较低(最多为 3)时,可以通过寻找根来推断它们的不可约性的事实。

步骤 1:F4F4 作为 F2F2 的扩展:

和以前一样,我们使用 F2F2 上的不可约多项式 p(t)=t2+t+1p(t)=t2+t+1。由于扩展 F2F2 是连接 ff 的根 X0X0,我们将简单地说

F4=F2(X0)F4=F2(X0)

并且该域的四个元素很简单 0,1,X0,1+X00,1,X0,1+X0,其中 X20=X0+1X02=X0+1。

步骤 2:F16F16 作为 F4F4 的扩展:

由于 F4F4 有 4 个元素,我们需要一个 F4F4 上次数为 22 的不可约多项式来构造 F16F16,并授予 [F16:F4]=2[F16:F4]=2(参见扩展的次数);考虑 F4F4 上的多项式 q(t)=t2+t+X0q(t)=t2+t+X0。要检查不可约性,我们需要看看它在 F4=0,1,X0,1+X0F4=0,1,X0,1+X0 中是否有根。所以,让我们开始逐一检查:

  • q(0)=02+0+X0=X0≠0q(0)=02+0+X0=X0≠0
  • q(1)=12+1+X0=1+1+X0=0+X0=X0≠0q(1)=12+1+X0=1+1+X0=0+X0=X0≠0
  • q(X0)=X20+X0+X0=(X0+1)+X0+X0=X0+1+0=X0+1≠0q(X0)=X02+X0+X0=(X0+1)+X0+X0=X0+1+0=X0+1≠0
  • q(1+X0)=(1+X0)2+(1+X0)+X0=(1+X20)+1+X0+X0=1+(X0+1)+1+0=X0+1+1=X0≠0q(1+X0)=(1+X0)2+(1+X0)+X0=(1+X02)+1+X0+X0=1+(X0+1)+1+0=X0+1+1=X0≠0

由于 q(t)q(t) 的次数为 2 并且在 F4F4 中没有根,因此它在 F4F4 上是不可约的,并且通过连接 qq 的根 X1X1 获得的扩展产生

F16=F4(Y)=F2(X0)(X1)=F2(X0,X1)F16=F4(Y)=F2(X0)(X1)=F2(X0,X1)

受以下关系的约束:

  • X20=X0+1X02=X0+1 (这来自第一个扩展)
  • X21=X1+X0X12=X1+X0 (这来自第二个扩展)

每个步骤实际上都是通过对次数为 2 的不可约多项式进行商运算来定义的,即每个步骤都是 二次扩展。更重要的是,F16F16 中的每个元素都是基元素以 F2F2 为系数的线性组合

{1,X0,X1,X0⋅X1}{1,X0,X1,X0⋅X1}

关于坐标的一句话:

让我们计算一下 F16F16 在 F4F4 和基域 F2F2 上的坐标表示。F16F16 的元素可以写成 a+bX1a+bX1 的形式,其中 a,b∈F4a,b∈F4。由于 aa 和 bb 各有 4 种选择,因此 F16F16 中有 4×4=164×4=16 个元素;另请记住,F4F4 在 F2F2 上的基是 {1,X0}{1,X0},并且 F16F16 在 F4F4 上是 {1,X1}{1,X1}。

域理论中有一个著名的定理,塔中上层域的基由下层扩展中基元素的乘积组成。但这里有一个注意事项:我们将考虑有序基。这意味着为了展示一个基,我们不仅必须展示一个跨越向量空间的线性无关子集,而且我们还需要明确这些元素在基中的 顺序。需要此顺序才能使用坐标。考虑到上面的有序基,让我们看一下 F16F16 中的元素:

F16F16 中的元素 在 F4F4 上的坐标 在 F2F2 上的坐标
00 (0,0)(0,0) (0,0,0,0)(0,0,0,0)
11 (1,0)(1,0) (1,0,0,0)(1,0,0,0)
X0X0 (X0,0)(X0,0) (0,1,0,0)(0,1,0,0)
1+X01+X0 (1+X0,0)(1+X0,0) (1,1,0,0)(1,1,0,0)
X1X1 (0,1)(0,1) (0,0,1,0)(0,0,1,0)
1+X11+X1 (1,1)(1,1) (1,0,1,0)(1,0,1,0)
X0+X1X0+X1 (X0,1)(X0,1) (0,1,1,0)(0,1,1,0)
(1+X0)+X1(1+X0)+X1 (1+X0,1)(1+X0,1) (1,1,1,0)(1,1,1,0)
X0X1X0X1 (0,X0)(0,X0) (0,0,0,1)(0,0,0,1)
1+X0X11+X0X1 (1,X0)(1,X0) (1,0,0,1)(1,0,0,1)
X0+X0X1X0+X0X1 (X0,X0)(X0,X0) (0,1,0,1)(0,1,0,1)
(1+X0)+X0X1(1+X0)+X0X1 (1+X0,X0)(1+X0,X0) (1,1,0,1)(1,1,0,1)
(1+X0)X1(1+X0)X1 (0,1+X0)(0,1+X0) (0,0,1,1)(0,0,1,1)
1+(1+X0)X11+(1+X0)X1 (1,1+X0)(1,1+X0) (1,0,1,1)(1,0,1,1)
X0+(1+X0)X1X0+(1+X0)X1 (X0,1+X0)(X0,1+X0) (0,1,1,1)(0,1,1,1)
(1+X0)+(1+X0)X1(1+X0)+(1+X0)X1 (1+X0,1+X0)(1+X0,1+X0) (1,1,1,1)(1,1,1,1)

单项式基的选择也显示了连续基中的坐标如何相互关联:例如,假设我们取一个元素 ω=a+bX1∈F16 ,其中 a,b∈F4ω=a+bX1∈F16 ,其中 a,b∈F4,我们用坐标 (a,b)(a,b) 表示 ωω。如果我们现在用 F2F2 上的基 {1,X0}{1,X0} 表示 aa 和 bb,那么我们可以通过简单地连接 aa 和 bb 的坐标来找到 ωω 在 F2F2 上的坐标!

为了说明这张表所说的内容,取元素 ω=X0+X1ω=X0+X1。在 F4F4 上,它是 X0⋅1+1⋅X1X0⋅1+1⋅X1,因此坐标是 [ω]F4=(X0,1)[ω]F4=(X0,1)。

现在,[X0]F2=(0,1)[X0]F2=(0,1) 并且 [1]F2=(1,0)[1]F2=(1,0),所以

[X0+X1]F2=(0,1,1,0)[X0+X1]F2=(0,1,1,0)

我们重复先前提到过的内容:每当选择基时,也会选择基元素的顺序;从数学上讲,由相同元素组成但顺序不同的基是不同的基。在本说明中,顺序是以传统方式选择的,从左到右读取基,在我们读取匹配连续扩展时聚合元素。这不是唯一的方法;事实上,反向排序在计算机科学家中很受欢迎。

Wiedemann 塔以及 Diamond 和 Posen 的工作

我们刚刚在 F16F16 的示例中看到的是 Wiedemann 塔 的一个实例:一系列域扩展,其中每个扩展都是前一个的二次扩展,以这样一种方式表示,即可以通过在某个时刻连接一系列不可约多项式的根来获得扩展的基。在刚才看到的例子中,基很简单

B={1,X0,X1,X0X1}B={1,X0,X1,X0X1}

并且域元素只是这些符号的 F2F2 线性组合:我们通常将它们视为 F2F2 上 2 个变量的多项式,其中所有变量的最高次数都为 1。这些多项式通常在密码学上下文中称为“多线性”。这些类型的域扩展和多项式是 Ben Diamond 和 Jim Posen 在他们的提议中实现零知识协议设置的核心,他们提出在特征为 2 的情况下,依赖电路级算术运算以获得更高效的性能:BINIUS。他们的工作中定义的二元塔就像一个迭代二次扩展序列一样定义,灵感来自 Wiedemann 的工作。为了匹配他们的符号集,设置 T0=F2T0=F2,然后递归定义

Tk+1=Tk[Xk+1]/⟨fk+1⟩Tk+1=Tk[Xk+1]/⟨fk+1⟩

其中 fk+1(Xk+1)=X2k+1+XkXk+1+1fk+1(Xk+1)=Xk+12+XkXk+1+1;Wiedemann 证明了这个多项式在 TkTk 上确实是不可约的,因此它将 Tk+1Tk+1 定义为 TkTk 的二次扩展。简要写下几个扩展

F2=T0,F4=T1,F16=T2,…F2=T0,F4=T1,F16=T2,…

我们通常将 TkTk 称为 T0T0 的第 k−k−级或扩展;这样的域恰好有 22k22k 个元素。在该级别中,元素被描述为 kk 个变量 {X0,X1,…,Xk−1}{X0,X1,…,Xk−1} 中的多项式,这样每个 XX 的最高次数都为 1,也就是说,它们是多线性单项式在 F2F2 上的线性组合。为简单起见,还有一种极其方便的方法可以指向特定的单项式,它与非负整数的二元展开有关。

为了清楚起见,假设我们需要找到第 n−n−个基元素,我们将其称为 ynyn。为此,我们只需以 2 为底展开 nn:

n=∑i=0ni2i, 其中 ni∈0,1n=∑i=0ni2i, 其中 ni∈0,1

然后设置

yn=∏i:ni=1Xiyn=∏i:ni=1Xi

例如,要获得 Wiedemann 塔中的第十个基本元素,首先以 2 为底展开:

10=0⋅20+1⋅21+0⋅22+1⋅23, 或者更简洁地说 [10]2=[1010]10=0⋅20+1⋅21+0⋅22+1⋅23, 或者更简洁地说 [10]2=[1010]

(你需要记住,计算机科学的惯例是从最高有效数字开始展开,并且元素的计数通常从零开始),然后构建

y10=X1X3y10=X1X3

这种特定的基排序,我们自然地承认,实际上是 字典序,这将允许各种事情:

  • 首先,它将允许我们确定一个元素是否属于 TkTk 的特定子域;每当与 k−k−级元素关联的坐标向量的最后一半坐标等于零时,我们就会知道它属于 Tk−1Tk−1
  • 先前的事实表明,塔构造通过在坐标向量的后半部分中进行零填充,从而很好地将 Tk−1Tk−1 嵌入到 TkTk 中。从计算上讲,将子域中的元素视为该域扩展的元素具有“零成本”。

这些特性使 Wiedemann 塔非常适合于代码和芯片级实现:对于任意扩展,我们都无法从数学上保证我们可以识别元素属于哪个子域。但是,在这种情况下,并且由于这些域的高度结构化的性质,有时可以快速解决该问题。或者更好地说:我们可以轻松地描述扩展的子域。

域运算和乘法问题

这些类型塔的一个有趣的方面是坐标在通常的域运算下的行为方式。

加法

F2F2 中的加法(这是在坐标上执行的运算)与 XOR 运算之间的关系是直接且根本的。有限扩展 TkTk 中两个元素的加法是通过将它们的相应坐标模 2 相加来执行的。由于模 2 加法等效于 XOR 运算,因此加法是大多数处理器架构中非常快速有效的按位运算。

乘法

现在这里的事情变得棘手了。域元素的乘法可以根据这些元素的表示方式以不同的方式进行。让我们从

以朴素方式乘法:带约简的多项式

乘法中一种更直接的方法是首先将元素表示为多项式,然后将这些多项式相乘,最后将乘积以定义 F2F2 扩展的不可约式为模进行约简。

为了说明这一点,考虑 u,v∈T2u,v∈T2。让我们慢慢来。

以 X1X1 中的多项式与 T1T1 中的系数相乘:

u⋅v=((1+X0)+X1)(X0+X0X1)=(1+X0)X0+(1+X0)X0X1+X1X0+X1(X0X1)=(X0+X20)+(X0+X20)X1+X0X1+X0X21u⋅v=((1+X0)+X1)(X0+X0X1)=(1+X0)X0+(1+X0)X0X1+X1X0+X1(X0X1)=(X0+X02)+(X0+X02)X1+X0X1+X0X12

现在,我们替换 X20=X0+1X02=X0+1 和 X21=X1X0+1X12=X1X0+1:

=(X0+X0+1)+(X0+X0+1)X1+X0X1+X0(X1X0+1)=(2X0+1)+(2X0+1)X1+X0X1+X1X20+X0)=(X0+X0+1)+(X0+X0+1)X1+X0X1+X0(X1X0+1)=(2X0+1)+(2X0+1)X1+X0X1+X1X02+X0)

由于我们处于特征为 2 的域中,因此 2X0=02X0=0。所以,

=1+X1+X0X1+X1(X0+1)+X0=1+X1+X0X1+X0X1+X1+X0=1+X0=1+X1+X0X1+X1(X0+1)+X0=1+X1+X0X1+X0X1+X1+X0=1+X0

因此,((1+X0)+X1)(X0+X0X1)=1+X0((1+X0)+X1)(X0+X0X1)=1+X0 在 T2T2 中。

正如读者可能已经猜到的那样 - 这需要大量的工作。我们希望有一种更有效的域元素乘法算法,该算法可以从高度结构化的扩展塔中提取。

一种系统地进行域元素乘法的方法是使用类似 Karatsuba 的技术。

Wiedemann 塔中的类 Karatsuba 乘法

当应用于有限域扩展(如 Wiedemann 塔的级别)中的元素相乘时,Karatsuba 算法的主要目的是通过增加 域加法子域乘法 的数量来 减少较大域中的域乘法次数,因为它利用了通过 XOR 完成的加法在计算上很便宜的事实。

具体来说,对于在子域上乘两个 1 次多项式,一种朴素的方法将需要在子域中进行四次乘法。Karatsuba 的方法仅用 三次乘法 和子域中的少量加法来实现。当递归地应用于塔扩展的多个级别时,这种表面上很小的减少变得非常重要,从而导致亚二次渐近复杂性。

让我们首先描述 Karatsuba 公式,用于将 TkTk(它是 Xk−1Xk−1 中次数最多为 1 且系数在 Tk−1Tk−1 中的多项式)中的两个元素相乘,首先说明乘法的外观,然后提高我们的眼力:

假设我们需要将 u=α0+α1Xk−1 和 v=β0+β1Xk−1u=α0+α1Xk−1 和 v=β0+β1Xk−1 相乘,其中 αi,βi∈Tk−1αi,βi∈Tk−1,对于 i=0,1i=0,1。那么乘法服从分配律,因此我们正在寻找的乘积是

u⋅v=α1β1X2k−1+(α0β1+α1β0)Xk−1+α0β0u⋅v=α1β1Xk−12+(α0β1+α1β0)Xk−1+α0β0

  • 步骤 1:计算子域 Tk−1Tk−1 中的三个中间乘积。

这是 Karatsuba 技巧减少乘法的地方。我们没有计算涉及 αiβjαiβj 的四个乘积,而是求助于计算三个乘法:

  • PA=α0β0PA=α0β0
  • PB=α1β1PB=α1β1
  • PC=(α0+α1)(β0+β1)PC=(α0+α1)(β0+β1)

请注意,在特征为 2 的情况下,这三个乘积足以产生 u⋅vu⋅v 中的系数,因为

PA+PB+PC=α0β1+α1β0=MPA+PB+PC=α0β1+α1β0=M

我们通常称 MM 为“中间项”。这三个乘法和两个加法是在 Tk−1Tk−1 中执行的。

  • 步骤 2:使用定义的不可约多项式约简乘积。

到目前为止,乘积由以下公式给出:

PBX2k−1+MXk−1+PAPBXk−12+MXk−1+PA

现在关系 X2k−1=Xk−2Xk−1+1Xk−12=Xk−2Xk−1+1 将产生所需乘积的最终表达式:

u⋅v=(PA+PB)+(M+PBXk−2)Xk−1u⋅v=(PA+PB)+(M+PBXk−2)Xk−1

这是对元素的规范多项式表示的最终约简。在这里要指出一些相关的内容。这个计算是如何执行的?

  • 如前所述,在子域 Tk−1Tk−1 中计算系数 PA+PBPA+PB 和 M+PBXk−2M+PBXk−2。
  • 为了计算更大的线性组合,我们必须首先计算乘积

(M+PBXk−2)Xk−1(M+PBXk−2)Xk−1

关键是当将 TkTk 视为 T0T0 上的向量空间时,乘以 Xk−1Xk−1 实际上是一个自同构,因此一旦我们查看 Wiedemann 塔的方便级别中的元素,就可以通过矩阵乘法获得上述乘积(这里是子域链接在一起的方式获得回报的地方)。显式地,我们首先将 M+PBXk−2M+PBXk−2 解释为上层字段 TkTk 的一个元素。在坐标中,这个事实是通过将坐标 [⋅]k−1[⋅]k−1 填充零以获得其坐标 [⋅]k[⋅]k 来表达的: [M+PBXk−2]k=[[M+PBXk−2]k−1:,0,0,⋯0][M+PBXk−2]k=[[M+PBXk−2]k−1:,0,0,⋯0]

如果我们认为 M+PBXk−2∈TkM+PBXk−2∈Tk,那么与 Xk−1Xk−1 相乘可以通过矩阵乘法在坐标中进行:

[(M+PBXk−2)Xk−1]k=[M+PBXk−2]kAk−1[(M+PBXk−2)Xk−1]k=[M+PBXk−2]kAk−1

其中 AkAk 是一个矩阵,它以行为单位,表示 TkTk 的基元素与 Xk−1Xk−1 的乘积在 TkTk 上的坐标。

  • 最后的加法在顶层域 TkTk 中执行;在坐标中,这仅仅通过 XOR 完成。

简要总结一下目前为止的内容:

  • 层次结构的连接: 多线性基(如 Diamond 和 Posen 隐式采用的)的关键见解是,一个元素在 TkTk 中的表示仅仅是它在 Tk−1Tk−1 中的系数的连接。这意味着你可以简单地通过分割它的位字符串来“解包”一个元素成它的子元素。这是一个“免费”的操作,除了索引操作之外不涉及任何计算。
  • 递归应用: Karatsuba 算法完美地映射到这种递归结构。这正是该算法被设计成高效工作的方式。
  • 用于加法的按位 XOR: 所有的加法都是坐标向量上的简单按位 XOR (⊕⊕)。这在现代处理器上非常快,它们可以在一个周期内对整个机器字执行 XOR。
  • 已定义的约简: 不可约多项式 (X20=X0+1X02=X0+1, X21=X0X1+1X12=X0X1+1, X22=X1X2+1X22=X1X2+1) 是 F2F2 中的简单三项式或二项式。约简步骤 (例如,X21→X0X1+1X12→X0X1+1) 转化为系数向量上的线性变换,可以通过几个 XOR 和重新索引来完成。
  • 小系数: 由于该域是 F2F2,所有的系数 (a0,a1,…a0,a1,…) 都是单比特(0 或 1)。这简化了 M1M1 函数中的基本乘法,使其非常高效。

一个手动扩展的例子

让我们计算 T3T3 中两个元素的乘积,即

u=X0+X1X2 和 v=1+X1+X0X2u=X0+X1X2 和 v=1+X1+X0X2

使用上述算法。在进一步深入之前,仅仅因为我们想避免在递归中走得太深,我们可以务实地构建“乘以 X0X0”映射的矩阵。这个矩阵是

01110111

并有助于构建一个完整的乘法表;要将 γγ 乘以 X0X0,我们计算

[γ]1⋅0111=[γ⋅X0]1[γ]1⋅0111=[γ⋅X0]1

对于一个覆盖 T1T1 中所有可能的域元素乘法的完整乘法表,我们求助于线性性和上面的小工具。

让我们开始吧。记住 T3T3 是一个具有 223=28=256223=28=256 个元素的域,作为 F2=T0F2=T0 上的向量空间,它的维度是 8;它的多线性基是

{1,X0,X1,X0X1,X2,X0X2,X1X2,X0X1X2}{1,X0,X1,X0X1,X2,X0X2,X1X2,X0X1X2}

我们将用坐标进行 uu 和 vv 的乘积。首先,

[u]3=(0,1,0,0,0,0,1,0) 和 [v]3=(1,0,1,0,0,1,0,0)[u]3=(0,1,0,0,0,0,1,0) 和 [v]3=(1,0,1,0,0,1,0,0)

是 uu 和 vv 在 T3T3 的多线性基中的坐标。在执行 Karatsuba 算法之前,我们将以矩阵形式显示两组坐标,并提示一个分区,对应于两者作为塔中最后扩展的元素的规范描述。这是

(uv)3=(0100001010100100)=(0100001010100100)=(α0α1β0β1)(uv)3=(0100001010100100)=(0100001010100100)=(α0α1β0β1)

我们在这里利用了我们可以将 uu 和 vv 写在前一个扩展 T2T2 上的事实:

u=α0+α1X2 和 v=β0+β1X2u=α0+α1X2 和 v=β0+β1X2

对于某些 αi,βj∈T2αi,βj∈T2。回想一下,这个域的维度是 4,并且之前的矩阵分区已经给了我们 T2T2 坐标在 T0T0 上的坐标!这是二进制塔的多线性基中非常酷的特性!我们现在准备好继续使用 Karatsuba 算法。

  • 第一步: 我们继续计算乘积
  1. PA=α0β0PA=α0β0
  2. PB=α1β1PB=α1β1
  3. PC=(α0+α1)(β0+β1)PC=(α0+α1)(β0+β1)
  4. PBX1PBX1

其中所有这些元素都属于子域 T2T2,并且在其中进行运算。 为了做到这一点,我们需要对每个需要的乘积深入一层。让我们谨慎地进行。

i. 为了计算 PAPA,我们将 T2T2 上的坐标解释为 T0T0 上的坐标 就像在上一层一样,并写出

(α0β0)2=(01001010)=(01001010)=(α00α01β00β01)(α0β0)2=(01001010)=(01001010)=(α00α01β00β01)

在这种情况下应用 Karatsuba 算法需要使用我们之前提到的乘法表,

  • P′A=α00⋅β00PA′=α00⋅β00,在 T1T1 坐标中,这是乘积 0,1×1,0=0,10,1×1,0=0,1
  • P′B=α01⋅β01PB′=α01⋅β01,在 T1T1 坐标中,这是乘积 0,0×1,0=0,00,0×1,0=0,0
  • P′C=(α00+α01)⋅(β00+β01)PC′=(α00+α01)⋅(β00+β01),在 T1T1 坐标中,这是乘积 0,1×0,0=0,00,1×0,0=0,0 (在每个因子中完成必要的加法后)
  • 最后是不寻常的 P′BX0PB′X0 项的乘积:

0,0×0111=0,00,0×0111=0,0

现在是构建 T2T2 中元素 α0β0α0β0 的时候了;现在是基的特殊选择发挥作用的地方(再次):T1T1 的元素进入 T2T2 的方式是根本性的,并且在计算上至关重要:要在上面的扩展中查看它们,我们只需在其 T1T1 坐标的末尾填充零以获得一个 4 位字符串。

根据提出的算法,

α0β0=(P′A+P′B)+(M+P′BX0)X1α0β0=(PA′+PB′)+(M+PB′X0)X1

的坐标表达式可以逐步重建。首先在 T1T1 中相加,然后填充:

$$[P^\prime_A + P^\prime_B ]^1 = \boxed{0,1} + \boxed{0,0} = \boxed{0,1} \implies [P\prime_A+P\prime_B]^2 = \boxed{0,1,0,0}$$

然后,是棘手的部分:视为 T1T1 中的元素,

[P′BX0]1=0,0⟹[M+P′BX0]1=0,1+0,0=0,1[PB′X0]1=0,0⟹[M+PB′X0]1=0,1+0,0=0,1

在将其与 X1X1 相乘之前,我们通过在其末尾填充零将此元素嵌入到 T2T2 中。 乘以 X1X1 通过矩阵乘法完成

[(M+P′BX0)⋅X1]2=0,1,0,0×0010000110010111=0,0,0,1[(M+PB′X0)⋅X1]2=0,1,0,0×0010000110010111=0,0,0,1

最后,执行加法,我们得到

0,1,0,0+0,0,0,1=0,1,,0,10,1,0,0+0,0,0,1=0,1,,0,1

这意味着 PA=α0β0=X0+X0X1∈T2PA=α0β0=X0+X0X1∈T2

  • 一旦我们详细解释了第一种情况,我们继续计算 PB:PB:

(α1β1)2=(00100100)=(00100100)=(α10α11β10β11)(α1β1)2=(00100100)=(00100100)=(α10α11β10β11)

我们将计算 α1β1α1β1,在递归中向下一层,将其在 T2T2 中的坐标视为其在 T0T0 中的坐标,就像之前一样:

  1. P′A=α10⋅β10PA′=α10⋅β10,在 T1T1 坐标中,这是乘积 0,0×1,0=0,00,0×1,0=0,0
  2. P′B=α11⋅β11PB′=α11⋅β11,在 T1T1 坐标中,这是乘积 1,0×0,0=0,01,0×0,0=0,0
  3. P′C=(α10+α11)⋅(β10+β11)PC′=(α10+α11)⋅(β10+β11),在 T1T1 坐标中,这是乘积 1,0×0,1=0,11,0×0,1=0,1 (在每个因子中完成必要的加法后)
  4. 最后,我们有 P′BX0PB′X0 项(我们省略了写下矩阵乘积,因为从读取坐标来看,这相当简单和直观):

0,0×0,1=0,00,0×0,1=0,0

有了这些,我们准备好将 α1β1α1β1 重构为 T2T2 中的元素。

α1β1=(P′A+P′B)+(M+P′BX0)X1α1β1=(PA′+PB′)+(M+PB′X0)X1

的坐标表达式可以从 2 位字符串重建如下:首先,相加然后填充。 我们得到

[P′A+P′B]1=0,0+0,0=0,0⟹[P′A+P′B]2=0,0,0,0[PA′+PB′]1=0,0+0,0=0,0⟹[PA′+PB′]2=0,0,0,0

记住填充以在 T2T2 坐标中查看它们。然后,是棘手的部分:视为 T1T1 中的元素,

[P′BX0]1=0,0⟹[M+P′BX0]1=0,1+0,0=0,1[PB′X0]1=0,0⟹[M+PB′X0]1=0,1+0,0=0,1

在将其与 X1X1 相乘之前,我们通过在其末尾填充零将此元素嵌入到 T2T2 中。 然后,矩阵乘法:

[(M+P′BX0)X1]2=0,1,0,0×0010000110010111=0,0,0,1[(M+PB′X0)X1]2=0,1,0,0×0010000110010111=0,0,0,1

然后我们执行加法以获得

0,0,0,0+0,0,0,1=0,0,,0,10,0,0,0+0,0,0,1=0,0,,0,1

这意味着 PB=α1β1=X0X1∈T2PB=α1β1=X0X1∈T2

现在我们想计算 PC=(α)+α1)(β0+β1)PC=(α)+α1)(β0+β1)。通过查看 uu 和 vv 的坐标表达式,可以快速完成其前半部分和后半部分的加法,现在我们有

(α0+α1β0+β1)2=(01101110)=(01101110)=(abcd)(α0+α1β0+β1)2=(01101110)=(01101110)=(abcd)

我们将计算 PCPC,在递归中向下一层,将其在 T2T2 中的坐标视为其在 T0T0 中的坐标,就像之前一样:

  1. P′A=a⋅cPA′=a⋅c,在 T1T1 坐标中,这是乘积 0,1×1,1=1,00,1×1,1=1,0
  2. P′B=b⋅dPB′=b⋅d,在 T1T1 坐标中,这是乘积 1,0×1,0=1,01,0×1,0=1,0
  3. P′C=(a+b)⋅(c+d)PC′=(a+b)⋅(c+d),在 T1T1 坐标中,这是乘积 1,1×0,1=1,01,1×0,1=1,0 (在每个因子中完成必要的加法后)
  4. 最后,我们有 P′BX0PB′X0 项:

1,0×0,1=0,11,0×0,1=0,1

有了这些,我们准备好将 PCPC 重构为 T2T2 中的元素。

PC=(P′A+P′B)+(M+P′BX0)X1PC=(PA′+PB′)+(M+PB′X0)X1

的坐标表达式可以从 2 位字符串重构如下:首先相加,然后填充。由于我们已经这样做了几次,我们允许一些加速:

[P′A+P′B]2=1,0,0,0+1,0,0,0=0,0,0,0[PA′+PB′]2=1,0,0,0+1,0,0,0=0,0,0,0

然后,是棘手的部分:视为 T1T1 中的元素,

P′BX0=0,1⟹M+P′BX0=1,0+0,1=1,1PB′X0=0,1⟹M+PB′X0=1,0+0,1=1,1

在将其与 X1X1 相乘之前,我们通过在其末尾填充零将此元素嵌入到 T2T2 中。 我们现在通过简单地将其系数向左移动两位,同时用零填充前两个槽位来在上层扩展中执行乘积:

[M+P′BX0]2=1,1,0,0, 然后 [(M+P′BX0)X1]2=0,0,1,1[M+PB′X0]2=1,1,0,0, 然后 [(M+PB′X0)X1]2=0,0,1,1

我们得到 [PC]2=0,0,1,1[PC]2=0,0,1,1,也就是说,PC=X1+X0X1∈T2PC=X1+X0X1∈T2

这一层中的最后一个分支是计算 PBX1PBX1;此乘积发生在 T2T2 子域中。在坐标中,我们有

[PBX1]2=0,1,1,1[PBX1]2=0,1,1,1

  • 第二步: 通过执行加法来重构

我们现在准备好用 Karatsuba 的方法构建 u⋅vu⋅v:

u⋅v=(PA+PB)+(M+PBX1)X2u⋅v=(PA+PB)+(M+PBX1)X2

让我们用坐标进行。在其他任何事情之前,让我们首先显示我们需要组合的所有元素,这样我们就不会搞砸了。

  1. PA=X0+X0X1∈T2⟺[PA]2=0,1,0,1PA=X0+X0X1∈T2⟺[PA]2=0,1,0,1
  2. PB=X0X1∈T2⟺[PB]2=0,0,0,1PB=X0X1∈T2⟺[PB]2=0,0,0,1
  3. PC=X1+X0X1∈T2⟺[PC]2=0,0,1,1PC=X1+X0X1∈T2⟺[PC]2=0,0,1,1
  4. M=PA+PB+PC=X0+X1+X0X1∈T2⟺[M]2=0,1,1,1M=PA+PB+PC=X0+X1+X0X1∈T2⟺[M]2=0,1,1,1
  5. PBX1=X0+X1+X0X1∈T2⟺[PBX1]2=0,1,1,1PBX1=X0+X1+X0X1∈T2⟺[PBX1]2=0,1,1,1

为此,我们在 T2T2 中添加这些元素,然后通过简单地用零填充它们的最后 4 个位置,将其嵌入到 T3T3 中,以获得 8 位字符串。这给出

[PA+PB]3=0,1,0,0,0,0,0,0[PA+PB]3=0,1,0,0,0,0,0,0

是我们需要的第一个。现在计算 T3T3 中的 M+PBX1M+PBX1;

[M+PBX1]2=0,0,0,0⟹[M+PBX1]3=0,0,0,0,0,0,0,0[M+PBX1]2=0,0,0,0⟹[M+PBX1]3=0,0,0,0,0,0,0,0

因此很明显

[(M+PBX1)X2]3=0,0,0,0,0,0,0,0[(M+PBX1)X2]3=0,0,0,0,0,0,0,0

然后所需的乘积是

[u⋅v]3=0,1,0,0,0,0,0,0+0,0,0,0,0,0,0,0=0,1,0,0,0,,0,0[u⋅v]3=0,1,0,0,0,0,0,0+0,0,0,0,0,0,0,0=0,1,0,0,0,,0,0

即 u⋅v=X0u⋅v=X0,可以通过手工直接验证。

显然,这个完全执行的最后示例可能很快变得乏味,但它只会加深二进制塔中乘法的方便递归性质,并且电路级别的操作似乎是快速和高效实现的关键要素。

总结

在这篇文章中,我们介绍了 Binius 的塔构建的基础知识及其一些有趣的性质。在即将发表的文章中,我们将提高门槛,并着眼于一个更复杂的问题:二进制塔中的多项式求值。

  • 原文链接: blog.lambdaclass.com/the...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
lambdaclass
lambdaclass
LambdaClass是一家风险投资工作室,致力于解决与分布式系统、机器学习、编译器和密码学相关的难题。