# 後量子密碼學05 多項式環 II
為了講解真正有用的晶格密碼學,我們需要先了解「多項式環」與「多項式商環」。不過不用緊張,他跟我們之前看到的整數商環非常類似!我們今天來討論「多項式商環」
## 多項式除法
相信各位在中學時就有學過所謂的多項式除法:給定兩個多項式 $f(x)$ 與 $g(x)$ 請找到 $q(x)$ 與 $r(x)$ 滿足
\begin{align}
f(x) = q(x)g(x)+r(x)
\end{align}
其中 $r(x)$ 如果等於零,我們說 $g(x)$ 整除 $f(x)$ ,如果 $r(x)$ 不等於零,那我們稱 $r(x)$ 為餘式,其次數應該要比 $g(x)$ 的次數小。
我們可以看以下舉例:
第一個例子:
給定多項式 $f(x) = 2x^3 + 4x^2 - 6x$ 和 $g(x) = x - 1$,我們可以進行多項式除法,找到 $q(x)$ 與 $r(x)$,使得:
\begin{align}
f(x) = q(x)g(x) + r(x)
\end{align}
而答案為:
\begin{align}
q(x) = 2x^{2} +6x, \quad r(x) = 0
\end{align}
因為餘式等於零,所以這裡 $g(x)$ 整除 $f(x)$
另一個例子:
給定多項式 $f(x) = x^3 + 2x + 1$ 和 $g(x) = x - 1$,我們進行多項式除法,找到 $q(x)$ 與 $r(x)$,使得:
\begin{align}
f(x) = q(x)g(x) + r(x)
\end{align}
而答案為:
\begin{align}
q(x) = x^{2} + x + 3,\quad r(x) = 4
\end{align}
在這裡,餘式 $r(x) = 4$,這表示 $g(x)$ 不整
除 $f(x)$。
## 多項式商環(多項式的模算數)
讓我們回憶以前學習過的
\begin{align}
\mathbb{Z}/q\mathbb{Z} = \{ 0,1,2,\dots,q-1 \}.
\end{align}
這個環裡面的算數,其實就是取數字除以 $q$ 的餘數。我們可以借用同樣的想法來定義多項式的模算數。固定一個 $g(x)$ ,考慮以下模除 $g(x)$ 的運算
首先是模化約:
\begin{align}
f(x) \quad \mathrm{mod} \ g(x) = r(x)
\end{align}
得到的是多項式 $f(x)$ 除以 $g(x)$ 所得到的餘式 $r(x)$
再來是模加法:
\begin{align}
f_{1}(x)+f_{2}(x) \quad \mathrm{mod} \ g(x)
\end{align}
得到的是兩個多項式的和除以 $g(x)$ 所得到的餘式
最後是模乘法:
\begin{align}
f_{1}(x)\times f_{2}(x) \quad \mathrm{mod} \ g(x)
\end{align}
得到的是兩個多項式的積除以 $g(x)$ 所得到的餘式
好!模化約告訴我們,我們實際在考慮的集合其實是:
\begin{align}
\{
f(x):\mathrm{deg} (f(x))<\mathrm{deg} (g(x))
\}
\end{align}
因為如果 $f(x)$ 的次數大於 $g(x)$ 的次數,則 $g(x)$ 可以再除 $f(x)$ 並得到更小的餘式 $r(x)$ ,這個更小的餘式在模運算下與原本的 $f(x)$ 視為同一個元素。
有了集合之後,搭配上剛剛的模加法與模乘法,三個部件湊齊,就可以構成一個環!這個環就叫做多項式商環。如果我們一開始所考慮的多項式環其係數是在整數 $Z$ 上,那我們符號上可以把這樣新的環記做
\begin{align}
\mathbb{Z}[x] / \langle g(x)\rangle
\end{align}
(又有新符號可以到處擺弄了😂
## 明天會用到的實際例子
各位還記得以下符號嗎?
\begin{align}
\mathbb{Z} / q\mathbb{Z} [x]
\end{align}
這個符號代表「係數在模除 $q$ 的整數環的多項式的集合」,有時我們會把它剪寫成右邊的樣子:
\begin{align}
\mathbb{Z} / q\mathbb{Z}[x] = \mathbb{Z}_{q }[x]
\end{align}
好節省紙張與墨水(?
在我們剛剛學到多項式模算數後,為了之後的晶格密碼學,需要研究以下這類的多項式商環:給定一個正整數 N,
\begin{align}
\mathbb{Z}_{q}[x] / \langle x^N-1\rangle.
\end{align}
舉例來說,我們會實際用到以下的多項式商環:
\begin{align}
\mathbb{Z}_{2048}[x] / \langle x^{677}-1\rangle,\quad
\mathbb{Z}_{4096}[x] / \langle x^{821}-1\rangle.
\end{align}
## 使用 SageMath 實作
我們考慮:
\begin{align}
\mathbb{Z}_{17}[x] / \langle x^4-1 \rangle
\end{align}
先在 SageMath 中定義這樣的類別:
```python=+
# 定義係數環 Z/17Z
R_q = quotient(ZZ, 17*ZZ)
# 定義多項式環 Z/17Z[x]
R_q_poly = PolynomialRing(R_q,x)
# 定義多項式商環 Z/17Z[x] / (x^4 - 1)
R_q_poly_quotient = quotient(R_q_poly, x^4-1)
print(R_q)
print(R_q_poly)
print(R_q_poly_quotient)
# Outputs:
# Ring of integers modulo 17
# Univariate Polynomial Ring in x over Ring of integers modulo 17
# Univariate Quotient Polynomial Ring in xbar over Ring of integers modulo 17 with modulus x^4 + 16
```
你可以注意到,我們明明在最後模除 $x^4 - 1$ ,但他輸出 modulus $x^4 + 16$ 。這是因為 $-1$ 在係數環 $Z_17$ 中應該是 $16$ 。
模化約:
```python=+
f = R_q_poly([6, 8, 14, 1, 12, 12])
print(f)
# 模化約,把原本的 f 化約到 Z/17Z[x] / (x^4 - 1) 集合內
f = R_q_poly_quotient(f)
print(f)
# Outputs:
# 12*x^5 + 12*x^4 + x^3 + 14*x^2 + 8*x + 6
# xbar^3 + 14*xbar^2 + 3*xbar + 1
```
首先先找一個在「係數模除 $q$ 的多項式環」裡的元素,這裡選擇一個六次的
\begin{align}
f(x) = 6 + 8x + 14x^{2} + x^{3} + 12x^{4} + 12x^{5} \in \mathbb{Z}_{17}[x]
\end{align}
接著取 $f(x)$ 除以 $x^4 - 1$ 的餘式,得到
\begin{align}
f(x) = 1 + 3x+14x^{2} + x^{3} \in \mathbb{Z}_{17} [x] / \langle x^4 - 1\rangle
\end{align}
你可以看見 SageMath 最後的輸出是使用 xbar 而非 $x$ ,原因是 SageMath 認為有模除與沒模除是兩個不同的環,因此要用不同的變數來區分。
接著,模加法與模乘法就很簡單可以執行
模加法:
```python=+
# 定義多項式
f1 = R_q_poly_quotient([6, 7, 14, 2])
f2 = R_q_poly_quotient([3, 9, 12, 7])
print(f1)
print(f2, "\n")
# 模加法
add_result = f1 + f2
print(add_result)
# Outputs:
# 2*xbar^3 + 14*xbar^2 + 7*xbar + 6
# 7*xbar^3 + 12*xbar^2 + 9*xbar + 3
# 9*xbar^3 + 9*xbar^2 + 16*xbar + 9
```
模乘法:
```python=+
# 定義多項式
f1 = R_q_poly([6, 7, 14, 2])
f2 = R_q_poly([3, 9, 12, 7])
print(f1)
print(f2, "\n")
print("正常的模除 q 係數多項式乘法結果為:", f1*f2, "\n")
# 先將 f 與 g 模化約(為了把 f 與 g 弄到對的類別)
f1 = R_q_poly_quotient(f1)
f2 = R_q_poly_quotient(f2)
# 模乘法
mul_result = f1 * f2
print("模除 q 也模除 x^4 - 1 的乘法結果為:", mul_result)
# Outputs:
# 2*x^3 + 14*x^2 + 7*x + 6
# 7*x^3 + 12*x^2 + 9*x + 3
# 正常的模除 q 係數多項式乘法結果為: 14*x^6 + 3*x^5 + 14*x^4 + 3*x^3 + 7*x^2 + 7*x + 1
# 模除 q 也模除 x^4 - 1 的乘法結果為: 3*xbar^3 + 4*xbar^2 + 10*xbar + 15
```
(練習)你可以試試看以下的環如何在 SageMath 中定義:
\begin{align}
\mathbb{Z}_{2048}[x] / \langle x^{677}-1\rangle,\quad
\mathbb{Z}_{4096}[x] / \langle x^{821}-1\rangle.
\end{align}
## 乘法反元素:
我們在介紹二維晶格密碼學前,有先介紹在 $Z/qZ$ 中的乘法反元素。現在我們也可以在多項式模算數(多項式商環)裡考慮一樣的概念:
繼續使用以上舉例的數字,給定多項式 $f(x)$ 你可不可以找到 $g(x)$ 滿足
\begin{align}
f(x) \times g(x) =1 \quad \text{ in }\quad \mathbb{Z}_{17}[x] /\langle x^4-1 \rangle
\end{align}
那情況與之前都很類似,你可以使用多項式的擴展歐幾里得演算法(多項式的輾轉相除法)來計算這個乘法反元素。但是 SageMath 已經幫我們做好所有功能:
```python=+
f = R_q_poly_quotient([8, 2, 3, 7])
g = f^(-1)
print(f)
print(g)
print(f*g)
# Outputs:
# 7*xbar^3 + 3*xbar^2 + 2*xbar + 8
# 6*xbar^3 + 2*xbar^2 + xbar + 14
# 1
```
好的,我們已經準備好,明天來介紹真正有用的「吾乃數論學家」晶格密碼系統!