【Applied Algebra】扩域(Galois域)上的乘加法表构造

news2024/11/15 23:44:48

【Applied Algebra】扩域(Galois域)上的乘法表构造

在这里插入图片描述


在之前的文章里,我们讨论了扩域上(Galois域)的计算及其实现,但是侧重的是扩域中元素之间运算的细节实现,而如果想描述整个域的结构,就需要构造乘法表和加法表;实现仍然是基于c++和符号计算库GiNaC;

运算表及其设计

考虑 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 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}

更一般地,我们设 F p n \mathbb{F}_{p^n} Fpn形如 F p n = { g 1 , g 2 , ⋯   , g N } \mathbb{F}_{p^n} = \{g_1,g_2,\cdots,g_N\} Fpn={g1,g2,,gN},其中 N N N是域的阶.那么 F p n \mathbb{F}_{p^n} Fpn中任何元素 g i g_i gi都可看作 n n n p p p进制数字串,它的每一位若一一对应地看作 { x n − 1 , . . . , x 2 , x , 1 } \{x^{n-1},...,x^2,x,1\} {xn1,...,x2,x,1}的系数,那么就和多项式环 F p / f ( x ) \mathbb{F}_{p}/f(x) Fp/f(x)中的元素一一对应了.

综上所述,乘法表或者加法表的构造就是,利用扩域 F p n \mathbb{F}_{p^n} Fpn和多项式环 F p / f ( x ) \mathbb{F}_{p}/f(x) Fp/f(x)中元素的一一对应,通过多项式环 F p / f ( x ) \mathbb{F}_{p}/f(x) Fp/f(x)中的元素的运算结果来对应还原扩域 F p n \mathbb{F}_{p^n} Fpn的结构,我们首先设计一个类来抽象扩域 F p n \mathbb{F}_{p^n} Fpn:

class extension_field_class
{
public:
    extension_field* pt_EXT_FIELD;
    GiNaC::ex IRRED_POLY;
    int ORDER_NUM;
    std::vector<extension_field_element> ELEMENTS_SET;
    GiNaC::exmap TAB_POLY2INDEX;
    std::map<extension_field_element, int> TAB_ELEMENT2INDEX;
    std::vector<std::vector<int> > TAB_MULTI;
    std::vector<std::vector<int> > TAB_DIV;
    std::vector<std::vector<int> > TAB_ADD;
    std::vector<std::vector<int> > TAB_SUB;
    extension_field_class(extension_field* pt_EXT_FIELD,const GiNaC::ex& IRRED_POLY);
    extension_field_element multi_computing(const extension_field_element& ELEMENT_1,const extension_field_element& ELEMENT_2);
    extension_field_element add_computing(const extension_field_element& ELEMENT_1,const extension_field_element& ELEMENT_2);
    extension_field_element div_computing(const extension_field_element& ELEMENT_1,const extension_field_element& ELEMENT_2);
    extension_field_element sub_computing(const extension_field_element& ELEMENT_1,const extension_field_element& ELEMENT_2);
    void print_multi_tab();
};

其中 TAB_MULTI 和 TAB_ADD 就通过域元素的序号存储了对应两个元素的乘法和加法运算结果.

运算表及其实现

我们在上一节里构造了扩域元素的类 extension_field_element,因此实现运算表构造的功能就是基于我们之前弄的乘法和加法运算符,但在明确任意两个元素相乘的结果之前,我们首先要构造所有的域元素,这是之前没有实现的功能:

// --------- Constructing ELEMENTS_SET; ---------
    std::vector<int> COEFF_VEC;std::vector<GiNaC::ex> MONOMIALS;
    for (int INDEX_j = 0; INDEX_j < this->pt_EXT_FIELD->EXTEN_NUM; ++INDEX_j){COEFF_VEC.push_back(0);}
    for (int INDEX_j = 0; INDEX_j < this->pt_EXT_FIELD->EXTEN_NUM; ++INDEX_j)
    {
        GiNaC::ex MONOMIAL = 1;
        if (INDEX_j==0){MONOMIALS.push_back(MONOMIAL);continue;}
        for (int INDEX_k = 1; INDEX_k <= INDEX_j; ++INDEX_k){MONOMIAL*=a;}
        MONOMIALS.push_back(MONOMIAL);
    }
    for (int INDEX_i = 1; INDEX_i < this->ORDER_NUM; ++INDEX_i)
    {
        GiNaC::ex POLYNOMIAL = 0;
        func_decimal_conv(INDEX_i,this->pt_EXT_FIELD->PRIME_NUM,this->pt_EXT_FIELD->EXTEN_NUM,COEFF_VEC);
        for (int INDEX_j = 0; INDEX_j < this->pt_EXT_FIELD->EXTEN_NUM; ++INDEX_j)
        {
            POLYNOMIAL += COEFF_VEC[INDEX_j]*MONOMIALS[INDEX_j];
        }
        extension_field_element EXT_FIELD_ELE(this->pt_EXT_FIELD,POLYNOMIAL);
        EXT_FIELD_ELE.ELEMENT_INDEX = INDEX_i-1;
        this->ELEMENTS_SET.push_back(EXT_FIELD_ELE);
        this->TAB_POLY2INDEX[POLYNOMIAL] = EXT_FIELD_ELE.ELEMENT_INDEX;
        this->TAB_ELEMENT2INDEX[EXT_FIELD_ELE] = EXT_FIELD_ELE.ELEMENT_INDEX;
    }

其中 TAB_POLY2INDEX 和 TAB_ELEMENT2INDEX 可以帮助我们以线性复杂度 O ( 1 ) O(1) O(1)根据多项式或域元素类定位该元素的下标,这有利于后续算法的效率,注意 TAB_ELEMENT2INDEX 是map类型,当extension_field_element作为key的时候,需要实现它的"大小比较功能"(这是由于map是基于红黑树实现的),在此不加赘述.构造完所有元素之后,即可来构造乘法表和加法表:

// --------- Constructing TAB_MULTI and TAB_DIV; ---------
    std::vector<std::vector<int> > TAB_NEW = init_all_tab(this->ORDER_NUM-1);
    this->TAB_MULTI = TAB_NEW;this->TAB_ADD = TAB_NEW;this->TAB_DIV = TAB_NEW;this->TAB_SUB = TAB_NEW;
    for (int INDEX_i = 0; INDEX_i < this->ORDER_NUM-1; ++INDEX_i)
    {
        for (int INDEX_j = 0; INDEX_j <= INDEX_i; ++INDEX_j)
        {
            GiNaC::ex POLYNOMIAL = (this->ELEMENTS_SET[INDEX_i]*this->ELEMENTS_SET[INDEX_j]).POLYNOMIAL;
            this->TAB_MULTI[INDEX_i][INDEX_j] = GiNaC::ex_to<GiNaC::numeric>(this->TAB_POLY2INDEX[POLYNOMIAL]).to_int();
            this->TAB_MULTI[INDEX_j][INDEX_i] = GiNaC::ex_to<GiNaC::numeric>(this->TAB_POLY2INDEX[POLYNOMIAL]).to_int();
            this->TAB_DIV[ TAB_MULTI[INDEX_j][INDEX_i] ][INDEX_i] = INDEX_j;
            this->TAB_DIV[ TAB_MULTI[INDEX_j][INDEX_i] ][INDEX_j] = INDEX_i;
        }
    }
    // --------- Constructing TAB_ADD; ---------
    for (int INDEX_i = 0; INDEX_i < this->ORDER_NUM-1; ++INDEX_i)
    {
        for (int INDEX_j = 0; INDEX_j <= INDEX_i; ++INDEX_j)
        {
            GiNaC::ex POLYNOMIAL = (this->ELEMENTS_SET[INDEX_i] + this->ELEMENTS_SET[INDEX_j]).POLYNOMIAL;
            this->TAB_ADD[INDEX_i][INDEX_j] = GiNaC::ex_to<GiNaC::numeric>(this->TAB_POLY2INDEX[POLYNOMIAL]).to_int();
            this->TAB_ADD[INDEX_j][INDEX_i] = GiNaC::ex_to<GiNaC::numeric>(this->TAB_POLY2INDEX[POLYNOMIAL]).to_int();
        }
    }

这里顺带构造了除法表,减法表有点特殊,思考一下为什么(提示:涉及到特殊元素 0 0 0).

通过这样的功能实现,我们可以打印任意扩域 F p n \mathbb{F}_{p^n} Fpn的运算表,在这里我们尝试构造扩域 F 3 3 \mathbb{F}_{3^3} F33的乘法表:

GiNaC::ex IRRED_POLY = a*a*a + 2*a*a + 1;
struct extension_field EXT_FIELD;
EXT_FIELD.PRIME_NUM = 3;EXT_FIELD.EXTEN_NUM = 3;EXT_FIELD.IRRED_POLY = IRRED_POLY;
extension_field_class EXT_FIELD_CLASS(&EXT_FIELD,IRRED_POLY);
EXT_FIELD_CLASS.print_multi_tab();

结果如下:

 ====================== Multiplication Table of GF(3^3) ======================
*    | g_0  |g_1  |g_2  |g_3  |g_4  |g_5  |g_6  |g_7  |g_8  |g_9  |g_10 |g_11 |g_12 |g_13 |g_14 |g_15 |g_16 |g_17 |g_18 |g_19 |g_20 |g_21 |g_22 |g_23 |g_24 |g_25 |
g_0  | g_0   g_1   g_2   g_3   g_4   g_5   g_6   g_7   g_8   g_9   g_10  g_11  g_12  g_13  g_14  g_15  g_16  g_17  g_18  g_19  g_20  g_21  g_22  g_23  g_24  g_25  
g_1  | g_1   g_0   g_5   g_7   g_6   g_2   g_4   g_3   g_17  g_19  g_18  g_23  g_25  g_24  g_20  g_22  g_21  g_8   g_10  g_9   g_14  g_16  g_15  g_11  g_13  g_12  
g_2  | g_2   g_5   g_8   g_11  g_14  g_17  g_20  g_23  g_10  g_13  g_16  g_19  g_22  g_25  g_1   g_4   g_7   g_18  g_21  g_24  g_0   g_3   g_6   g_9   g_12  g_15  
g_3  | g_3   g_7   g_11  g_15  g_10  g_23  g_18  g_22  g_19  g_20  g_24  g_4   g_5   g_0   g_16  g_8   g_12  g_9   g_13  g_14  g_21  g_25  g_17  g_6   g_1   g_2   
g_4  | g_4   g_6   g_14  g_10  g_12  g_20  g_25  g_18  g_1   g_3   g_5   g_16  g_9   g_11  g_22  g_24  g_17  g_0   g_2   g_7   g_15  g_8   g_13  g_21  g_23  g_19  
g_5  | g_5   g_2   g_17  g_23  g_20  g_8   g_14  g_11  g_18  g_24  g_21  g_9   g_15  g_12  g_0   g_6   g_3   g_10  g_16  g_13  g_1   g_7   g_4   g_19  g_25  g_22  
g_6  | g_6   g_4   g_20  g_18  g_25  g_14  g_12  g_10  g_0   g_7   g_2   g_21  g_19  g_23  g_15  g_13  g_8   g_1   g_5   g_3   g_22  g_17  g_24  g_16  g_11  g_9   
g_7  | g_7   g_3   g_23  g_22  g_18  g_11  g_10  g_15  g_9   g_14  g_13  g_6   g_2   g_1   g_21  g_17  g_25  g_19  g_24  g_20  g_16  g_12  g_8   g_4   g_0   g_5   
g_8  | g_8   g_17  g_10  g_19  g_1   g_18  g_0   g_9   g_16  g_25  g_7   g_24  g_6   g_15  g_5   g_14  g_23  g_21  g_3   g_12  g_2   g_11  g_20  g_13  g_22  g_4   
g_9  | g_9   g_19  g_13  g_20  g_3   g_24  g_7   g_14  g_25  g_5   g_15  g_0   g_10  g_17  g_11  g_21  g_4   g_12  g_22  g_2   g_23  g_6   g_16  g_1   g_8   g_18  
g_10 | g_10  g_18  g_16  g_24  g_5   g_21  g_2   g_13  g_7   g_15  g_23  g_12  g_20  g_4   g_17  g_1   g_9   g_3   g_11  g_22  g_8   g_19  g_0   g_25  g_6   g_14  
g_11 | g_11  g_23  g_19  g_4   g_16  g_9   g_21  g_6   g_24  g_0   g_12  g_14  g_17  g_2   g_7   g_10  g_22  g_13  g_25  g_1   g_3   g_15  g_18  g_20  g_5   g_8   
g_12 | g_12  g_25  g_22  g_5   g_9   g_15  g_19  g_2   g_6   g_10  g_20  g_17  g_3   g_16  g_13  g_23  g_0   g_4   g_14  g_18  g_24  g_1   g_11  g_8   g_21  g_7   
g_13 | g_13  g_24  g_25  g_0   g_11  g_12  g_23  g_1   g_15  g_17  g_4   g_2   g_16  g_18  g_19  g_3   g_14  g_22  g_6   g_8   g_9   g_20  g_7   g_5   g_10  g_21  
g_14 | g_14  g_20  g_1   g_16  g_22  g_0   g_15  g_21  g_5   g_11  g_17  g_7   g_13  g_19  g_6   g_12  g_18  g_2   g_8   g_23  g_4   g_10  g_25  g_3   g_9   g_24  
g_15 | g_15  g_22  g_4   g_8   g_24  g_6   g_13  g_17  g_14  g_21  g_1   g_10  g_23  g_3   g_12  g_19  g_5   g_20  g_0   g_16  g_25  g_2   g_9   g_18  g_7   g_11  
g_16 | g_16  g_21  g_7   g_12  g_17  g_3   g_8   g_25  g_23  g_4   g_9   g_22  g_0   g_14  g_18  g_5   g_13  g_11  g_19  g_6   g_10  g_24  g_2   g_15  g_20  g_1   
g_17 | g_17  g_8   g_18  g_9   g_0   g_10  g_1   g_19  g_21  g_12  g_3   g_13  g_4   g_22  g_2   g_20  g_11  g_16  g_7   g_25  g_5   g_23  g_14  g_24  g_15  g_6   
g_18 | g_18  g_10  g_21  g_13  g_2   g_16  g_5   g_24  g_3   g_22  g_11  g_25  g_14  g_6   g_8   g_0   g_19  g_7   g_23  g_15  g_17  g_9   g_1   g_12  g_4   g_20  
g_19 | g_19  g_9   g_24  g_14  g_7   g_13  g_3   g_20  g_12  g_2   g_22  g_1   g_18  g_8   g_23  g_16  g_6   g_25  g_15  g_5   g_11  g_4   g_21  g_0   g_17  g_10  
g_20 | g_20  g_14  g_0   g_21  g_15  g_1   g_22  g_16  g_2   g_23  g_8   g_3   g_24  g_9   g_4   g_25  g_10  g_5   g_17  g_11  g_6   g_18  g_12  g_7   g_19  g_13  
g_21 | g_21  g_16  g_3   g_25  g_8   g_7   g_17  g_12  g_11  g_6   g_19  g_15  g_1   g_20  g_10  g_2   g_24  g_23  g_9   g_4   g_18  g_13  g_5   g_22  g_14  g_0   
g_22 | g_22  g_15  g_6   g_17  g_13  g_4   g_24  g_8   g_20  g_16  g_0   g_18  g_11  g_7   g_25  g_9   g_2   g_14  g_1   g_21  g_12  g_5   g_19  g_10  g_3   g_23  
g_23 | g_23  g_11  g_9   g_6   g_21  g_19  g_16  g_4   g_13  g_1   g_25  g_20  g_8   g_5   g_3   g_18  g_15  g_24  g_12  g_0   g_7   g_22  g_10  g_14  g_2   g_17  
g_24 | g_24  g_13  g_12  g_1   g_23  g_25  g_11  g_0   g_22  g_8   g_6   g_5   g_21  g_10  g_9   g_7   g_20  g_15  g_4   g_17  g_19  g_14  g_3   g_2   g_18  g_16  
g_25 | g_25  g_12  g_15  g_2   g_19  g_22  g_9   g_5   g_4   g_18  g_14  g_8   g_7   g_21  g_24  g_11  g_1   g_6   g_20  g_10  g_13  g_0   g_23  g_17  g_16  g_3   


一个额外的思考(😉):仍然考虑多项式环 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}_{\times} T×,加法表 T + \mathcal{T}_{+} T+,除法表 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乃至 T ( g i , g j , / ) = g h \mathcal{T}(g_i,g_j,/)=g_h T(gi,gj,/)=gh来获得符号运算结果,那多项式环 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}

请你思考一下如何实现这种方程组的高斯消元算法(回忆线性代数里的做法,对齐项 M i M_i Mi即可…).


参考资料

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/635089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zookeeper 基础知识汇总

一、zookeeper 概述 中文教程&#xff1a;https://www.docs4dev.com/docs/zh/zookeeper/r3.5.6/reference/zookeeperOver.html 1.1 概述 ZooKeeper 是⼀种分布式协调服务&#xff0c;⽤于管理⼤型主机。在分布式环境中协调和管理服务是 ⼀个复杂的过程。ZooKeeper 通过其简单的…

网内计算:可编程数据平面和技术特定应用综述

网内计算&#xff1a;可编程数据平面和技术特定应用综述 摘要——与云计算相比&#xff0c;边缘计算提供了更靠近终端设备的处理&#xff0c;降低了用户体验的延迟。最新的In-Network Computing范例采用可编程网络元素在数据达到边缘或云服务器之前计算&#xff0c;促进了常见…

Linux性能分析之perf(1)基础知识总结

Linux(09)之perf(1)基础知识总结 Author&#xff1a;Onceday Date&#xff1a;2023年1月31日 漫漫长路&#xff0c;才刚刚开始… 参考文档&#xff1a; Tutorial - Perf Wiki (kernel.org) linux性能分析工具专题-perf&#xff08;事件采样&#xff0c;全面性能分析&#x…

时钟树综合跑不下去,怎么破?

吾爱IC社区第二十一期IC训练营正式开始招募啦&#xff08;5月21号开营&#xff09;&#xff01;不知不觉小编的IC后端训练营课程已经举办21期了。每一期的报名时间也就1-3天&#xff0c;而且几乎每期都是爆满的情况。这背后的逻辑很简单。大家都信任吾爱IC社区这个品牌&#xf…

做副业的我很迷茫,但ChatGPT却治好了我——AI从业者被AI模型治愈的故事

迷茫&#xff0c;无非就是不知道自己要做什么&#xff0c;没有目标&#xff0c;没有方向。 当有一个明确的目标时&#xff0c;往往干劲十足。但做副业过程中&#xff0c;最大的问题往往就是 不知道自己该干什么。 干什么&#xff1f;怎么干&#xff1f;干到什么程度&#xff1f…

通过部署Java工程学习Jenkins

今天来学习Jenkins部署应用&#xff0c;在工作中一般都是提交代码到git之后&#xff0c;通过自动打包的功能形成jar包&#xff0c;然后运行jar包。服务器自动从git拉取最新代码进行打jar包的这个过程就通过Jenkins来进行。 Jenkins官网地址 首先我们可以看一下官网的版本 我们…

智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机)

智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机) 目录 智能学习 | MATLAB实现GWO-SVM多输入单输出回归预测(灰狼算法优化支持向量机)预测效果基本介绍模型原理程序设计参考资料预测效果 基本介绍 Matlab实现GWO-SVM灰狼算法优化支持向量机的多输…

Vue中如何进行状态持久化(LocalStorage、SessionStorage)

Vue中如何进行状态持久化&#xff08;LocalStorage、SessionStorage&#xff09;&#xff1f; 在Vue应用中&#xff0c;通常需要将一些状态进行持久化&#xff0c;以便在用户关闭浏览器或刷新页面后&#xff0c;仍能保留之前的状态。常见的持久化方式包括LocalStorage和Sessio…

Cracking C++(8): 开发环境的选择

Cracking C(8): 开发环境的选择 文章目录 Cracking C(8): 开发环境的选择1. 目的2. 工具代码编辑器 和 IDEWindows命令行界面编译器gcc/gclang/clangMicrosoft Visual Studio基于浏览器的编译器 3. 其他工具补充调试器代码分析工具其他 1. 目的 在看了 hackingcpp 的 C Develo…

《百年孤独》15句经典语录

句句都是人生真相&#xff0c;说透了所有人的孤独。 1、生命中曾经有过的所有灿烂&#xff0c;原来终究&#xff0c;都需要用寂寞来偿还。 2、过去都是假的&#xff0c;回忆是一条没有尽头的路。 这句话是最受读者欢迎的一句话&#xff0c;回忆就是一条没有尽头的路&#xf…

shell脚本基础5——常用命令写作技巧

文章目录 一、grep命令二、sed命令2.1 选项参数2.2 常用命令 三、AWK命令3.1 常用参数3.2 常用示例 四、find与xargs五、date命令六、对话框6.1 消息框6.2 yes/no对话框6.3 表单输入框6.4 密码输入框6.5 菜单栏6.6 单选对话框6.7 多选对话框6.8 进度条 七、常用写作技巧7.1 EOF…

我,ChatGPT,打钱

「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 一、ChatGPT是个啥&#xff1f; chat&#xff1a;表示“聊天”。 GPT&#xff1a;则是G…

提升Python函数调用灵活性:参数传递类型详解

前言 在Python编程中&#xff0c;函数参数起着非常重要的作用。函数参数允许我们向函数传递数据&#xff0c;并在函数内部使用这些值。Python提供了多种参数传递类型&#xff0c;包括位置参数、关键字参数、默认参数、可变数量的位置参数、可变数量的关键字参数。这些不同的参数…

数据结构——串(字符串)

文章目录 **一 串的定义和实现****1 定义****2 串的存储结构****2.1 定长顺序存储表示****2.2 堆分配存储表示****2.3 块链存储表示** **3 串的基本操作** **二 串的模式匹配****1 简单的模式匹配算法****2 串的模式匹配算法——KMP算法****2.1 字符串的前缀&#xff0c;后缀和…

一起学SF框架系列5.4-模块Beans-DefaultListableBeanFactory

在生成ApplicationContext过程中&#xff0c;AbstractRefreshableApplicationContext.refreshBeanFactory()完成旧BeanFactory关闭&#xff0c;创建新的BeanFactory&#xff0c;即new DefaultListableBeanFactory(…)。然后bean实例化时调用本类的preInstantiateSingletons方法…

网安笔记12 IPsec

IPSec 基于通信IP环境下一种端到端&#xff0c;保证数据安全的机制 包含 两个安全协议&#xff0c;一个密钥管理协议&#xff0c; 标准价秘密技术为基础 DES/其他分组加密算法键值hash算法认证公钥有效的数字证书 AH协议提供信息源验证、完整性保证ESP提供信息源验证、机密…

华为OD机试真题 JavaScript 实现【求解立方根】【牛客练习题】

一、题目描述 计算一个浮点数的立方根&#xff0c;不使用库函数。保留一位小数。 数据范围&#xff1a;∣val∣≤20 。 二、输入描述 待求解参数&#xff0c;为double类型&#xff08;一个实数&#xff09; 三、输出描述 输出参数的立方根。保留一位小数。 四、解题思路…

Git工作流(随笔)

目录 前言 一、工作流概述 1、概念 2、分类 二、集中式工作流 1、概述 2、介绍 3、操作过程 三、功能分支工作流 1、概述 2、介绍 3、操作过程 1&#xff09;创建远程分支 2&#xff09;删除远程分支 四、GitFlow工作流 1、概述 2、介绍 3、操作过程 五、Forki…

Linux系统:CentOS编译Linux内核

目录 一、实验 1.下载内核 2.解压内核源码 3.配置依赖的环境 4.进入源码目录&#xff0c;使用make menuconfig开启菜单选项&#xff0c;手动选择内核功能 5.编译内核 6.安装模块 7.安装内核 8.验证新内核版本 一、实验 1.下载内核 &#xff08;1&#xff09;官网下载…

010:vue中el-table 隐藏表头的两种方法

第010个 查看专栏目录: VUE — element UI echarts&#xff0c;openlayers&#xff0c;cesium&#xff0c;leaflet&#xff0c;mapbox&#xff0c;d3&#xff0c;canvas 免费交流社区 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例…