伽罗瓦2^8域下模多项式求逆python(查表)实现

一、实验原理:

二、实现代码:

import time
#提取多项式的方幂信息及对应系数,返回对应列表,形如:[2,3,1,0,1]对应多项式2x^4+3x^3+x^2+1
def extract_info(str_polynimial):length=len(str_polynimial)add=1       #记录加号位置for i in range(length):if i==0:        #获取x的最高次幂指数及其系数j=0while(j!=length and str_polynimial[j]!='x'):j+=1if j+1==length or str_polynimial[j+1]!='^':index_list = [0] *2str_coefficient = "".join([str(item) for item in str_polynimial[0:j]])if str_coefficient=="":str_coefficient='1'index=1index_list[index] = int(str_coefficient)elif str_polynimial[j+1]=='^':k=j+2while(k!=length and str_polynimial[k]!='+' and str_polynimial[k]!='-'):k+=1str_index = "".join([str(item) for item in str_polynimial[j+2:k]])highest_index = int(str_index)  # 获取最高次幂指数index_list = [0] * (highest_index + 1)index = highest_indexif j == 0:  # 首项系数为1的情况下index_list[index] = 1else:str_coefficient = "".join([str(item) for item in str_polynimial[0:j]])index_list[index] = int(str_coefficient)elif str_polynimial[i]!='+' and str_polynimial[i]!='-':continueelse:j = iwhile (j!=length and str_polynimial[j] != 'x'):j += 1#截取x某一方幂前的系数str_coefficient = "".join([str(item) for item in str_polynimial[i+1:j]])if str_coefficient=="":     #如果str_coefficient未截取到字符串,证明该项系数为1,令str_coefficient='1'str_coefficient='1'if str_polynimial[i]=='-':      #如若系数为负,更正系数str_coefficient="-"+str_coefficient#下面确定并截取x的方幂次数if j==length:       #如果已遍历至字符串末位,证明x对应方幂为0str_index='0'elif (j+1)==length or str_polynimial[j+1]=='+'or str_polynimial[j+1]=='-':        #如果x紧接着的字符为’+‘或此时x为最后一个字符,则证明该x对应的方幂次数为1str_index = '1'else:k=j+2while(k!=length and str_polynimial[k]!='+' and str_polynimial[k]!='-'):k+=1#while语句执行完后,str_polynimial[k]='+'str_index="".join([str(item) for item in str_polynimial[j+2:k]])        #截取x对应的方幂次数#修改列表对应参数index_list[int(str_index)]=int(str_coefficient)index_list.reverse()return index_list#将列表转换为多项式,如[2,1,0,12]将被转换为字符串"2x^3+x^2+12"
def translation(list):str_polynimial=""for i in range(len(list)):if list[i]==0:continueindex=len(list)-i-1       #获取方幂次数coefficient=list[i]       #获取对应x某一方幂的系数if index==0:string=str(coefficient)elif index==1:if coefficient==1:string = 'x'else:string=str(coefficient)+'x'else:if coefficient==1:string = 'x' + '^' + str(index)else:string=str(coefficient)+'x'+'^'+str(index)if i==0 or list[i]<0:str_polynimial=str_polynimial+stringelif list[i]>0:str_polynimial=str_polynimial+'+'+stringif str_polynimial=="":str_polynimial="0"return str_polynimial#定义多项式列表与数的乘法,参数list为被乘的多项式列表,a为int型的乘数。计算数域为Zp
def Multiplication(list,a):result=[]for i in range(len(list)):result.append(list[i]*a%2)return result#定义多项式与多项式的乘法,参数list1,list2均为多项式的列表表示法。计算数域为Zp
def Multiplication2(list1,list2):a=list1.copy()b=list2.copy()result=[0]for i in range(len(b)):product=Multiplication(a,b[i])product.extend([0]*(len(b)-1-i))result=Add(result,product)return result#定义多项式列表表示的减法,要求参数list1与list2等长,返回结果仍为等长的列表。计算数域为Zp
def Subtraction(list1,list2):a=list1.copy()b=list2.copy()result=[]for i in range(len(a)):result.append((a[i]-b[i])%2)return result#计算数域为Zp
def Subtraction2(list1,list2):a=list1.copy()b=list2.copy()if len(a)<len(b):a.reverse()a.extend([0]*(len(b)-len(a)))a.reverse()elif len(a)>len(b):b.reverse()b.extend([0] * (len(a) - len(b)))b.reverse()result=Subtraction(a,b)return result#定义多项式的加法,默认参数list1、list2不等长
def Add(list1,list2):a=list1.copy()b=list2.copy()result=[]if len(a)>len(b):b.reverse()b.extend([0]*(len(a)-len(b)))b.reverse()max=len(a)else:a.reverse()a.extend([0]*(len(b)-len(a)))a.reverse()max=len(b)for i in range(max):result.append((a[i]+b[i])%2)for j in range(len(result)):  # 除去列表最左端无意义的0if result[0] == 0:result.remove(0)else:breakreturn result#实现多项式带余除法,参数list1、list2均为列表,list1为被除多项式返回多项式商q的列表与余式r的列表
def Division(list1,list2):#此处注意要深拷贝,浅拷贝会修改传进来的参数值r=list1.copy()b=list2.copy()if len(r)<len(b):return [0],list1q=[0]*(len(r)-len(b)+1)for i in range(len(q)):if len(r)>=len(b):index = len(r) - len(b) + 1  # 确定所得商是商式的第index位q[-index] = int(r[0] / b[0])# 更新被除多项式b_=b.copy()b_.extend([0] * (len(r) - len(b)))b_=Multiplication(b_,q[i])r = Subtraction(r ,b_)for j in range(len(r)):     #除去列表最左端无意义的0if r[0]==0:r.remove(0)else:breakelse:breakreturn q,r#定义28域下多项式的乘法,正常多项式乘法,再模去特定不可约多项式(记为w),运行时将内置为[1,0,1,1,0,0,0,1,1]
def G28_Multiplication(list1,list2,w):a=list1.copy()b=list2.copy()Mul=Multiplication2(a,b)_,r=Division(Mul,w)return r#扩展欧几里得算法,输入两个多项式列表list1、list2,返回二者的最大公因式列表d,以及满足d=u*list1+v*list2的u和v
#默认list1、list2不等于0
def Extend_Euclid(list1,list2,p):f=list1.copy()g=list2.copy()u_2=[1]u_1=[0]v_2=[0]v_1=[1]while(g!=[]):q,r=Division(f,g)u=Subtraction2(u_2,Multiplication2(q,u_1))v=Subtraction2(v_2,Multiplication2(q,v_1))f,g=g,ru_2,u_1=u_1,uv_2,v_1=v_1,vd,u,v=f,u_2,v_2return d,u,v#将多项式列表转换为10进制编号
def tran_2_to_10(list):result=0for i in range(len(list)):if list[i]==1:result+=2**(len(list)-1-i)return resultdef tran_10_to_2_list(number_code):list=[]number=number_codewhile(number!=0):r=number%2list.append(int(r))number=(number-r)/2list.reverse()return listdef test():w = [1, 0, 1, 1, 0, 0, 0, 1, 1]  # 内置的八次不可约多项式x = [1, 0]  # 内置的本原元多项式table = [1]# table_F中存储有256域下面各编号元素对应的生成元的次数,次数为列表中对应序号元素的值,# 例:生成元x的table_F[4]次方,生成元素4(多项式表示为x^2)table_F = [0] * 256for i in range(255):if i == 254:  # 约定第255号生成元素0table.append(0)table_F[0] = 255break_, item = Division(x, w)  # item为本原元生成的256域下的多项式元素number = tran_2_to_10(item)table_F[number] = i + 1table.append(number)x.append(0)print("GF(256)域下,建立指数对数表如下:")# 将256域中的元素按十进制排序,存储在tabel_F列表中for i in range(len(table)):print("{:<4}".format(i), end=' ')print("\n")for j in table:print("{:<4}".format(j), end=' ')print("\n")for k in table_F:print("{:<4}".format(k), end=' ')print("\n******************************************************************************")a = input("请输入第一个多项式:")list_a = extract_info(a)a_number = tran_2_to_10(list_a)b = input("请输入第二个多项式:")list_b = extract_info(b)b_number = tran_2_to_10(list_b)num_product = table[(table_F[a_number] + table_F[b_number]) % 255]  # 获得两多项式积在256域中的编号list_product = tran_10_to_2_list(num_product)str_product = translation(list_product)  # 将对应多项式输出inverse_a = table[255 - table_F[a_number]]list_inverse = tran_10_to_2_list(inverse_a)str_inverse_a = translation(list_inverse)print("GF(256)下两多项式之积为:"+str_product)print("GF(256)下多项式"+a+"的逆元为:"+str_inverse_a)return 0if __name__ == '__main__':test()

三、运行结果截图:

伽罗瓦2^8域下模多项式求逆python(查表)实现相关推荐

  1. 伽罗瓦死了,可是数学还活着

    "要是再没有好看的青春片,我就只能去看数学书了!" 昨天在地铁里听到有人这样说,我转头一看,是几个中学生,在那里嘻嘻哈哈地聊天. 我心想,你们以后就知道了,数学才是真正的青春标配呢 ...

  2. 伽罗瓦(Evarist. Galois)与现代群论

    伽罗瓦也许是世界上生命最短的著名数学家,正是他给我们开辟了代数(Algebra)公理化的全新方向.以下是他的肖像: 伽罗瓦生于1811年10月25日,死于1832年5月31日.在年轻时代,伽罗瓦给出了 ...

  3. 群论奠基人—埃瓦伊斯特·伽罗瓦

    埃瓦伊斯特·伽罗瓦(Evariste Galois) 1811年10月25日生于法国巴黎附近的拉赖因堡:1832年5月31日卒于巴黎. 伽罗瓦的父亲N.G.伽罗瓦(Galois)是法国资产阶级革命的支 ...

  4. 天才数学家阿贝尔和伽罗瓦

    天才数学家阿贝尔和伽罗瓦 作者:提篮小卖 由于工作的缘故,时常会接触到一些研究数学的人.但不知什么缘故,常常 会觉得这些人多少都有些怪僻,而且是那种说不出怪在什么地方,但怎么瞅怎么 和别人不一样的怪法 ...

  5. 伽罗瓦不是群论的奠基人

    国内文献(科普中国)把伽罗瓦说成是群论的发现者.奠基人.这不符合历史事实. 事实上,伽罗瓦的工作是利用置换群工具解决了多项式存在根式解的条件. The study ofgroups originall ...

  6. 线性反馈移位寄存器LFSR(斐波那契LFSR(多到一型)和伽罗瓦LFSR(一到多型)|verilog代码|Testbench|仿真结果)

    线性反馈移位寄存器LFSR 一.前言 二.LFSR简介 三.斐波那契LFSR和伽罗瓦LFSR 3.1 斐波那契LFSR 3.1.1 斐波那契LFSR 3.1.2 verilog代码 3.1.3 Tes ...

  7. LFSR(斐波那契大战伽罗瓦)

    LFSR(斐波那契大战伽罗瓦) 线性反馈移位寄存器(LFSR):通常由移位寄存器和异或门逻辑组成.其主要应用在:伪随机数,伪噪声序列,计数器,BIST,数据的加密和CRC校验等. Part.1 线性反 ...

  8. 低阶有限群的伽罗瓦表示

    伽罗瓦反问题Galois inverse problem 问题:是否任意一个有限群都同构于一个有理系数多项式的伽罗瓦群? http://pari.math.u-bordeaux.fr/galpol/4 ...

  9. 抽象解释-伽罗瓦连接证明数据流分析的安全性

    文章目录 前言 抽象解释 伽罗瓦连接(Galois Connection) 证明数据流分析的安全性 前言 视频:北大-软件分析-公开课 文档:课件 简单记录下. 抽象解释 在这之前,我们所有的静态分析 ...

  10. 埃瓦里斯特·伽罗瓦Évariste Galois

    埃瓦里斯特·伽罗瓦(Évariste Galois,1811年10月25日-1832年5月31日,法语发音[evaʀist galwa]),法国数学家,与尼尔斯·阿贝尔并称为现代群论的创始人.在一次几 ...

最新文章

  1. JVM参数设置和分析
  2. 2.2.2 指数加权平均
  3. 链表之删除链表中间节点
  4. [Swift通天遁地]二、表格表单-(14)实时调整表单元素的激活和失效
  5. OpenCV读取视频并获得相关属性信息
  6. 为什么应尽量从列表的尾部进行元素的增加与删除操作?
  7. 解决serv-u中文乱码的问题
  8. Java学习之路 之 使用技巧篇
  9. 网络是怎样连接的-IP与以太网的包收发操作(三)
  10. 网络编程 : 基于UDP的网络群聊聊天室
  11. kindle刷机ttl_kindle paper white 2 (kpw) 无限重启救砖方法
  12. 中央电大 c语言程序设计a 试题,中央电大2008年秋C语言程序设计A试题1
  13. gamma软件linux安装图示,Ubuntu下安装GAMMA过程(转)
  14. 深度学习,分割后处理之通过连通成分分析去除假阳性区域,提高分割准确度
  15. STM32使用SPI方式读写SD 卡
  16. Android:详细解析RSSI概念
  17. 基于顺承关系的事理图谱的构建
  18. Vue2.0中的事件修饰符
  19. 流媒体的几种常见传输方式
  20. Shoping(map)

热门文章

  1. Win7 VirtualBox运行出现“0x00000000指令引用的0x00000000内存。该内存不能为written” ,错误解决
  2. 浪潮服务器系统安装操作,浪潮服务器系统安装操作
  3. Linux禁用搜狗输入法的简繁切换快捷键
  4. 【Pycharm】安装及激活、界面调整、导入anaconda的依赖库、字体设置微软雅黑
  5. win10微软图标点击无反应_双击电脑桌面图标没反应,win10双击图标没反应
  6. Python:常见排列组合问题处理
  7. 如何正确重新启动计算机,电脑突然重启,详细教您电脑忽然重启如何解决
  8. word 此文件来自其它计算机,问题解决: 此文件来自其他计算机,可能被阻止以帮助保护该计算机/WORD在试图打开文件时遇到错误……...
  9. 医院病房监护系统和图书管理系统数据流图
  10. python青少年编程比赛_有哪些编程比赛适合青少年参加和锻炼的?