知识库2 - 多项式 数学中的函数

多项式是什么?

多项式其实在写法上和方程非常相似

  • 多项式: f(x)=x2+2x+1f(x) = x^2 + 2x + 1
  • 方程: x2+2x+1=0x^2 + 2x + 1 = 0

他们之间微弱的差别在于,多项式是一个函数,而方程是一个等式。

说白了:

  • 多项式是一个函数,他的目的是求这个函数运算后的值。不包含等号
  • 方程是一个等式,他的目的是找到满足这个等式的解。包含等号

多项式的一些术语

  • 根(Root):多项式的根是让多项式等于0的那些x值。
  • 系数(Coefficient):多项式中每个项的数字因子。比如 x2+8x+1x^2 + 8x + 1 中,8就是x的线性项系数。
  • 次数(Degree):多项式中最高次项的次数。比如 x2+8x+1x^2 + 8x + 1 中,次数就是2。
  • 多项式插值:通过已知的多项式在某几个点的值,来推断多项式。
  • 评估(Evaluation):将一个值代入多项式,计算出多项式的值。
  • 评估域(Evaluation Domain):多项式的评估域是多项式可以被评估的区间。可以认为是x的取值数组。

多项式的根

多项式的根(也叫零点)是让多项式等于0的那些x值。比如:

对于多项式 f(x)=x21f(x) = x^2 - 1,它的根是 1 和 -1,因为:

  • f(1)=121=0f(1) = 1^2 - 1 = 0
  • f(1)=(1)21=0f(-1) = (-1)^2 - 1 = 0
💡

在ZK证明中,多项式的根具有特殊意义:

  • 它们可以用来编码我们想要证明的信息
  • 通过检查多项式在某点是否为0,我们可以验证某个条件是否成立

多项式的构建 - 拉格朗日插值法

在ZK中,我们经常需要为一个给定的点集寻找多项式,这个多项式经过点集中的所有点。

一般来说,我们会使用拉格朗日插值法来构建多项式。这是一种非常简单的方法。 构建过程分为两步:

  1. 构造基底多项式 对每个点 (xi,yi)(x_i,y_i),构造一个多项式 li(x)l_i(x),使得:
  • xix_i 处值为1
  • 在其他点处值为0
li(x)=jixxjxixjl_i(x) = \prod_{j \neq i} \frac{x - x_j}{x_i - x_j}
  1. 组合最终多项式 将每个基底多项式乘以对应的y值,然后相加:
f(x)=iyili(x)f(x) = \sum_{i} y_i \cdot l_i(x)

如果你没看懂,或者不想看上面的公式,没关系,我们通过一些简单的例子来学习。

假设点集为:

xy
12
23
38
44
  1. 构造基底多项式:
l1(x)=(x2)(x3)(x4)(12)(13)(14)l2(x)=(x1)(x3)(x4)(21)(23)(24)l3(x)=(x1)(x2)(x4)(31)(32)(34)l4(x)=(x1)(x2)(x3)(41)(42)(43)\begin{align*} l_1(x) &= \frac{(x-2)(x-3)(x-4)}{(1-2)(1-3)(1-4)} \\ l_2(x) &= \frac{(x-1)(x-3)(x-4)}{(2-1)(2-3)(2-4)} \\ l_3(x) &= \frac{(x-1)(x-2)(x-4)}{(3-1)(3-2)(3-4)} \\ l_4(x) &= \frac{(x-1)(x-2)(x-3)}{(4-1)(4-2)(4-3)} \end{align*}
  1. 组合最终多项式:
f(x)=2l1(x)+3l2(x)+8l3(x)+4l4(x)f(x) = 2l_1(x) + 3l_2(x) + 8l_3(x) + 4l_4(x)

我们仔细端详一下这几个基底多项式,我们可以很容易的发现,他们的目的都是在于构建一个在xix_i处值为1,在其他点处值为0的多项式
可以看看下面的示例图,尝试看一下每个点的值。(你可以点击标签🏷️名称来隐藏当前多项式曲线)

基底多项式

很明显,上面的多项式在xix_i处值为1,在其他点处值为0。此时,我们获得了多个基底多项式。

那么如何获得一个能通过所有点的多项式呢?

我们只需要将每个基底多项式乘以对应的y值,然后相加(只看结果就行):

f(x)=2l1(x)+3l2(x)+8l3(x)+4l4(x)=2(x2)(x3)(x4)(12)(13)(14)+3(x1)(x3)(x4)(21)(23)(24)+8(x1)(x2)(x4)(31)(32)(34)+4(x1)(x2)(x3)(41)(42)(43)=136x3+15x21736x+18\begin{align*} f(x) &= 2l_1(x) + 3l_2(x) + 8l_3(x) + 4l_4(x) \\ &= 2 \cdot \frac{(x-2)(x-3)(x-4)}{(1-2)(1-3)(1-4)} + 3 \cdot \frac{(x-1)(x-3)(x-4)}{(2-1)(2-3)(2-4)} + 8 \cdot \frac{(x-1)(x-2)(x-4)}{(3-1)(3-2)(3-4)} + 4 \cdot \frac{(x-1)(x-2)(x-3)}{(4-1)(4-2)(4-3)} \\ &= \frac{13}{6}x^3 + 15x^2 - \frac{173}{6}x + 18 \end{align*}
最终多项式

是不是很简单?总结一下来说就是两个步骤:

  1. 构建多个基础多项式,这个多项式就是xix_i 处值为1,其他点为0
  2. 将所有的多项式相加起来,只要每个多项式在都遵守上面的条件,那么就可以通过每一个点。

注意,以上取值范围为自然数,所以可以绘制一个曲线,当我们取值范围在一个有限域或者乘法子群中时,无法绘制曲线,只能绘制离散的点。因为有限域中取值数量是固定的。并不是和自然数中一样,可以在小数点之间取值。

附加内容:多项式的因式分解

多项式的因式分解是将多项式表示为多个因式的乘积。比如:

x21=(x+1)(x1)x^2 - 1 = (x+1)(x-1)

多项式的因式分解有一个重要特点:如果一个数是多项式的根,那么这个多项式一定可以被 (xa)(x-a) 整除

比如对于多项式 f(x)=x21f(x) = x^2 - 1

  • 1 是根,所以可以被 (x1)(x-1) 整除
  • -1 是根,所以可以被 (x+1)(x+1) 整除
  • 最终我们得到 x21=(x+1)(x1)x^2 - 1 = (x+1)(x-1)

根:当 f(a)=0f(a) = 0 时,aa 是多项式 f(x)f(x) 的根

💡

在ZK证明中,这个性质经常被用来检查某个值是否为多项式的根:

  • 如果 aa 是根,那么 (xa)(x-a) 一定能整除这个多项式
  • 如果不能整除,那么 aa 一定不是根