python 在有限域(伽罗瓦域 galois)上进行计算

本文介绍了一个基于python的有限域库,旨在帮助读者利用此库获取有限域上的计算结果或是对有限域上的计算进行验证,部分案例参考了该库的官方文档说明。如果你对本文其中的一些运算过程有疑惑,建议查看这篇博客

安装第三库

python3 -m pip install galois

用例

指定有限域

import galois
GF = galois.GF(2**5)
print(GF.properties)
# 输出
# Galois Field:
#  name: GF(2^5)
#  characteristic: 2
#  degree: 5
#  order: 32
#  irreducible_poly: x^5 + x^2 + 1
#  is_primitive_poly: True
#  primitive_element: x

指定了一个有限域为 G F ( 2 5 ) GF(2^5) GF(25),包含2种系数0和1,多项式的次数为5,有限域的阶为32,即元素个数为32,不可约多项式为 x 5 + x 2 + 1 x^5 + x^2 + 1 x5+x2+1。经过测试在 G F ( 2 m ) GF(2^m) GF(2m)有限域上,最大为 2 127 2^{127} 2127,若为 2 128 2^{128} 2128会报错。

指定有限域上的元素或元素构成的数组

import galois
GF = galois.GF(2**8)
x = GF([254,253,252])
print(x)
# 输出
# [254,253,252]
# y = GF(2**8+1) # 报错

如上面代码所示,我们定义了一个有限域 G F ( 2 8 ) GF(2^8) GF(28)上的数组,其包含三个元素分别为255,254和253。这里的255,254和253相当于要表示多项式11111111( x 7 + x 6 + x 5 + x 4 + x 3 + x 2 + x + 1 x^7+x^6+x^5+x^4+x^3+x^2+x+1 x7+x6+x5+x4+x3+x2+x+1)、11111110和11111101,而代码直接用10进制数进行表示了。那如果我们指定的有限域是 G F ( 3 6 ) GF(3^6) GF(36),那这里的相当于要表示多项式100102( x 5 + x 2 + 2 x^5+x^2+2 x5+x2+2)、100101和100100。我们知道 2 8 2^8 28表示是有限域上元素的个数,当我们如果指定一个超出有限域范围的值时,则程序会报错。

以多项式形式查看有限域上的元素

x1 = [23,123,56,64]
GF = galois.GF(2**8,display="poly")
print(GF(x1))
GF = galois.GF(3**8,display="poly")
print(GF(x1))
# 输出
# [            α^4 + α^2 + α + 1, α^6 + α^5 + α^4 + α^3 + α + 1,
#               α^5 + α^4 + α^3,                           α^6]
# [        2α^2 + α + 2, α^4 + α^3 + α^2 + 2α,             2α^3 + 2,
#       2α^3 + α^2 + 1]

有限域上加法和乘法

对于单个元素的加法和乘法

x = GF(34)
y = GF(23)
c = x+y
print(c)
d = x*y
print(d)
# 输出
# α^3 + 2α^2
# 2α^5 + α^4 + α^2 + 2α + 2

对于整个数组进行的加法或乘法

x = GF([184, 25, 157, 31])
y = GF([179, 9, 139, 27])
c = x+y
print(c)
d = x*y
print(d)
# 输出
# [                       α^4,                     2α + 1,
# 2α^4 + α^3 + 2α^2 + 2α + 2,               2α^3 + α + 1]
# [α^5 + α^4 + 2α^3 + 2α^2 + 2α,            2α^4 + 2α^3 + α^2,
#  α^7 + α^5 + 2α^4 + α^2 + 2,              α^6 + α^4 + α^3]

该库同样支持numpy

import numpy as np
x = GF([184, 25, 157, 31])
y = GF([179, 9, 139, 27])
a = np.dot(x,y)
print(a)
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值