---
# System prepended metadata

title: FRI低度测试中的示例及思考
tags: [FRI过程笔记]

---

# FRI低度测试中的示例及思考
## 针对某FRI文章：
针对[此FRI介绍](https://blog.nowcoder.net/n/f9742fdb7b2c459ca2be87c7ff5a7f46?from=nowcoder_improve),做一个思考及示例研究。
此文章中，对应于经典的FRI（按degree折半的方式进行验证），与[此版本对应Python代码]（https://github.com/aszepieniec/stark-anatomy） 的方式相同。

### 选取案例：
$f_{0}(X)=2X^4+3X^3+5X^2+X+3$ 作为示例,则 $Q(X,Y)=(2Y^2+5Y+3)+X(3Y+1)$
- step1
Verifier，对 $Q(X,Y）$随机选取 $x$，使得 $x=\alpha=2$,
Prover计算得到: $f_{1}(Y)=2Y^2+11Y+5$ 
- step2
Verifier选取 $y=1$,则对应的 $x0=1, x1=-1$, 且query得到： $f_{0}(x0)=14, f_{0}(x1)=6$ 
然后，取 $y=1$ 处的$f_{1}(y)=f_{1}(1)=18$ 
验证共线性可知： $(x0,f_{0}(x0)),(x1,f_{0}(x1)),(\alpha,f_{1}(y))=(1,14),(-1,6),(2,18)$ 是共线性的
- step3
低度测试：判断 $f_{1}(Y)$ 是对应的低度，即 $f_{1}∈[F,L,ρ]$ 

### 分析关键：

一开始是对这个共线性测试，百思不得其解，仔细思考后发现如下：
- 对于下图的定义域为 $X∈L0,而Y∈L1$ , 定义域为 $L0*L1$，即为对应的绿色区域，其实相当于将最起初的 $f_{0}(X)$ 转变为了 $Q(X,Y)$ 了，即将一个1D的函数变为2D的，因此其定义域也是2D的了。
- 在红色曲线（实际为离散点，画为连续时为示意）时，方有 $f_{0}(X)=Q(X,Y)$ 而不是红色曲线上的点，是不等的。即，红色曲线上时，方有 $Y=X^2$ ,此时还原为了原曲线。
- 之所以会共线性，是因为此时是将 $y$ 固定住了。从而将 $Q(X,Y)$ 变为以 $X$ 为单变量的一阶线性函数，即为 $f(X)=a+bX$ 因此，在X取不同值时，a与b保持不变。因此是线性的。**特别要注意的是**：上述例子中，取 $y=1$ 时， $x0=1,与x0=-1$ 为原始 $f0(X)$ 曲线上的点。而 $y=1,x0=2$ 时，并不是原始曲线 $f0(X)$ 上的点,需要注意这个点是怎么来的：它是针对 $Q(x,y)$ 取随机点 $x=2，y=1$ 得到。
- 正确的叙述流程其实是先对 $Q(x,y)$ 取了随机点 $(x=2,y=1)$ ,然后根据 $y=1$ 得到 $y=x^2$ 曲线(也就是由 $f0(x)$ 折半为 $f1(x)$ 的约束曲线)上的点 $(x0,x1)$ 。而 $Q(x,y)=f(x)=a+bX$ ,在本案例中为 $f(x)=10+4x$,即对应的点为$(1,14)与(-1,6)$
- 最终：这三点的共线性。因为固定y时， $Q(x,y)$可表达为 $a+bx$
- 如果将这个例子进行下去，再做一轮：由 $f_1(x)=2x^2+11x+5=Q(X,Y)=(2Y+5)+X*11$ 我们可以再取： $x=\alpha=3,y=1$,则可以迭代下一轮的多项式 $f_2(x)=7+11x$，照样得到此时的点 $(1,18)$ 与 $(-1,-4)$，验证： $(1,18),(-1,4),(3,1)$共线性。
![11221111](https://hackmd.io/_uploads/B1BrR7rtA.png)
注：这张图中的纵坐标是y，如果将纵坐标的刻度改为x^2，那么抛物线应该变成一条直线（同V神文章中的图）

### 为何要做多轮测试？何为Proximity要求？
考虑到一些点并不是在原始曲线上，需要对这种验证过程重复多次。
例如：我们知道大部分的点，在 $f_{0}(X)=2X^4+3X^3+5X^2+X+3$ 曲线上
我们再做一次正确性的验证，过程如下：
- step1
 $x=\alpha=2，f_{1}(Y)=2Y^2+11Y+5$
- step2
 取 $x0=3, f_{0}(3)=294, x1=-3, f_{0}(-3)=126$ 对应于 $y=9$  
 计算， $f_{1}(9)=122$ 
 可以轻松验证共线性。
- 假设，有一个点不在此曲线上
设针对 $x0=3时，f_{0}(3)=2X^4+3X^3+5X^2+X+4=295$ 那么我们知道，(3,295)实际上不是在该曲线上。那么，此时验证共线性则必失败。

所以，我们可以得出结论：共线性测试是保证了由 $f_{0}到f_{1}$ 选取的每个随机点，都是在对应曲线上的。

而之所以需要做多次：提高正确验证的概率，防止因为未能抽取到那个不在曲线上的点，而误判为正确。（降低这种误判的风险。假设存在10%概率的错误点，没有抽种这个错误点的概率为0.9，十次未抽中的概率为 $0.9^{10}=0.349$ 也就是说10次都（错将不正确误判为对）的概率很低。
如果本身100个点只有一个点为错误点，概率则为 $0.99^{10}=0.90$ 虽可能有误判，但很接近正确。可以说是概率上的接近。


## 针对V神stark文章第二部分：
[V神文章 Stark II:FRI](https://vitalik.eth.limo/general/2017/11/22/starks_part_2.html)

### 原始验证示例
Prover：复杂度为10^18^
![image](https://hackmd.io/_uploads/H1Lv97LFR.png)

#### 小示例举例
原始 $f(x)=1+x+x^{1001}+x^{3005}+x^{12}+x^{11001}$ 
取 $y=x^{1000}$ 后，上式变为
 $g(x,y)=1+x+xy+x^5y^3+x^{12}+xy^{11}$ 
 1. 固定 $x=x_{0}$ ,随机取1010个 $y$ 值进行query，看是否满足 $degree<1000$ 
 此时 $g(x,y)=g(y)=(1+x_{0}+x_{0}^{12}+x_{0}y+x_{0}^{5}y^3+x_{0}y^{11})$ 
 这是一个关于y的多项式。此时，若该多项式满足： $degree<1000$ ，则说明原多项式 $f(x)$ 满足 $degree<1000000$ 
 2. 固定 $y=y_{0}$，则此时：
 $g(x,y)=g(x)=1+(1+y_{0}+y_{0}^{11})x+y_{0}^{3}x^5+x^{12}$ 
 这是一个关于x的多项式。此时，若该多项式满足： $degree<1000$ ，则说明原多项式 $f(x)$ 满足 $degree<1000000$ 
 3. 此时还要验证：对于对角线上的点，满足 $y=x^{1000}$ 时：当固定 $x=x0$ 时，query  $g(y)$ 与固定 $y=y0$ 时，query $g(x)$ ，二者是否相等，即为同一多项式？
 **<p style="color: red;">第三点有些不确定，存疑问</p>**
 
 
 ### 优化验证1
 原始方案，Prover要commit每个点，是 $10^9 * 10^9 = 10^{18}$
 优化步骤：取p=1,000,005,001  $\forall x \in[0,|P| ]$
 那对于y按x^1000 modulus p进行取值，可知 y为0,1,... 1000006 
 此时：降为 $10^9 * 10^6=10^{15}$
 
 ![image](https://hackmd.io/_uploads/SkPWRQ8t0.png)

 ### 优化验证2
 进一步优化
 固定y值，取一行。并且只取1000个点（只取x^1000=y的点？）
 注意图中的对象线只有1000条。因此每一行只有1000个数据点？针对这1000个点，构造一个多项式。
 **这一部分有一些存疑**
 然后取一个列（固定x值），这里应该是10^6^个点，同样验证这里的多项式是否degree<1000
 然后，做验证？
**<p style="color: red;">总结，自己在这一段，好像没有懂。先搁置一下，再看一下其它的内容**</p>



## v神文章继续研究
### part2:原始计算法
#### 证明过程
- 证明目标：
    - 要证明：在N=10^9^ points上，其多项式degree<10^6^
- 定义域：
    - $x \in N={0,1,2...10^9}$
    - $y \in M=[{x^{1000}:1<=x<=N}]$
- Commit：
    - 将整个$x \in N, y \in M$ 的点进行commit，则须commit的数量为：$10^18$
- Verify
    - 取部分行（固定y值）、且该行取1010个点；取部分列（固定x值）、且该行取1010个点；
    - 取对象线上，
- V神举例，取30行，30列。相当于取：x=x0,x1...x30，那么在固定x的情况下，可对应插值出g0(y)、g1(y)...g30(y)，同理g0(x)、g1(x)...g30(x)

#### 疑问
- 为何不是只取对象线上的10^6个点即可？如果只取对象线上的点可以验证，那是不是不用取colunm或row了？
- 下图的疑问
![image](https://hackmd.io/_uploads/HyiQz4x5R.png)


### part2:优化一
- 定义域变换：
    - x仍然是1~10^9,略扩大一点到p=1000005001
    - y取x^1000^ mod p
    - 图形中的对象线，变为循环围绕式
- Prover
    - 优化后：需要Commit 10^9^ * 10^6^ =10^15^ 个点
- Verify
    - 取任意一个y=y0值，取各条对角线上的对应点（共1000个），将其插值为一个degree<1000的多项式f(x)。（这些点就是原始点？多项式相当于是原始多项式，当y=x^1000^时）
    - 然后：任取一个x值(x0)，验证(x0,y0)在f(x)上。（因为y值被固定，所以必在此曲线上）
    - 最后：针对固定这个x值的colunm，取1000个y值点形成f(y)，验证其degree<1000
- 该优化后的计算量：
    - Verifier:仍然是亚线性？
    - Prover：降至10^9？是否是，现在只commit在对角线上的这些点？
    - **<p style="color: red;">（即：10^3^ 根对角线，每根为10^6^ 个点，这样，其它点不用？但是不对呢，不是还要取一个colunm吗？那这样不还是要commit其它点吗？）**</p>


### part2:进一步优化：折半的低度测试

关于Jade分享中的困惑

![image](https://hackmd.io/_uploads/HyYNiwxq0.png)

另外，这个数学公式的含义？可否解释一下？

![image](https://hackmd.io/_uploads/HyALiDecR.png)

这里应该就是FRI的不断折半的过程
但是：（1）commit的范围仍然没有变吧？x取值，仍然是从1~10^9，而y的范围则是1~10^9/2? 
(2)各轮次之间的f(x)有怎样的关系？好像不是像图中说的，上一轮f(x)，怎么做为下一轮的f(x)


![image](https://hackmd.io/_uploads/ryGHYslq0.png)


