【Applied Algebra】扩域(Galois域)上的计算及其实现

扩域上(Galois域)的计算及其实现

【Applied Algebra】扩域(Galois域)上的计算及其实现_第1张图片


有限域 F F F 的特征为素数 p p p; 它可以视作素域 Z p \mathbb{Z}_p Zp 上的 n ( n < ∞ ) n(n<\infty) n(n<) 维线性空间, 从而 ∣ F ∣ = p n |F|=p^n F=pn; F F F 的加法群可视作 n n n p p p 阶循环群的直和; 其乘法群是 p n − 1 p^n-1 pn1 阶循环群, 从而 F F F Z p \mathbb{Z}_p Zp 的单扩域 Z p ( u ) \mathbb{Z}_p(u) Zp(u), 其中 u u u Z p \mathbb{Z}_p Zp 上的 n n n 次代数元; F F F 恰是多项式 x p n − x ∈ Z p [ x ] x^{p^n}-x \in \mathbb{Z}_p[x] xpnxZp[x] p n p^n pn 个根作成的集合, 又恰为 x p n − x ∈ Z p [ x ] x^{p^n}-x \in \mathbb{Z}_p[x] xpnxZp[x] Z p \mathbb{Z}_p Zp 上的分裂域; 从而 p n p^n pn 元域总存在, 且在同构意义下唯一. p n p^n pn 元域 F F F 的自同构群恰为 Galois 群 Gal ⁡ ( F / Z p ) \operatorname{Gal}\left(F / \mathbb{Z}_p\right) Gal(F/Zp) : 它是由 Frobenius 自同构 a ↦ a p a \mapsto a^p aap 生成的 n n n 阶循环群.虽然这样的域在近世代数的学习中已然是老生常谈,但是今天我们会给出它的c++计算实现.

扩域上的计算

密码学中通常会考虑 F 2 \mathbb{F}_{2} F2上及对应多项式环上的计算,这是由计算机的二进制基础决定的,但是随着加密解密方法的进展,很多加密协议及分析中会考虑很多扩域的计算,在本文中我们希望能实现 F p n \mathbb{F}_{p^n} Fpn上的计算.

:假设计算 F 2 4 \mathbb{F}_{2^4} F24上的元素,根据 F 2 4 ≅ F 2 / f ( x ) \mathbb{F}_{2^4} \cong \mathbb{F}_{2}/f(x) F24F2/f(x),这里设 f ( x ) = x 4 + x 3 + 1 f(x) = x^4+x^3+1 f(x)=x4+x3+1为不可约多项式; F 2 4 \mathbb{F}_{2^4} F24中洽有 16 16 16个元素吗, F 2 / f ( x ) \mathbb{F}_{2}/f(x) F2/f(x)中的元素可以表示为小于 4 4 4次的多项式,根据每一项出现与否( { x 3 , x 2 , x , 1 } \{x^3,x^2,x,1\} {x3,x2,x,1})也恰有16个多项式,那么和 F 2 4 \mathbb{F}_{2^4} F24中的元素一一对应,因此 F 2 4 \mathbb{F}_{2^4} F24亦可表示为:

F 2 4 = { 0000 , 0001 , . . . , 1111 } \mathbb{F}_{2^4} = \{0000,0001,...,1111\} F24={0000,0001,...,1111}

我们的程序设计要用到我之前博客提到的GiNaC库,一个C++符号计算库,首先我们设计扩域和扩域元素的数据结构:

struct extension_field
{
    int PRIME_NUM;
    int EXTEN_NUM;
    GiNaC::ex IRRED_POLY;
};

class extension_field_element
{
public:
    extension_field* pt_EXT_FIELD;
    int ELEMENT_INDEX;
    string SYMBOL;
    GiNaC::ex POLYNOMIAL;
    extension_field_element(extension_field* pt_EXT_FIELD,const GiNaC::ex& POLYNOMIAL);
    extension_field_element operator+(const extension_field_element& EXT_FIELD_ELE_OPS) const;
    extension_field_element operator*(const extension_field_element& EXT_FIELD_ELE_OPS) const;
};

扩域中元素的加法和乘法简单说就是取模的加法乘法,下面看算例:仍考虑计算 F 2 4 \mathbb{F}_{2^4} F24上的元素,根据 F 2 4 ≅ F 2 / f ( x ) \mathbb{F}_{2^4} \cong \mathbb{F}_{2}/f(x) F24F2/f(x),这里设 f ( x ) = x 4 + x 3 + 1 f(x) = x^4+x^3+1 f(x)=x4+x3+1为我们选取的不可约多项式(要求选取的不可约多项式是本原多项式,至于怎么找本原多项式这里不赘述,请参考[2]);那么取:

( x 3 + x 2 + 1 ) = f 1 ( x ) , ( x 3 + x + 1 ) = f 2 ( x ) (x^3+x^2+1)=f_1(x),(x^3+x+1)=f_2(x) (x3+x2+1)=f1(x),(x3+x+1)=f2(x)

那么加法的实现 ( 2 = 0   m o d   2 ) (2=0 \bmod 2) (2=0mod2):

f 1 ( x ) + f 2 ( x ) = ( x 3 + x 2 + 1 ) + ( x 3 + x + 1 ) = 2 x 3 + x 2 + x + 2 = x 2 + x \begin{aligned} & f_1(x)+f_2(x) \\ = &(x^3+x^2+1)+(x^3+x+1) \\ = & 2 x^3+x^2+x+2=x^2+x \end{aligned} ==f1(x)+f2(x)(x3+x2+1)+(x3+x+1)2x3+x2+x+2=x2+x

乘法的实现:
f 1 ( x ) ⋅ f 2 ( x ) = ( x 3 + x 2 + 1 ) ( x 3 + x + 1 ) = x 6 + x 5 + x 4 + x 3 + x 3 + x 3 + x 2 + x + 1 = x 6 + x 5 + x 4 + x 3 + x 2 + x + 1 \begin{aligned} f_1(x) \cdot f_2(x) & =(x^3+x^2+1)(x^3+x+1) \\ & =x^6+x^5+x^4+x^3+x^3+x^3+x^2+x+1 \\ & =x^6+x^5+x^4+x^3+x^2+x+1 \end{aligned} f1(x)f2(x)=(x3+x2+1)(x3+x+1)=x6+x5+x4+x3+x3+x3+x2+x+1=x6+x5+x4+x3+x2+x+1

又由 f ( x ) = x 4 + x 3 + 1 f(x)=x^4+x^3+1 f(x)=x4+x3+1,那么消去 x 6 x^6 x6也就是 x 6 = x 2 ⋅ f ( x ) − x 5 − x 2 x^6=x^2 \cdot f(x)-x^5-x^2 x6=x2f(x)x5x2得:

f 1 ( x ) ⋅ f 2 ( x ) = x 2 ⋅ f ( x ) + f ( x ) + x ≡ x   m o d   f ( x ) f_1(x) \cdot f_2(x) = x^2 \cdot f(x)+f(x)+x \equiv x \bmod f(x) f1(x)f2(x)=x2f(x)+f(x)+xxmodf(x)

因而得到 F 2 4 \mathbb{F}_{2^4} F24 f 1 ( x ) ⋅ f 2 ( x ) = x f_1(x) \cdot f_2(x) = x f1(x)f2(x)=x;在计算过程中我们会用到模不可约多项式 f ( x ) f(x) f(x)也就是拟除 f ( x ) f(x) f(x)的过程,以下是拟除的实现方法,其中包含了多项式系数模 p p p的函数(略):

GiNaC::ex pseudo_divide(const GiNaC::ex& POLYNOMIAL, const GiNaC::ex& POLYNOMIAL_DIV, const int& PRIME_NUM)
{
    GiNaC::ex POLYNOMIAL_RES = POLYNOMIAL;
    int DIS_DEG;GiNaC::ex COEFF_LEAD;
    while(POLYNOMIAL_RES.degree(a)>=POLYNOMIAL_DIV.degree(a))
    {
        DIS_DEG = POLYNOMIAL_RES.degree(a) - POLYNOMIAL_DIV.degree(a);
        COEFF_LEAD = POLYNOMIAL_RES.coeff(a,POLYNOMIAL_RES.degree(a));
        POLYNOMIAL_RES = coeff_mod(POLYNOMIAL_RES - (COEFF_LEAD*POLYNOMIAL_DIV*GiNaC::pow(a, DIS_DEG)).expand(), PRIME_NUM);
    }
    return POLYNOMIAL_RES;
}

扩域上的加法很简单,在此亦不赘述,下面是乘法的实现:

extension_field_element extension_field_element::operator*(const extension_field_element& EXT_FIELD_ELE_OPS) const
{
    GiNaC::ex POLYNOMIAL_RES=0;
    extension_field_element EXT_FIELD_ELE_RES(this->pt_EXT_FIELD,POLYNOMIAL_RES);
    if(this->pt_EXT_FIELD != EXT_FIELD_ELE_OPS.pt_EXT_FIELD){return EXT_FIELD_ELE_RES;}
    EXT_FIELD_ELE_RES.POLYNOMIAL = pseudo_divide((this->POLYNOMIAL*EXT_FIELD_ELE_OPS.POLYNOMIAL).expand(),this->pt_EXT_FIELD->IRRED_POLY,this->pt_EXT_FIELD->PRIME_NUM);
    return EXT_FIELD_ELE_RES;
}

扩域上的多项式环

假设考虑 F p n \mathbb{F}_{p^n} Fpn上的元素,根据 F p n ≅ F p / f ( x ) \mathbb{F}_{p^n} \cong \mathbb{F}_{p}/f(x) FpnFp/f(x),这里设 f ( x ) f(x) f(x)是一模 p p p n n n阶不可约多项式;现在考虑多项式环 F p n [ x 1 , ⋯   , x m ] \mathbb{F}_{p^n}[x_1,\cdots,x_m] Fpn[x1,,xm]的计算,其中的多项式 g ( x ) g(x) g(x)形如:

g ( x ) ∈ { ∑ i f i M i ∣ f i ∈ F p / f ( x ) , M i = x 1 α i . . . x n α n } g(x) \in \{\sum_i f_{i}M_i |f_i \in \mathbb{F}_{p}/f(x),M_i = x^{\alpha_i}_1...x^{\alpha_n}_n\} g(x){ifiMifiFp/f(x),Mi=x1αi...xnαn}

事实上若限定 x j x_j xj的取值也在 F p / f ( x ) \mathbb{F}_{p}/f(x) Fp/f(x)上面,是小于 n n n阶的含 x x x的模 p p p多项式;我们现在考虑有没有什么规则可以利用来化简 M i M_i Mi来防止阶数爆炸;

事实上, x j x_j xj作为 F p n \mathbb{F}_{p^n} Fpn上的元素, F p n ∖ 0 \mathbb{F}_{p^n}\setminus 0 Fpn0构成一个 p n − 1 p^n-1 pn1阶循环群,其阶只可能是 p n − 1 p^n-1 pn1的因数(例: F 3 2 \mathbb{F}_{3^2} F32上的元素的阶只可能是 1 , 2 , 4 , 8 1,2,4,8 1,2,4,8),综上所述,只能断言 x j p n = x j x^{p^n}_j=x_j xjpn=xj.下面我们用程序 F 3 4 \mathbb{F}_{3^4} F34中某元素 g g g的阶 = 8 =8 =8,是 3 4 − 1 = 80 3^4-1=80 341=80的因数:

g^1 = 1+a+2*a^2
g^2 = 2*a+a^2
g^3 = 1+2*a+a^2
g^4 = 2
g^5 = 2+2*a+4*a^2
g^6 = a+2*a^2
g^7 = 2+a+2*a^2
g^8 = 1
g^9 = 1+a+2*a^2

一个额外的思考():若我们需要求解多项式环 F p n [ x 1 , ⋯   , x m ] \mathbb{F}_{p^n}[x_1,\cdots,x_m] Fpn[x1,,xm]上的方程组,那么带着系数算来算去复杂度太高,不由得想到了动态规划,也就是先计算 F p n \mathbb{F}_{p^n} Fpn上的加法乘法表 T \mathcal{T} T,则我们可以查表得到 T ( g i , g j , + ) = g k \mathcal{T}(g_i,g_j,+)=g_k T(gi,gj,+)=gk T ( g i , g j , × ) = g l \mathcal{T}(g_i,g_j,\times)=g_l T(gi,gj,×)=gl来获得加法乘法结果,那多项式环 F p n [ x 1 , ⋯   , x m ] \mathbb{F}_{p^n}[x_1,\cdots,x_m] Fpn[x1,,xm]的多项式 g ( x ) g(x) g(x)形如:

g ( x ) ∈ { ∑ i g i M i ∣ g i ∈ F p n , M i = x 1 α i . . . x n α n } g(x) \in \{\sum_i g_{i}M_i |g_i \in \mathbb{F}_{p^n},M_i = x^{\alpha_i}_1...x^{\alpha_n}_n\} g(x){igiMigiFpn,Mi=x1αi...xnαn}

计算一下子从多项式计算简化为纯符号计算,此时系数是纯符号的,我们只需要专心处理变元的计算结果即可,这也是下一步程序设计的工作.


参考资料

[1] Modern abstract algebra, Anderson, M. and Feil, T.,2014.
[2] 应用近世代数(第三版),胡冠章,清华大学出版社.

你可能感兴趣的:(代数,C/C++,算法)