RISC Zero的手撕STARK

1. 引言

RISC Zero虚拟机内的任意代码在执行时,该执行的每个step都记录在Execution Trace中。

以2个用户指定的输入,Fibonacci sequence模97的4步计算为例。本文将介绍:

  • 介绍RISC Zero Execution Trace的各列。
  • 展示了如何在不泄露任何knowledge的情况下,RISC Zero证明某Execution Trace的有效性,的具体例子。

在这里插入图片描述

本文所举例子中,其Execution Trace共有6列,其中:

  • 前3列的每列分别用于记录,从初始化到结束某寄存器的内部状态。将前3列称为Data Columns。
  • 后3列为Control Columns,用于标记初始化和结束节点。

在整个RISC Zero协议中,Data Columns用于维护RISC-V处理器的状态,包括:

  • ISA寄存器
  • program counter
  • 各种微架构细节,如指令解码数据、ALU寄存器等。

等的状态。Control Columns用于处理:

  • 系统初始化和关机(shutdown)
  • 在执行之前,将初始程序代码加载到内存
  • 其它不依赖于程序执行的control signals。

2. Checking the Execution Trace(增加检查规则列)

为展示本例中Execution Trace的有效性,需引入一些rule-checking cells。

在本例中展示了6条规则:(而在整个RISC-V实现中,为验证相应Execution Trace,需检查超过100条规则。)

  • 每条规则的检查,表示为2项之积,再模97:
    • 当第一项为0,则该规则成立。
    • 当第二项为0,则表示无需强化该规则。
  • 每个rule checking column(见下图绿色所示列),可表示为多输入、单输出的多项式,其输入可为该Execution Trace中各元素的某种组合。称这样的多项式为Rule-Checking Polynomials。

在这里插入图片描述

3. Adding Random Padding(增加随机填充行,以实现零知识属性)

在将每列编码为某多项式之前,需在该Execution Trace中附加随机填充行,从而支持零知识协议。这些随机噪声由host system的密码学安全伪随机数生成器 生成。为关闭对随机噪声行的规则检查,可设置这些随机噪声行的Control columns值为0。
在这里插入图片描述

4. Interpolating Trace Polynomials(对trace各列插值获得trace polynomials)

此时,暂时先移除不考虑rule-checking列,并将注意力用于将Trace data编码为多项式。类似于任意2点间可画线,任意8个点可确定某degree为7的多项式。已知一组点,构建经过这些点的某多项式的标准技术为Lagrange插值和FFT(Finite Fourier Transforms)。在RISC Zero上下文中,使用NTT(Number Theoretic Transforms)——为有限域版本的FFT。

由于本例中使用的是模97,因此,相应多项式的evaluation值和系数均在有限域 F 97 F_{97} F97中。RISC Zero所采用的多项式编码技术称为Reed-Solomon encoding。

RS codes在数字信号处理世界中无处不在,用于提供冗余,以做错误发现和纠错。Reed-Solomon Codes采用的点格式为 ( a 0 , x 0 ) , ( a 1 , x 1 ) , ⋯ (a^0,x_0),(a^1,x_1),\cdots (a0,x0),(a1,x1),

在本例中,将powers of 28 28 28(因有 5 3 m o d    97 = 28 5^3\mod 97=28 53mod97=28)当做输入(并将该Execution Trace中的元素作为输出)。RISC Zero使用该技术来将该trace中的每列表示为某Trace Polynomial。如:

  • 1)对Data Column 1的8个元素运行iNTT,使用iNTT(column, modulus)来生成某Trace Polynomial d 1 d_1 d1,该多项式的evaluation值与这8个元素的值对应。【Data Column 1的这8个元素在下图中以黑色加粗表示,每个元素对应Padded Trace中的一行。】
    • 在Python中,using sympy, intt([24, 30, 54, 84, 78, 15, 29, 50], prime=97),返回[94, 68, 41, 69, 25, 72, 85, 55]。iNTT的输出值对应为Trace Polynomial的系数,即Trace Polynomial d 1 ( x ) = 94 + 68 x + 41 x 2 + 69 x 3 + 25 x 4 + 72 x 5 + 85 x 6 + 55 x 7   ( m o d    97 ) d_1(x)=94+68x+41x^2+69x^3+25x^4+72x^5+85x^6+55x^7 \ (\mod 97) d1(x)=94+68x+41x2+69x3+25x4+72x5+85x6+55x7 (mod97)
    • d 1 ( x ) d_1(x) d1(x)的关键特性在于,当 z = 5 0 , 5 12 , 5 24 , ⋯ z=5^0,5^{12},5^{24},\cdots z=50,512,524,时, d 1 ( z ) d_1(z) d1(z)的evaluation值与Data Column 1的8个元素值对应:即 d 1 ( 5 0 ) = 24 , d 1 ( 5 12 ) = 30 , d 1 ( 5 24 ) = 54 d_1(5^0)=24,d_1(5^{12})=30,d_1(5^{24})=54 d1(50)=24,d1(512)=30,d1(524)=54等等。【其中 5 5 5 F 97 F_{97} F97域的 96 96 96-th root of unity。】
  • 2)然后对该Trace Polynomial d 1 d_1 d1在Expanded Domain进行evaluate,已构建该列的Reed Solomon编码。
    • 若blowup-factor为4,则相应的Reed-Solomon input(即对 d 1 ( x ) d_1(x) d1(x)的evaluate点)为: 5 0 , 5 3 , 5 6 , ⋯ 5^0,5^{3},5^6,\cdots 50,53,56,

在这里插入图片描述
以此类推,对Execution Trace中的其它Data Column和Control Column做类似以上的操作,即本例中,一共有6个Trace Polynomials,每个Trace Polynomial分别在32个点上进行evaluate,以获得Reed-Solomon编码:
在这里插入图片描述

5. Committing Trace Polynomials

接下来,Prover会将Trace Polynomials承诺到a Merkle tree中。为实现零知识属性,Prover会对每个Trace Polynomial,基于“a shifted evaluation domain”来进行evaluate,即在 x = 5 1 , 5 4 , 5 7 , ⋯   , 5 94 x=5^1,5^4,5^7,\cdots,5^{94} x=51,54,57,,594 对每个 d i ( x ) d_i(x) di(x)进行evaluate。

注意,由于采用的是shifted evaluation domain,下图中Data Column 1、2、3中的黄色和蓝色单元格内的值,将不再与Inputs和Asserted Outputs值匹配了。事实上,在evaluation domain的这种便宜,可掩饰所有Trace Data。仅公开掩饰后的trace信息,且附加的随机padding,足以防止攻击者推断出“掩饰后的trace”与“实际trace”之间的任何关联信息。

在这里插入图片描述

6. Introducing Constraint Polynomials

至此,已将Trace Data编码为了Trace Polynomials。

回到原始的Reed-Solomon domain,并将Rule Checking cells加回:

  • 对于RS Redundancy Row,不应期待其rule checks会evaluate为0值,因为其与Execution Trace中的数据无直接关系。
  • 与Trace Polynomials类似,可将这些rule checks对应的multi-input rule checking polynomials 转换为 single-input polynomials——即称为Constraint Polynomials。
    • 注意,每个Constraint Polynomials,在与实际trace data相关的RS input values点处的evaluation值为0。

【注意下图中为展示原理,采用的是未便宜evaluation domain。】
在这里插入图片描述

6.1 Mixing Constraint Polynomials

再额外增加一列,用于将多个Constraint Polynomials 混合为单个Constraint Polynomial。

在Prover发送完每个Trace Polynomial的Merkle root之后,Verifier会回复一个Constraint Mixing Parameter—— a a a。【下图中,取 a = 3 a=3 a=3。】

对于 i = 0 , 1 , 2 , 3 , 4 , 5 i=0,1,2,3,4,5 i=0,1,2,3,4,5,以 c i c_i ci来表示相应的Constraint Polynomials,则利用Verifier提供的约束混合参数 a a a,可将多个Constraint Polynomials 混合为单个Constraint Polynomial:
C ( x ) = a 0 ∗ c 0 ( x ) + a 1 ∗ c 1 ( x ) + ⋯ + a 5 ∗ c 5 ( x ) C(x)=a^0 * c_0(x)+a^1*c_1(x)+\cdots +a^5*c_5(x) C(x)=a0c0(x)+a1c1(x)++a5c5(x)。【注意,若每个 c i c_i ci在某个输入 x x x处的evaluation值均为0,则在相应输入 x x x处, C C C的evaluation值也将为0。】

在本例中,Mixed Constraint Polynomial的degree,等于,Trace Polynomials的degree,因为所包含的Rule-Checking特别简单。实际在更复杂的例子中,将Rule Checking Polynomials和Trace Polynomials组合,可能会生成“High Degree Constraint Polynomials”——此时,需增加额外的步骤:

  • 将“High Degree Mixed Constraint Polynomial” 切分为一些“Low Degree Mixed Constraint Polynomials”。

【注意,实际为实现零知识属性,下图展示的是shifted evaluation domain下的各值。】
在这里插入图片描述

7. RISC Zero STARK核心

Prover构建Validity Polynomial:

  • 将Constraint Polynomial 除以 公开已知的Zeros Polynomial,即 V ( x ) = C ( x ) / Z ( x ) V(x)=C(x)/Z(x) V(x)=C(x)/Z(x)

在本例中,Zeros Polynomial为 Z ( x ) = ( x − 1 ) ∗ ( x − 64 ) ∗ ( x − 22 ) ∗ ( x − 50 ) ∗ ( x − 96 ) ∗ ( x − 33 ) ∗ ( x − 75 ) ∗ ( x − 47 ) Z(x)=(x-1)*(x-64)*(x-22)*(x-50)*(x-96)*(x-33)*(x-75)*(x-47) Z(x)=(x1)(x64)(x22)(x50)(x96)(x33)(x75)(x47)。【即对应未偏移evaluation domain,对Execution trace中所取的Reed Solomon input —— ( 5 0 m o d    97 , 5 12 m o d    97 , 5 24 m o d    97 , ⋯   , 5 84 m o d    97 ) (5^0\mod 97,5^{12}\mod 97,5^{24}\mod 97,\cdots,5^{84}\mod 97) (50mod97,512mod97,524mod97,,584mod97)。】

正常对2个low degree多项式做除法运算时,不一定能获得另一个low degree多项式(更大概率是获得rational function)。但对于诚实的Prover,其不难看出 V ( x ) V(x) V(x)的degree 要比 C ( x ) C(x) C(x)的degree 低,因为 Z ( x ) Z(x) Z(x)的根 正好与 C ( x ) C(x) C(x)的根 对齐。

如下图所示,Prover基于“shifted evaluation domain”来对 V ( x ) V(x) V(x)进行evaluate,并将相应的evaluation值承诺到a Merkle tree中,并将相应的Merkle root发送给Verifier。
在这里插入图片描述

这些多项式的构建,是RISC Zero的Trace Validity Proof的核心概念要点。确认原始Execution Trace有效性 所需的所有信息,均可描述为关于这些多项式的如下assertions:

  • 1)对于所有的 x x x,有 V ( x ) = C ( x ) / Z ( x ) V(x)=C(x)/Z(x) V(x)=C(x)/Z(x)。【RISC Zero采用DEEP-ALI协议来证明。】
  • 2)Validity Polynomial V ( x ) V(x) V(x)的degree小于等于7,且每个Trace Polynomials的degree也小于等于7。【使用FRI协议来证明。本文忽略具体细节。】

在原始的STARK协议中,Verifier为验证 “对于所有的 x x x,有 V ( x ) = C ( x ) / Z ( x ) V(x)=C(x)/Z(x) V(x)=C(x)/Z(x)。”,需在一组test points进行测试,该协议的soundness取决于测试的次数。
DEEP-ALI技术,支持以单个测试,来实现high degree soundness。

7.1 Constructing the DEEP Polynomials

使用Trace Polynomials和Validity Polynomial(s) 来构建DEEP Polynomials。

DEEP Polynomials支持Verifier在原始Merkle tree commitments之外 来测试 V ( x ) = C ( x ) / Z ( x ) V(x)=C(x)/Z(x) V(x)=C(x)/Z(x),这大大提高了Verifier测试的鲁棒性。

基本流程为:

  • 根据Trace Polynomials的承诺值,以及Validity Polynomial的承诺值,Verifier选择随机域元素 z z z。【在本例中,取 z = 93 z=93 z=93。】
  • Verifier想要计算Mixed Constraint Polynomial在 z z z点的evaluation值 C ( z ) C(z) C(z)
    • Prover发送 V ( z ) V(z) V(z)所需的Trace Polynomial相关evaluation值 给Verifier,使得Verifier可计算出 C ( z ) C(z) C(z)
      如本例中取 z = 93 z=93 z=93,为让Verifier可计算出 C ( 93 ) C(93) C(93),Prover需提供的evaluation值有:
      • d 1 ( 93 ) , d 2 ( 93 ) , d 3 ( 93 ) , c 1 ( 93 ) , c 2 ( 93 ) , c 3 ( 93 ) d_1(93),d_2(93),d_3(93),c_1(93),c_2(93),c_3(93) d1(93),d2(93),d3(93),c1(93),c2(93),c3(93),以及 d 2 ( 93 ∗ 5 − 12 ) , d 3 ( 93 ∗ 5 − 12 ) d_2(93*5^{-12}),d_3(93*5^{-12}) d2(93512),d3(93512)。这8个值,称为taps of the trace at 93。
        • 其中 5 − 12 5^{-12} 512表示指向前一计算step,并支持跨多个clock-cycles的Rule Cchecking。【若 5 12 5^{12} 512则表示指向后一计算step。】
        • 根据这8个值,以及公开已知的rule-checking函数,Verifier可计算出 C ( 93 ) C(93) C(93),进而进一步计算出 V ( 93 ) V(93) V(93)
  • Prover也会构建DEEP Polynomials,每个DEEP Polynomial插值,并将每个DEEP Polynomial的系数发送给Verifier。
    • 本例中,具体的DEEP Polynomial定义为:【因实际约束规则中对Data Column 2和Data Column 3的前一计算step的值有约束,因此对 d 2 , d 3 d_2,d_3 d2,d3除取当前点 93 93 93之外,还需取其前一计算step的点 6 6 6
      d 1 ′ ( x ) = ( d 1 ( x ) − d 1 ( 93 ) ) / ( x − 93 ) d'_1(x) = (d_1(x) - d_1(93)) / (x - 93) d1(x)=(d1(x)d1(93))/(x93)
      d 2 ′ ( x ) = ( d 2 ( x ) − d b a r 2 ( x ) ) / ( ( x − 93 ) ( x − 6 ) ) d'_2(x) = (d_2(x) - dbar_2(x)) / ((x-93)(x-6)) d2(x)=(d2(x)dbar2(x))/((x93)(x6)):其中 d b a r 2 ( x ) dbar_2(x) dbar2(x)为对 ( 6 , d 2 ( 6 ) ) (6, d_2(6)) (6,d2(6)) ( 93 , d 2 ( 93 ) ) (93, d_2(93)) (93,d2(93))的插值多项式。【其中 6 , 93 6,93 6,93均为Non-Merkle Points】
      d 3 ′ ( x ) = ( d 3 ( x ) − d b a r 3 ( x ) ) / ( ( x − 93 ) ( x − 6 ) ) d'_3(x) = (d_3(x) - dbar_3(x)) / ((x-93)(x-6)) d3(x)=(d3(x)dbar3(x))/((x93)(x6)):其中 d b a r 3 ( x ) dbar_3(x) dbar3(x)为对 ( 6 , d 3 ( 6 ) ) (6, d_3(6)) (6,d3(6)) ( 93 , d 3 ( 93 ) ) (93, d_3(93)) (93,d3(93))的插值多项式。【其中 6 , 93 6,93 6,93均为Non-Merkle Points】
      c 1 ′ ( x ) = ( c 1 ( x ) − c 1 ( 93 ) ) / ( x − 93 ) c'_1(x) = (c_1(x) - c_1(93)) / (x - 93) c1(x)=(c1(x)c1(93))/(x93)
      c 2 ′ ( x ) = ( c 2 ( x ) − c 2 ( 93 ) ) / ( x − 93 ) c'_2(x) = (c_2(x) - c_2(93)) / (x - 93) c2(x)=(c2(x)c2(93))/(x93)
      c 3 ′ ( x ) = ( c 3 ( x ) − c 3 ( 93 ) ) / ( x − 93 ) c'_3(x) = (c_3(x) - c_3(93)) / (x - 93) c3(x)=(c3(x)c3(93))/(x93)
      V ′ ( x ) = ( V ( x ) − V ( 93 ) ) / ( x − 93 ) V'(x)=(V(x)-V(93))/(x-93) V(x)=(V(x)V(93))/(x93):其中Prover为计算 V ( 93 ) V(93) V(93),运行iNTT(ValidityColumn),然后对其在93进行evaluate。具体的Python代码为:intt([ 88,67,49,53,56,85,28,36,16,56,13,23,83,13,45,29,74,96,77,85,42,39,48,48,59,69,18,51,59,52,5,55], prime=97),返回的 V V V多项式系数为 [96, 83, 47, 58, 36, 60, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    • 若不使用DEEP技术,则Prover将断言 d 1 , d 2 , d 3 , c 1 , c 2 , c 3 d_1,d_2,d_3,c_1,c_2,c_3 d1,d2,d3,c1,c2,c3 V V V均为low degree多项式。
    • 若使用DEEP技术,则Prover将断言 d 1 ′ , d 2 ′ , d 3 ′ , c 1 ′ , c 2 ′ , c 3 ′ d'_1,d'_2,d'_3,c'_1,c'_2,c'_3 d1,d2,d3,c1,c2,c3 V ′ V' V均为low degree多项式。

在这里插入图片描述

7.2 The FRI Polynomial

在使用DEEP Polynomials来检查,Trace Polynomials、Validity Polynomial和Zeros Polynomial在 z = 93 z=93 z=93点处的关系之后,Prover所剩的唯一一件事情是:

  • 证明这些DEEP Polynomials是low-degree的。

对Verifier来说,FRI协议提供了一种确认多项式low-degree-ness的机制,Verifier继续非常少量的计算。为将多个多项式的low-degree-ness assertion,reduce为,仅需应用一次FRI协议,Prover需使用DEEP Mixing Parameter b b b(本例中,取 b = 21 b=21 b=21),来将多个DEEP Polynomials混合为单个FRI Polynomial:

  • c 1 ′ , c 2 ′ , c 3 ′ , d 1 ′ , d 2 ′ , d 3 ′ , V ′ c'_1,c'_2,c'_3,d'_1,d'_2,d'_3,V' c1,c2,c3,d1,d2,d3,V来表示DEEP Polynomials,将这些DEEP Polynomials混合构建的FRI Polynomial为: f ( x ) = b 0 ∗ c 1 ′ ( x ) + b 1 ∗ c 2 ′ ( x ) + ⋯ + b 6 ∗ V ′ ( x ) f(x)=b^0*c'_1(x)+b^1*c'_2(x)+\cdots +b^6*V'(x) f(x)=b0c1(x)+b1c2(x)++b6V(x)

为完整整个证明,Prover为“f(x)是low-degree多项式” 构建一个FRI proof。

这样,Prover就构建了a zero-knowledge argument of computation integrity,同时其验证速度快得令人难以置信。
在这里插入图片描述

7.3 FRI Folding and Queries

已知某vector commitment,FRI协议可证明该承诺值对应某low-degree多项式的evaluations。
在本例中,使用FRI来证明上一节的“FRI Polynomial” commitment具有的degree不超过7。

本例中的“FRI blow-up factor”为 4 4 4,因此FRI Polynomial的承诺值有 32 32 32个元素,且degree为 7 7 7的多项式有 8 8 8个系数。该blow-up factor为之前选择Reed-Solomon expansion的结果。FRI blow-up factor为 4 4 4,对应的RS code rate为 1 / 4 1/4 1/4

FRI包括:

  • 1)commit阶段:包含 r r r轮。在每轮中,Prover会将之前的commitment "fold"为更小的commitment——既有更小的commitment size,也有更小的polynomial degree。

    • 如本例中,当使用的folding factor为 2 2 2时,对应有3轮。每一轮中,Prover所承诺的向量的长度,为前一轮的一半。每一轮中,都通过先将系数切分为奇数和偶数部分,然后使用Verifier提供的随机值将这2部分混合,来完成folding。
      下图中展示了各轮中多项式的系数:
      在这里插入图片描述
  • 2)query阶段:本例中:

    • 在Prover分别 对 f 0 f_0 f0在powers of 28 28 28 f 1 f_1 f1在powers of 2 8 2 28^2 282 f 2 f_2 f2在powers of 2 8 4 28^4 284 f 3 f_3 f3在powers of 2 8 8 28^8 288处的evaluations 完成了commit之后。【此处分别取 28 , 2 8 2 , 2 8 4 , 2 8 8 28,28^2,28^4,28^8 28,282,284,288的原因在于,前面folding factor的取值为 2 2 2。】
      • 因为 28 28 28的multiplicative order为 32 32 32,其对应的evaluation domains分别为 32 32 32个元素、 16 16 16个元素、 8 8 8个元素、 4 4 4个元素。
    • Verifier会做多个queries。这些queries用作随机挑战,用来测试Prover的commitments的合法性。
      • 宽泛来说,当blow-up factor为 4 4 4时,单次query抓到Prover作弊的概率为 3 / 4 3/4 3/4。换句话说,就是单次query提供了 2 2 2个bits的安全性。
      • RISC Zero zkVM使用的blow-up factor为 4 4 4,query次数为 50 50 50,对应约为 100 100 100-bit的安全性。

在这里插入图片描述
需注意,以上分析为完整安全性分析的简化,准确的安全等级不是正好 100 100 100个bits。更详细地安全性分析参看RISC Zero zkVM 白皮书

FRI Folding的关键点在于,其可checked locally

  • 对于单次query,Prover提供 f 0 、 f 1 、 f 2 f_0、f_1、f_2 f0f1f2的2个evaluation值,和 f 3 f_3 f3的一个evaluation值。
    • 如Verifier请求的query点为 g g g,则Prover发送的evaluation值为: f 0 ( ± g ) 、 f 1 ( ± g 2 ) 、 f 2 ( ± g 4 ) 、 f 3 ( g 8 ) f_0(\pm g)、f_1(\pm g^2)、f_2(\pm g^4)、f_3(g^8) f0(±g)f1(±g2)f2(±g4)f3(g8)
  • Verifier在检查每个evaluation值的Merkle branch的同时,还会逐轮检查这些evaluation值的一致性。如, f 1 ( g 2 ) f_1(g^2) f1(g2)可表示为 f 0 ( g ) , f 0 ( − g ) f_0(g),f_0(-g) f0(g),f0(g)以及该轮随机值 的组合。

7.3.1 Checking the Evaluations are Consistent

Verifier会通过如下公式来检查 f i − 1 f_{i-1} fi1 f i f_i fi的evaluation值的一致性:
f i ( x 2 ) = r i + x 2 x f i − 1 ( x ) + r i − x 2 ( − x ) f i − 1 ( − x ) f_i(x^2)=\frac{r_i+x}{2x}f_{i-1}(x)+\frac{r_i-x}{2(-x)}f_{i-1}(-x) fi(x2)=2xri+xfi1(x)+2(x)rixfi1(x)

具体的推理过程为:
因: f 1 ( x 2 ) = f 0 , e v e n ( x 2 ) + r 1 ⋅ f 0 , o d d ( x 2 ) f_1(x^2)=f_{0,even}(x^2)+r_1\cdot f_{0,odd}(x^2) f1(x2)=f0,even(x2)+r1f0,odd(x2)
即意味着: f 1 ( x 2 ) = r 1 + x 2 x f 0 ( x ) + r 1 − x 2 ( − x ) f 0 ( − x ) f_1(x^2)=\frac{r_1+x}{2x}f_{0}(x)+\frac{r_1-x}{2(-x)}f_{0}(-x) f1(x2)=2xr1+xf0(x)+2(x)r1xf0(x)

其中:
f 0 , e v e n ( x 2 ) = f 0 ( x ) + f 0 ( − x ) 2 f_{0,even}(x^2)=\frac{f_0(x)+f_0(-x)}{2} f0,even(x2)=2f0(x)+f0(x)
f 0 , o d d ( x 2 ) = f 0 ( x ) − f 0 ( − x ) 2 x f_{0,odd}(x^2)=\frac{f_0(x)-f_0(-x)}{2x} f0,odd(x2)=2xf0(x)f0(x)
从而有: f 1 ( x 2 ) = f 0 , e v e n ( x 2 ) + r 1 ⋅ f 0 , o d d ( x 2 ) f_1(x^2)=f_{0,even}(x^2)+r_1\cdot f_{0,odd}(x^2) f1(x2)=f0,even(x2)+r1f0,odd(x2)
f 0 , e v e n , f 0 , o d d f_{0,even},f_{0,odd} f0,even,f0,odd带入上面公式,仅使用 f 0 ( x ) , f 0 ( − x ) , r 1 f_0(x),f_0(-x),r_1 f0(x),f0(x),r1来重写 f 1 ( x 2 ) f_1(x^2) f1(x2),有:
f 1 ( x 2 ) = f 0 ( x ) + f 0 ( − x ) 2 + r 1 ⋅ f 0 ( x ) − f 0 ( − x ) 2 x f_1(x^2)=\frac{f_0(x)+f_0(-x)}{2}+r_1\cdot \frac{f_0(x)-f_0(-x)}{2x} f1(x2)=2f0(x)+f0(x)+r12xf0(x)f0(x)

找到共同的分母,并重新组合各项,有:
f 1 ( x 2 ) = x f 0 ( x ) + x f 0 ( − x ) 2 x + r 1 ⋅ f 0 ( x ) − f 0 ( − x ) 2 x = r 1 + x 2 x f 0 ( x ) + x − r 1 2 x f 0 ( − x ) = r 1 + x 2 x f 0 ( x ) + r 1 − x 2 ( − x ) f 0 ( − x ) f_1(x^2)=\frac{xf_0(x)+xf_0(-x)}{2x}+r_1\cdot \frac{f_0(x)-f_0(-x)}{2x}=\frac{r_1+x}{2x}f_{0}(x)+\frac{x-r_1}{2x}f_{0}(-x)=\frac{r_1+x}{2x}f_{0}(x)+\frac{r_1-x}{2(-x)}f_{0}(-x) f1(x2)=2xxf0(x)+xf0(x)+r12xf0(x)f0(x)=2xr1+xf0(x)+2xxr1f0(x)=2xr1+xf0(x)+2(x)r1xf0(x)

参考资料

[1] STARK by Hand
[2] RISC Zero doc STARK by Hand

RISC Zero系列博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值