Updated 实现ML‐DSA所需的多项式和线性代数知识 (markdown)

Sun Yimin 2025-04-30 09:01:53 +00:00
parent 1fdb195900
commit 74047a33be

@ -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中你永远不会直接乘以环元素。