"""完全版有限域操作域"""
#完成矩阵的第二步化简
import copy
import math
import itertools
from numpy import *
import numpy as np
class GF():
def __init__(self,w):
# 有限域最小指数幂
self.num=w
self.w=w
self.createBegingf()
self.createGF()
def createBegingf(self):
# gf:有限域
gf2 = [1, 2, 3]
gf3 = [1, 2, 4, 3]
gf4 = [1, 2, 4, 8, 3]
gf5 = [1, 2, 4, 8, 16, 5]
gf6 = [1, 2, 4, 8, 16, 32, 3]
gf7 = [1, 2, 4, 8, 16, 32, 64, 9]
gf8 = [1, 2, 4, 8, 16, 32, 64, 128, 29]
gf_list = [gf2, gf3, gf4, gf5, gf6, gf7, gf8]
gf = copy(gf_list[self.w - 2]).tolist()
print(gf)
for i in range(int(math.pow(2, self.w)) - len(gf)):
gf.append(0)
#print(gf)
self.gf=gf
# 生成有限域元素
def createEl(self,gf, i, m, w):
tmp = gf[i - 1]
tmp = tmp << 1
if tmp >= pow(2, w):
tmp = tmp - pow(2, w)
tmp = tmp ^ gf[m]
return tmp
# 生成有限域
def createGF(self):
gf=self.gf
for i in range(self.num + 1, pow(2, self.w)):
tmp = self.createEl(gf, i, self.num, self.w)
gf[i] = tmp
self.gf=gf
print(gf)
self.createGflog()
return gf
def createV(self):
V=[]
for i in range(pow(2, self.w)):
V.append(self.getbin(i))
self.V=V
return V
# 获取num的二进制数组表示
def getbin(self, num):
numtmp1 = bin(num)
arraytmp1 = []
# 获取
for i in range(len(numtmp1)):
if i > 1:
arraytmp1.append(numtmp1[i])
resulttmp1 = [0] * self.w
y = len(arraytmp1) - 1
for x in range(len(resulttmp1)):
resulttmp1[x] = int(arraytmp1[y])
y = y - 1
if y < 0:
break
print(resulttmp1)
return resulttmp1
def createM(self):
M=[]
for i in range(pow(2, self.w)):
tmp1=(mat(self.V[i]).T)
for x in range(2,self.w+1):
num=self.mul(i,pow(2, x-1))
tmp2=(mat(self.V[num]).T)
tmp1=np.hstack((tmp1,tmp2))
M.append(tmp1)
self.M=M
return M
# 构建gflog(),有限域乘法运算
def createGflog(self):
# 初始化gflog_list
gflog_list = [0] * len(self.gf)
for i in range(len(self.gf) - 1):
gflog_list[self.gf[i]] = i
gflog_list[0] = -1
self.gflog_list=gflog_list
print(self.gflog_list)
# gflog计算
def gflog(self,i):
return self.gflog_list[i]
# gfilog计算
def gfilog(self,i):
while i > (pow(2, self.w)-1):
i=i-(pow(2, self.w)-1)
gfilog_list=self.gf
result=gfilog_list[i]
return result
def add(self,a1,a2):
return a1^a2
def mul(self,a1,a2):
if a1==0 or a2 == 0:
return 0
A1=self.gflog(a1)
A2 = self.gflog(a2)
sum=A1+A2
if sum>((pow(2, self.w))-1):
sum = sum%((pow(2, self.w))-1)
return self.gfilog(sum)
def div(self,a1,a2):
if a1==0 or a2 == 0:
return 0
A1=self.gflog(a1)
A2 = self.gflog(a2)
if A1>A2:
sum=A1-A2
if sum>((pow(2, self.w))-1):
sum = sum%((pow(2, self.w))-1)
result=self.gfilog(sum)
else:
sum=A1-A2
sum=sum+((pow(2, self.w))-1)
result = self.gfilog(sum)
return result
# 矩阵乘法
def mat_mul(self,mat1,mat2):
result=np.zeros((mat1.shape[0],mat2.shape[1]),dtype=np.int32)
for x in range(mat1.shape[0]):
m1_data=[]
for i in range(mat1.shape[1]):
m1_data.append(mat1[x,i])
for y in range(mat2.shape[1]):
m2_data=[]
for i in range(mat2.shape[0]):
m2_data.append(mat2[i,y])
r_data=[]
for i in range(mat1.shape[1]):
tmp=self.mul(m1_data[i],m2_data[i])
r_data.append(tmp)
addtmp=0
for i in range(len(r_data)):
addtmp=addtmp^r_data[i]
result[x,y]=addtmp
return result
# 有限域矩阵的加法
def mat_add(self, mat1, mat2):
mat1_shape = np.shape(mat1)
mat2_shape = np.shape(mat2)
if not np.equal(mat1_shape, mat2_shape).all():
return None
mat_plus = np.zeros((mat1_shape[0], mat1_shape[1]), dtype=np.int32)
for i in range(mat1_shape[0]):
for j in range(mat1_shape[1]):
mat_plus[i][j] = self.add(mat1[i][j], mat2[i][j])
return mat_plus
# 有限域矩阵的减法
def mat_sub(self, mat1, mat2):
return self.mat_add(mat1, mat2)
# 有限域矩阵数乘
def mat_num_mul(self, mat, num):
mat_shape = np.shape(mat)
num_mat = np.zeros((mat_shape[0], mat_shape[1]), dtype=np.int32)
if num < 0:
return 0
if num == 0:
return num_mat
for i in range(mat_shape[0]):
for j in range(mat_shape[1]):
num_mat[i][j] = self.mul(mat[i][j], num)
return num_mat
# 有限域矩阵除以单个数
def mat_num_div(self, mat, num):
num = self.inverse(num)
mat_div_num = self.mat_num_mul(mat, num)
return mat_div_num
########################行变换求逆矩阵#####################
# 交换矩阵中两行
def exchage_row(self, mat, row1, row2):
if row1 == row2:
return mat
(m, n) = np.shape(mat)
for i in range(n):
mat[row1][i], mat[row2][i] = mat[row2][i], mat[row1][i]
return mat
# 求行列式值
def InsMaValue(self, mat):
(row, column) = np.shape(mat)
# 判断是否为方阵
if row != column:
return None
# 求0到n的全排列
k = row
s = [x for x in range(k)]
list1 = list(itertools.permutations(s, k))
k_len = list1.__len__()
# 求行列式每一项的数值并存入multi中
multi = []
for i in range(k_len):
ss = 1
for j in range(k):
ii = list1[i][j]
ss = self.mul(ss, mat[j][ii])
multi.append(ss)
det_mat = 0
for i in range(k_len):
det_mat = self.add(det_mat, multi[i])
return det_mat
# 有限域上求逆矩阵
def InMa(self, mat):
(s, t) = np.shape(mat)
if not s == t: # 判断是否为方阵
print(False)
IsMa = self.InsMaValue(mat)
if IsMa == 0: # 判断矩阵行列式是否为0,即矩阵是否可逆
print("该矩阵没有逆矩阵")
unit_mat = np.eye(s, dtype=np.int32) # 将要变换的矩阵与单位阵横向拼接
matrix = np.hstack((mat, unit_mat))
(s, t) = np.shape(matrix)
# 判断第一个元素是否为0,若为0,交换两行
if mat[0][0] == 0:
for i in range(1, s):
if mat[i][0] != 0:
mat = self.exchage_row(mat, 0, i)
# 行变换令左边为单位阵
for i in range(s):
for j in range(i + 1, s, 1):
if matrix[i][i] == 0:
for l in range(i + 1, s):
if matrix[l][i] != 0:
matrix = self.exchage_row(matrix, l, i)
brea
gf.zip_有限域_有限域 构造
版权申诉
112 浏览量
2022-09-24
23:36:52
上传
评论
收藏 3KB ZIP 举报
alvarocfc
- 粉丝: 112
- 资源: 1万+
最新资源
- institutionalNetwork.apk
- MVTec LOCO AD dataset 之 juice-bottle
- opencv 4.10.0 cmake编译cuda支持
- mysql-8.4.0.tar.xz源代码安装包官网下载源 mysql8.X源代码
- LDR6020G PS8742BQFN40GTR-A1 三TYPE-C接口VR转接器应用电路
- 19届智能车字母数据集
- TexturePacker4.8 windows版本
- NX二次开发uf4401 函数介绍
- multisim数字电路课程设计-出租车自动计费器multisim源文件+课设文档说明.zip
- 电脑知识截图(自用,没有太多内容)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0