多项式是什么?
多项式其实在写法上和方程非常相似
- 多项式:
- 方程:
他们之间微弱的差别在于,多项式是一个函数,而方程是一个等式。
说白了:
- 多项式是一个函数,他的目的是求这个函数运算后的值。不包含等号
- 方程是一个等式,他的目的是找到满足这个等式的解。包含等号
多项式的一些术语
- 根(Root):多项式的根是让多项式等于0的那些x值。
- 系数(Coefficient):多项式中每个项的数字因子。比如 中,8就是x的线性项系数。
- 次数(Degree):多项式中最高次项的次数。比如 中,次数就是2。
- 多项式插值:通过已知的多项式在某几个点的值,来推断多项式。
- 评估(Evaluation):将一个值代入多项式,计算出多项式的值。
- 评估域(Evaluation Domain):多项式的评估域是多项式可以被评估的区间。可以认为是x的取值数组。
多项式的根
多项式的根(也叫零点)是让多项式等于0的那些x值。比如:
对于多项式 ,它的根是 1 和 -1,因为:
💡
在ZK证明中,多项式的根具有特殊意义:
- 它们可以用来编码我们想要证明的信息
- 通过检查多项式在某点是否为0,我们可以验证某个条件是否成立
多项式的构建 - 拉格朗日插值法
在ZK中,我们经常需要为一个给定的点集寻找多项式,这个多项式经过点集中的所有点。
一般来说,我们会使用拉格朗日插值法来构建多项式。这是一种非常简单的方法。 构建过程分为两步:
- 构造基底多项式 对每个点 ,构造一个多项式 ,使得:
- 在 处值为1
- 在其他点处值为0
- 组合最终多项式 将每个基底多项式乘以对应的y值,然后相加:
如果你没看懂,或者不想看上面的公式,没关系,我们通过一些简单的例子来学习。
假设点集为:
x | y |
---|---|
1 | 2 |
2 | 3 |
3 | 8 |
4 | 4 |
- 构造基底多项式:
- 组合最终多项式:
我们仔细端详一下这几个基底多项式,我们可以很容易的发现,他们的目的都是在于构建一个在处值为1,在其他点处值为0的多项式。
可以看看下面的示例图,尝试看一下每个点的值。(你可以点击标签🏷️名称来隐藏当前多项式曲线)
基底多项式
很明显,上面的多项式在处值为1,在其他点处值为0。此时,我们获得了多个基底多项式。
那么如何获得一个能通过所有点的多项式呢?
我们只需要将每个基底多项式乘以对应的y值,然后相加(只看结果就行):
最终多项式
是不是很简单?总结一下来说就是两个步骤:
- 构建多个基础多项式,这个多项式就是让 处值为1,其他点为0
- 将所有的多项式相加起来,只要每个多项式在都遵守上面的条件,那么就可以通过每一个点。
注意,以上取值范围为自然数,所以可以绘制一个曲线,当我们取值范围在一个有限域或者乘法子群中时,无法绘制曲线,只能绘制离散的点。因为有限域中取值数量是固定的。并不是和自然数中一样,可以在小数点之间取值。
附加内容:多项式的因式分解
多项式的因式分解是将多项式表示为多个因式的乘积。比如:
多项式的因式分解有一个重要特点:如果一个数是多项式的根,那么这个多项式一定可以被 整除。
比如对于多项式 :
- 1 是根,所以可以被 整除
- -1 是根,所以可以被 整除
- 最终我们得到
根:当 时, 是多项式 的根
💡
在ZK证明中,这个性质经常被用来检查某个值是否为多项式的根:
- 如果 是根,那么 一定能整除这个多项式
- 如果不能整除,那么 一定不是根