diff --git a/实现ML‐DSA所需的多项式和线性代数知识.md b/实现ML‐DSA所需的多项式和线性代数知识.md index 0caee45..3cc16f5 100644 --- a/实现ML‐DSA所需的多项式和线性代数知识.md +++ b/实现ML‐DSA所需的多项式和线性代数知识.md @@ -1,3 +1,19 @@ 大部分和[实现Kyber所需的多项式和线性代数知识](https://github.com/emmansun/gmsm/wiki/%E5%AE%9E%E7%8E%B0Kyber%E6%89%80%E9%9C%80%E7%9A%84%E5%A4%9A%E9%A1%B9%E5%BC%8F%E5%92%8C%E7%BA%BF%E6%80%A7%E4%BB%A3%E6%95%B0%E7%9F%A5%E8%AF%86)类似。 -## 多项式 +# 多项式 +一个多项式是环 $R_q$ 的一个元素[[3](#user-content-anchor-ref3)],看起来像这样: + +$$f = f_0 + f_1 X + f_2 X^2 + \cdots + f_{255} X^{255}$$ + +但你甚至不需要知道这些。对你作为一个实施者来说,一个ML-DSA多项式就是一个有256个系数的数组。每个系数都是一个整数模 $q$,其中 $q = 8380417= 2^23 - 2^13 + 1$。一个系数数组被称为在 $\mathbb{Z}_q^{256}$ 中,因为它由 256 个系数组成,每个系数都在 $\mathbb{Z}_q$,即整数模 $q$。 + +$$f_0 + f_1X + f_2X^2 + \cdots + f_{255}X^{255} \in R_q$$ + +$$ \downarrow $$ +```math +(f_0, f_1, f_2, ..., f_{255}) \in \mathbb{Z}_q^{256} +``` + +每个系数都适合放在一个`uint32`中,所以你可以为多项式编写一个类型,比如`[256]uint32`。 + +要加或减两个多项式(或者环元素),你需要逐个系数地进行( $c[0] = a[0] + b[0]$ ,以此类推)。在ML-DSA中,你永远不会直接乘以环元素。 \ No newline at end of file