python算法训练之有限域上的多项式运算

news2024/11/17 10:41:07

需求简述

求所有 GF(2)上 次数小于等于8 的 不可约多项式。

用list存储多项式系数,直接输出list即可。

算法资料:

有限域_百度百科 (baidu.com)icon-default.png?t=N7T8https://baike.baidu.com/item/%E6%9C%89%E9%99%90%E5%9F%9F/4273049?fr=ge_ala可约多项式_百度百科 (baidu.com)icon-default.png?t=N7T8https://baike.baidu.com/item/%E5%8F%AF%E7%BA%A6%E5%A4%9A%E9%A1%B9%E5%BC%8F/18881405

有限域GF(2^8)的四则运算及拉格朗日插值-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/luotuo44/article/details/41645597

代码


import copy


class CPolyEle:
    iID: int
    lData: list = None  # 多项式系数。[i]表示i次项系数
    oTag = None


class CPolySet:
    sType = 'GF'
    iPrime = 2
    iDeg = 8  # 多项式次数最大值

    lAll: list = []  # 所有
    lRedu: list = []  # 可约
    lIrredu: list = []  # 不可约

    def Sort(self) -> int:
        iMulMax = self.iPrime ** self.iDeg
        iMax = iMulMax * self.iPrime

        # 构造lAll#[
        for i in range(iMax):
            r = self.CreatePoly(i)
            self.lAll.append(r)
        # ]
        # 标记#[
        for i in range(2, iMulMax):
            for j in range(i, iMulMax):
                a: CPolyEle = self.lAll[i]
                b: CPolyEle = self.lAll[j]
                r = self.Mul(a.lData, b.lData)
                if len(r) > self.iDeg + 1:
                    break

                r = self.ListToID(r)
                oPoly: CPolyEle = self.lAll[r]
                oPoly.oTag = True
        # ]
        # 保存结果#[
        for it in self.lAll:
            oPoly: CPolyEle = it
            if oPoly.oTag == True:
                self.lRedu.append(oPoly.iID)
            else:
                self.lIrredu.append(oPoly.iID)
        # ]

        return len(self.lIrredu)

    def CreatePoly(self, iID) -> CPolyEle:
        ret = CPolyEle()

        ret.iID = iID
        ret.lData = []
        while True:
            r = iID % self.iPrime
            ret.lData.append(r)
            if iID < self.iPrime:
                break

            iID = iID // self.iPrime
            # end while

        return ret

    def ListToID(self, lPoly: list) -> int:
        ret = 0
        iMul = 1

        for it in lPoly:
            ret += it * iMul
            iMul *= self.iPrime

        return ret

    def Add(self, a: list, b: list) -> list:
        ret = []
        lAdd = a

        if (len(a) > len(b)):
            ret = copy.deepcopy(a)
            lAdd = b
        else:
            ret = copy.deepcopy(b)

        for i in range(len(lAdd)):
            ret[i] = (ret[i] + lAdd[i]) % self.iPrime

        return ret

    def Mul(self, a, b) -> list:
        ret: list = [0 for _ in range(len(a))]

        if type(b) is int:
            for i in range(len(a)):
                ret[i] = (a[i] * b) % self.iPrime
        elif type(b) is list:
            for i in range(len(b)):
                lAdd = a
                lAdd = self.Mul(lAdd, b[i])
                lAdd = self.MulX(lAdd, i)

                ret = self.Add(ret, lAdd)

        return ret

    def MulX(self, a, x) -> list:
        lZero = [0 for _ in range(x)]
        return lZero + a

    def Print(self, iID: int):
        print(self.lAll[iID].lData)


def Main():
    oTest = CPolySet()

    r = oTest.Sort()

    print(r)
    for it in oTest.lIrredu:
        oTest.Print(it)

    print('end')
    return


if __name__ == '__main__':
    Main()

运行结果

73
[0]
[1]
[0, 1]
[1, 1]
[1, 1, 1]
[1, 1, 0, 1]
[1, 0, 1, 1]
[1, 1, 0, 0, 1]
[1, 0, 0, 1, 1]
[1, 1, 1, 1, 1]
[1, 0, 1, 0, 0, 1]
[1, 0, 0, 1, 0, 1]
[1, 1, 1, 1, 0, 1]
[1, 1, 1, 0, 1, 1]
[1, 1, 0, 1, 1, 1]
[1, 0, 1, 1, 1, 1]
[1, 1, 0, 0, 0, 0, 1]
[1, 0, 0, 1, 0, 0, 1]
[1, 1, 1, 0, 1, 0, 1]
[1, 1, 0, 1, 1, 0, 1]
[1, 0, 0, 0, 0, 1, 1]
[1, 1, 1, 0, 0, 1, 1]
[1, 0, 1, 1, 0, 1, 1]
[1, 1, 0, 0, 1, 1, 1]
[1, 0, 1, 0, 1, 1, 1]
[1, 1, 0, 0, 0, 0, 0, 1]
[1, 0, 0, 1, 0, 0, 0, 1]
[1, 1, 1, 1, 0, 0, 0, 1]
[1, 0, 0, 0, 1, 0, 0, 1]
[1, 0, 1, 1, 1, 0, 0, 1]
[1, 1, 1, 0, 0, 1, 0, 1]
[1, 1, 0, 1, 0, 1, 0, 1]
[1, 0, 0, 1, 1, 1, 0, 1]
[1, 1, 1, 1, 1, 1, 0, 1]
[1, 0, 0, 0, 0, 0, 1, 1]
[1, 1, 0, 1, 0, 0, 1, 1]
[1, 1, 0, 0, 1, 0, 1, 1]
[1, 0, 1, 0, 1, 0, 1, 1]
[1, 0, 1, 0, 0, 1, 1, 1]
[1, 1, 1, 1, 0, 1, 1, 1]
[1, 0, 0, 0, 1, 1, 1, 1]
[1, 1, 1, 0, 1, 1, 1, 1]
[1, 0, 1, 1, 1, 1, 1, 1]
[1, 1, 0, 1, 1, 0, 0, 0, 1]
[1, 0, 1, 1, 1, 0, 0, 0, 1]
[1, 1, 0, 1, 0, 1, 0, 0, 1]
[1, 0, 1, 1, 0, 1, 0, 0, 1]
[1, 0, 0, 1, 1, 1, 0, 0, 1]
[1, 1, 1, 1, 1, 1, 0, 0, 1]
[1, 0, 1, 1, 0, 0, 1, 0, 1]
[1, 1, 1, 1, 1, 0, 1, 0, 1]
[1, 1, 0, 0, 0, 1, 1, 0, 1]
[1, 0, 1, 0, 0, 1, 1, 0, 1]
[1, 0, 0, 1, 0, 1, 1, 0, 1]
[1, 0, 0, 0, 1, 1, 1, 0, 1]
[1, 1, 1, 0, 1, 1, 1, 0, 1]
[1, 1, 0, 1, 1, 1, 1, 0, 1]
[1, 1, 1, 0, 0, 0, 0, 1, 1]
[1, 1, 0, 1, 0, 0, 0, 1, 1]
[1, 0, 1, 1, 0, 0, 0, 1, 1]
[1, 1, 1, 1, 1, 0, 0, 1, 1]
[1, 1, 0, 0, 0, 1, 0, 1, 1]
[1, 0, 0, 1, 0, 1, 0, 1, 1]
[1, 0, 0, 0, 1, 1, 0, 1, 1]
[1, 0, 1, 1, 1, 1, 0, 1, 1]
[1, 1, 0, 0, 0, 0, 1, 1, 1]
[1, 1, 1, 1, 0, 0, 1, 1, 1]
[1, 1, 1, 0, 1, 0, 1, 1, 1]
[1, 0, 1, 1, 1, 0, 1, 1, 1]
[1, 1, 1, 0, 0, 1, 1, 1, 1]
[1, 1, 0, 0, 1, 1, 1, 1, 1]
[1, 0, 1, 0, 1, 1, 1, 1, 1]
[1, 0, 0, 1, 1, 1, 1, 1, 1]
end

如果算上0和1,则GF(2)上 次数小于等于8 的 不可约多项式 共有73个

---完---

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

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

相关文章

Entity实体设计

Entity实体设计 &#x1f4a1;用来和数据库中的表对应&#xff0c;解决的是数据格式在Java和数据库间的转换。 &#xff08;一&#xff09;设计思想 数据库Java表类行对象字段&#xff08;列&#xff09;属性 &#xff08;二&#xff09;实体Entity编程 编码规范 &#x1f4a…

转移表实现计算器

这节复习一下转移表 先实现一个简易的计算器&#xff1a; 加减乘除等计算封装成函数&#xff1a; 然后实现一个菜单&#xff0c;供使用者使用&#xff1a; 函数主体部分&#xff1a; do while循环是为了多次进行计算&#xff0c;只有输入为0时才会推出。 而switch有利于这种选…

【Linux】日志的实现——日志等级的分类、日志的实现和输出、日志在程序中的应用(以管道通信为例)

文章目录 日志实现1.日志的介绍2.日志的制作&#xff08;向屏幕直接打印&#xff09;2.1获取时间2.2输出内容2.3打印方式2.3.1向单个文件打印2.3.2向分类文件打印 3.日志的应用3.1以管道通信为例 日志实现 1.日志的介绍 Linux日志是以时间线-事件的方式记录操作系统和应用的信…

本体论(ontology)在工业4.0中的应用

信息技术中的本体与哲学的本体论是不同的&#xff0c;它代表了某个专业领域的基本概念&#xff0c;它们在智能制造和工业4.0 中具有不可或缺的作用&#xff0c;为了实现人与机器&#xff0c;机器与机器之间的确定性操作。一个标准化的&#xff0c;精确定义的本体服务是非常重要…

进程信号-

一.信号概念 信号是进程之间事件异步通知的一种方式&#xff0c;属于软中断。 二.信号的产生 1.通过键盘进行信号的产生。&#xff08;1-31多数都是杀掉进程&#xff09; &#xff08;ctrl c&#xff1a;向前台进程发送2号信号&#xff0c;杀掉进程&#xff09; &#xff0…

word调整论文格式的记录

页眉的分章显示内容 效果&#xff1a; 步骤&#xff1a; 确保“显示/隐藏的标记”符号打开点亮 前提是章节前面有“分节符&#xff08;下一页&#xff09;”&#xff0c;没有则添加&#xff0c;在菜单栏“布局”——》“下一页” 添加页眉&#xff0c;双击页眉&#xff0c;选…

【DevOps】产品需求文档(PRD)与常见原型软件

文章目录 1、PRD介绍1.1、概述1.2、前提条件1.3、主要目的1.4、关键内容1.5、表述方式1.6、需求评审人员1.7、一般内容结构 2、需求流程3、常见原型软件3.1、Word3.2、Axure3.2.1、详细介绍3.2.2、应用分类3.2.3、优缺点 3.3、摹客RP3.4、蓝湖3.5、GUI Design Studio 1、PRD介绍…

基于SpringBoot Vue单位考勤管理系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

25.云原生之ArgoCD-app of apps模式

文章目录 app of apps 模式介绍app如何管理apphelm方式管理kustomize方式管理 app of apps 模式介绍 通过一个app来管理其他app&#xff0c;当有多个项目要发布创建多个app比较麻烦&#xff0c;此时可以创建一个管理app&#xff0c;管理app创建后会创建其他app。比较适合项目环…

在 Windows 10 上使用 Visual Studio 2022 进行 C++ 桌面开发

工具下载链接&#xff1a;https://pan.quark.cn/s/c70b23901ccb 环境介绍 在今天的快速发展的软件开发行业中&#xff0c;选择合适的开发环境是非常关键的一步。对于C开发人员来说&#xff0c;Visual Studio 2022&#xff08;VS2022&#xff09;是一个强大的集成开发环境&…

Vue2+ElementUI 弹窗全局拖拽 支持放大缩小

拖拽组件 dialogDrag.vue <template><div></div> </template> <script>export default {name: dialogDrag,data() {return {originalWidth: null,originalHeight: null}},created() {this.$nextTick(()>{this.dialogDrag()})},mounted() {}…

Opencv(C++)学习 之RV1126平台的OPENCV交叉编译

本文特点&#xff1a;网上已经有了很多opencv移植RV1106的文章&#xff0c;本文主要记录基于cmake-gui编译&#xff0c;碰到的报错&#xff0c;及解决报错问题的方法&#xff0c;同时简单总结一些配置项相关的知识。 一、环境&#xff1a; ubuntu18 x64 RV1126交叉编译工具链 …

【服务器搭建】快速完成幻兽帕鲁服务器的搭建及部署【零基础上手】

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 教程详戳&#xff1a;不需要懂技术&#xff0c;1分钟幻兽帕鲁服…

unity3d的海盗王白银城演示

这是一个外网上的下载的海盗王unity3d制作的白银城演示场景。 地图只含有白银城区&#xff0c;没有野外和怪物。 当然也没有服务器端的。 我对灯光、摄像头、天空背景等做过调整&#xff0c;使它显示起来比较鲜丽。 它的模型和贴图是直接拿了海盗的&#xff0c;没有做过优化调整…

AI监控+智能充电桩系统如何缓解新能源汽车充电难问题

在新能源汽车行业的快速发展中&#xff0c;充电桩作为重要的配套设施&#xff0c;其建设和发展至关重要。随着新能源汽车销量的增长&#xff0c;补能需求也日益迫切&#xff0c;这为充电桩行业的发展提供了巨大的机遇。然而&#xff0c;充电桩行业在快速发展的同时&#xff0c;…

Day17、18、19学习记录

#c语言知识 内存管理 1.作用域 &#xff08;1&#xff09;代码块作用域&#xff08;代码块是{}之间的一段代码&#xff09; &#xff08;2&#xff09;函数作用域 &#xff08;3&#xff09;文件作用域 2.局部变量&#xff08;自动变量auto&#xff09;&#xff1a; 在函…

【C语言】异常处理 | assert函数 | errno错误码

文章目录 C语言传统的处理错误的方式1. 终止程序&#xff08;例如使用 assert&#xff09;2. 返回/设置错误码手动实现C语言库函数内置的错误码Linux系统调用内置的错误码 C语言传统的处理错误的方式 C语言传统的处理错误的方式主要包括assert终止程序和返回或设置错误码两种方…

Linux系统安全:安全技术 和 防火墙

一、安全技术 入侵检测系统&#xff08;Intrusion Detection Systems&#xff09;&#xff1a;特点是不阻断任何网络访问&#xff0c;量化、定位来自内外网络的威胁情况&#xff0c;主要以提供报警和事后监督为主&#xff0c;提供有针对性的指导措施和安全决策依据,类 似于监控…

flinkjar开发 自定义函数

编写自定义加密函数&#xff0c;继承ScalarFunction类&#xff0c;实现eval方法&#xff0c;参数个数类型和返回值根据业务来自定义。 import org.apache.flink.table.functions.ScalarFunction; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax…

Axure 动态面板初使用 - 实现简单的Banner图轮播效果

使用工具版本 Axure 9 实现的效果 步骤过程 1、打开Axure工具&#xff0c;从元件库拖个动态面板到空白页&#xff1b; 2、给面板设置一个常用的banner尺寸&#xff0c;举个栗子&#xff1a;343151(移动端我常用的banner尺寸)&#xff0c;顺便给它起个名字&#xff0c;就叫…