参考链接:https://blog.csdn.net/luotuo44/article/details/41645597
参考链接:https://blog.csdn.net/shelldon/article/details/54729687


伽罗华域定义


我对伽罗华域的理解就是,给定一个域,比如4位,在4位之内的数字,不管加、减、乘、除,结果都在域里面,不会溢出,并且。运算时可逆的,能够还原
比如4位最大数字为15,那么13+14 = a不能超过15,并且运算可逆:a - 13 = 14, a - 14 = 13
同样13 x 14 = a,a不能超过15,a / 13 = 14

伽罗华域的计算


有限域

在密码学中,有限域GF(.p)是一个很重要的域,其中p为素数。简单来说,GF(.p)就是 mod p,因为一个数模p后,结果在[0, p-1]之间。对于元素a和b,那么(a+b) mod p和(a*b)mod p,其结果都是域中的元素。GF§里面的加法和乘法都是平时用的加法和乘法。
为什么p必须是素数?
是因为当p为素数时,才能保证集合中的所有的元素都有加法和乘法逆元(0除外)。
举个例子:加入p = 10,那么我们需要计算1 / 2,也就是计算a,使得(a * 2) mod 10 = 1,但是显然没有这样的a成立。

本原多项式

既然要求p是素数,那么有没有对不同的域的大小一个特定的素数呢,这个是有一些经常使用的素数的,转换成多项式叫做本原多项式
例如在24域里面,多项式为:x4+x+1,也就是二进制10011,因为需要异或这个多项式,所以多项式的最高位肯定是2w,然后后面加一个素数,在w为4的时候,这个素数就是3。

通过本原多项式生成元素

按照之前的算法


GF(24)含有16个元素,本原多项式为P(x)=x^4+x+1,除了 0、1外,另外14个符号均由本原多项式生成。
可以看到最后一个元素的计算过程,正好对P(x)取模之后,结果为1

生成元素代码(正表构造)

for i in range(1, gf_element_total_number - 1):temp = gfilog[i - 1] << 1  # g(i) = g(i-1) * 2if temp & gf_element_total_number:  # 判断溢出temp ^= primitive_polynomial  # 异或本原多项式gfilog.append(temp)

结果

这个将生成元变为多项式,然后映射到十进制的形式,也就是将生成元的系数映射成十进制的形式。

反表构造

当我们需要逆元的时候,就需要将十进制变为多项式,例如我们知道gfilog[0] = 1,那么我们需要知道gfilog[x] = 1的x
这个时候就需要构建反表gflog
gflog的构造方式为:gflog[gfilog[i]] = i
也就是根据二进制,转换为生成元。

for i in range(0, gf_element_total_number - 1):gflog[gfilog[i]] = i

结果:

那么就构造出来了两个表了。


伽罗华域四则运算

1.加法运算

异或然后对2w取模即可

2. 减法运算

与加法一样,异或然后对2w取模即可

    def add(self, a, b):return (a ^ b) % self.totaldef sub(self, a, b):return (a ^ b) % self.total

3. 乘法运算

  1. 将十进制变为多项式:查gflog表
  2. 两个多项式相加,如果溢出,对2w取模
  3. 将多项式变为生成元:查gfilog表
    def mul(self, a, b):return self.gfilog[(self.gflog[a] + self.gflog[b]) % self.total]

4. 除法运算

既然乘法是相加,那么除法就反过来相减。

  1. 将十进制变为多项式:查gflog表
  2. 两个多项式相减,如果溢出,对2w取模
  3. 将多项式变为生成元:查gfilog表
    def div(self, a, b):return self.gfilog[(self.gflog[a] - self.gflog[b]) % self.total]

完整程序

输入:伽罗华域位大小4、8、16、32、64
输入:两个数字
输出:四则远算的结果

primitive_polynomial_dict = {4: 0b10011,  # x**4  + x  + 18: (1 << 8) + 0b11101,  # x**8  + x**4  + x**3 + x**2 + 116: (1 << 16) + (1 << 12) + 0b1011,  # x**16 + x**12 + x**3 + x + 132: (1 << 32) + (1 << 22) + 0b111,  # x**32 + x**22 + x**2 + x + 164: (1 << 64) + 0b11011  # x**64 + x**4 + x**3 + x + 1}
class GF:def __init__(self, w):self.w = wself.total = (1 << self.w) - 1self.gflog = []self.gfilog = [1] # g(0) = 1self.make_gf_dict(self.w, self.gflog, self.gfilog)def make_gf_dict(self, w, gflog, gfilog):gf_element_total_number = 1 << wprimitive_polynomial = primitive_polynomial_dict[w]for i in range(1, gf_element_total_number - 1):temp = gfilog[i - 1] << 1  # g(i) = g(i-1) * 2if temp & gf_element_total_number:  # 判断溢出temp ^= primitive_polynomial  # 异或本原多项式gfilog.append(temp)assert (gfilog[gf_element_total_number - 2] << 1) ^ primitive_polynomialgfilog.append(None)for i in range(gf_element_total_number):gflog.append(None)for i in range(0, gf_element_total_number - 1):gflog[gfilog[i]] = iprint(gflog)print(gfilog)def add(self, a, b):return (a ^ b) % self.totaldef sub(self, a, b):return (a ^ b) % self.totaldef mul(self, a, b):return self.gfilog[(self.gflog[a] + self.gflog[b]) % self.total]def div(self, a, b):return self.gfilog[(self.gflog[a] - self.gflog[b]) % self.total]

测试

gf = GF(4)
import random
t = 0
while t <= 20:a = random.randint(1, 15)b = random.randint(1, 15)c = gf.add(a, b)d = gf.mul(a, b)print('%d + %d = %d' % (a, b, c))print('%d - %d = %d' % (c, a, gf.sub(c, a)))print('%d * %d = %d' % (a, b, d))print('%d / %d = %d' % (d, a, gf.div(d, a)))print()t += 1

从结果中可以看到2+10=8
8-10=2,说明加减法是可逆的
2 x 10 = 7
7 / 2 = 10,说明乘法除法是可逆的

伽罗华域(Galois Field)理解、基于伽罗华域的四则运算(附详细python代码)相关推荐

  1. 伽罗华域(Galois Field,GF,有限域)

    原文见链接DataMatrix 编码生成和译码原理即方法 原文见链接存储系统中的纠删码(Erasure Codes)-XOR 码和RS 码 原文见链接(讲的很好)Galois 域上的运算(规则) 原文 ...

  2. 【负荷预测】基于灰色预测算法的负荷预测(Python代码实现)

    目录 1 概述 2 流程图 3 入门算例  4 基于灰色预测算法的负荷预测(Python代码实现) 1 概述 "由于数据列的离散性,信息时区内将出现空集(不包含信息的定时区),因此只能按近似 ...

  3. 基于PCA方法的ORL人脸识别及Python代码实现

    基于PCA方法的ORL人脸识别及Python代码实现 PCA算法 方案设计 代码实现 结果分析 参考文献 PCA的理论知识已经有很多博客做了清晰的解释,主要概括为找到投影的面使得类间误差最大,转化为找 ...

  4. python最强实训程序(增删改查)机房收费管理系统-基于tkinter的图形化界面(附详细代码)

    python最强实训程序(增删改查)机房收费管理系统-基于tkinter的图形化界面(附详细代码) 最近学校实训,用两天时间做了一个python小程序*机房收费管理系统*,一款基于tkinter使用p ...

  5. 基于傅里叶变换的音频重采样算法 (附完整c代码)

    前面有提到音频采样算法: WebRTC 音频采样算法 附完整C++示例代码 简洁明了的插值音频重采样算法例子 (附完整C代码) 近段时间有不少朋友给我写过邮件,说了一些他们使用的情况和问题. 坦白讲, ...

  6. 基于遗传算法GA算法优化BP神经网络(Python代码实现)

    一. 概述 BP-GA算法的设计︰基于遗传算法的BP神经网络算法(以下简称BP-GA)就是在BP神经网络的学习过程中,将权重和阀值描述为染色体,并选取适宜的适应函数,然后进行GA迭代,直到某种意义上的 ...

  7. 第一部分 利用opencv基于hsv颜色的目标提取效果和python代码

    因为做毕设,想找个地方记录一下毕设当初写的东西. 第一部分,HSV模型进行颜色提取 先放效果图: 图1 左右摄像头采集到的乒乓球图像 图 2 HSV模型颜色提取器 图 2 HSV模型提取的效果图 提取 ...

  8. 基于rnn的语音降噪matlab,基于RNN的音频降噪算法 (附完整C代码)

    前几天无意间看到一个项目rnnoise. 基于RNN的音频降噪算法. 采用的是 GRU/LSTM 模型. 阅读下训练代码,可惜的是作者没有提供数据训练集. 不过基本可以断定他采用的数据集里,肯定有ur ...

  9. 基于MATLAB的矩阵基础(附例题与代码)

    目录 一. 特殊矩阵的输入 1.1 数值矩阵的输入 1.2 随机元素矩阵 1.3 对角元素矩阵 例题1 (1)由行向量生成对角矩阵 (2)由列向量通过转置变成行向量 (3)主对角线上面第k条对角线为向 ...

最新文章

  1. C语言博客作业--数据类型
  2. asp.net七层架构是指什么
  3. 【一起玩光剑】光剑第二期:新建GitHub上传OTA初始程序
  4. Jupyter notebook的内核是什么?Ipython
  5. ubuntu下面markdown转化为word文档
  6. linux模块导出符号 EXPORT_SYMBOL_GPLEXPORT_SYMBOL(转)
  7. java netty能做什么_开发:Netty快速入门,一看就懂!
  8. spark SQL学习(认识spark SQL)
  9. python dataframe去除重复项_python - Pandas DataFrame处理查找DataFrame中的重复项 - 堆栈内存溢出...
  10. LoadModule php5_module modules/libphp5.so在httpd.conf中的由来
  11. SPSS常用的几种统计分析
  12. 灰狼/狼群算法优化支持向量机SVM分类预测matlab代码,支持多分类。 Excel数据格式 ,直接运行 。
  13. opencv中对图片阀值的操作
  14. IDEA打包jar 跳过测试
  15. 历时三年“鸽王”Filecoin主网上线,分布式存储市场将迎来最强劲敌?
  16. openAi注册指南(包括临时邮箱跟临时验证码接收地址验证)
  17. CSS---足球场的实现,纪念2022世界杯(:root的使用)
  18. 【找不到与请求 URI匹配的 HTTP 资源】(转)
  19. 周三多《管理学—原理与方法》第七版笔记和课后习题答案
  20. FM33LC02X FreeRTOS MDK 移植记录总结

热门文章

  1. 【 零 】 Java 随 笔 ( 2 月 9 日 更 新 ---- 贪 吃 蛇 雏 形 )
  2. 计算机横向查找,Excel查找引用函数:HLOOKUP查找首行并显示指定的值-excel技巧-电脑技巧收藏家...
  3. 【备战春招/秋招系列】程序员的简历就该这样写
  4. 中国第21批援赞比亚军医组凯旋
  5. Dreamweaver自带流体布局+自己添加,后附效果,不知代码有错误没?请行家指正!多谢先
  6. 神威超级计算机配置,神威太湖轻型超级计算机配置和性能列表
  7. 几行最简单的代码 ,却改变了世界!
  8. 启动Spring项目报错,Springboot启动报错 Disconnected from the target VM 解决过程
  9. DNS域传送漏洞--vulhub复现
  10. raid5通常需要几块盘_组成raid5阵列最少需要几块硬盘?