Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python 3计算gf(2^8)中乘法逆的纯Python方法_Python_Python 3.x_Galois Field_Finite Field - Fatal编程技术网

使用Python 3计算gf(2^8)中乘法逆的纯Python方法

使用Python 3计算gf(2^8)中乘法逆的纯Python方法,python,python-3.x,galois-field,finite-field,Python,Python 3.x,Galois Field,Finite Field,如何在Python3中实现GF2^8中的乘法逆? 我当前的功能如下所示: def gf_add(a, b): return a ^ b def gf_mul(a, b, mod=0x1B): p = bytes(hex(0x00)) for i in range(8): if (b & 1) != 0: p ^= a high_bit_set = bytes(a & 0x80) a

如何在Python3中实现GF2^8中的乘法逆? 我当前的功能如下所示:

def gf_add(a, b):
    return a ^ b

def gf_mul(a, b, mod=0x1B):
    p = bytes(hex(0x00))
    for i in range(8):
        if (b & 1) != 0:
            p ^= a
        high_bit_set = bytes(a & 0x80)
        a <<= 1
        if high_bit_set != 0:
            a ^= mod
        b >>= 1
    return p
def gf_添加(a,b):
返回a^b
def gf_mul(a、b、mod=0x1B):
p=字节(十六进制(0x00))
对于范围(8)中的i:
如果(b&1)!=0:
p^=a
高位设置=字节(a&0x80)
a=1
返回p
以下是我的做法:

def gf_degree(a) :
  res = 0
  a >>= 1
  while (a != 0) :
    a >>= 1;
    res += 1;
  return res

def gf_invert(a, mod=0x1B) :
  v = mod
  g1 = 1
  g2 = 0
  j = gf_degree(a) - 8

  while (a != 1) :
    if (j < 0) :
      a, v = v, a
      g1, g2 = g2, g1
      j = -j

    a ^= v << j
    g1 ^= g2 << j

    a %= 256  # Emulating 8-bit overflow
    g1 %= 256 # Emulating 8-bit overflow

    j = gf_degree(a) - gf_degree(v)

  return g1

如评论中所述,您也可以使用对数方法,或者简单地使用蛮力(尝试各种乘法组合)。

以下是我的做法:

def gf_degree(a) :
  res = 0
  a >>= 1
  while (a != 0) :
    a >>= 1;
    res += 1;
  return res

def gf_invert(a, mod=0x1B) :
  v = mod
  g1 = 1
  g2 = 0
  j = gf_degree(a) - 8

  while (a != 1) :
    if (j < 0) :
      a, v = v, a
      g1, g2 = g2, g1
      j = -j

    a ^= v << j
    g1 ^= g2 << j

    a %= 256  # Emulating 8-bit overflow
    g1 %= 256 # Emulating 8-bit overflow

    j = gf_degree(a) - gf_degree(v)

  return g1

如评论中所述,您也可以使用对数方法,或者简单地使用蛮力(尝试各种乘法组合)。

您可以查看my(其他人实际上没有使用过)并使用
GF2Element

from libgf2 import GF2Element

x = GF2Element(0x8, 0x11B)
x.inv 
# find the inverse of x^3 in the quotient ring GF(2)[x]/p(x)
# where p(x) = x^8 + x^4 + x^3 + x + 1 (0x11B in bit vector format)
有关更多详细信息,请参阅


注意:libgf2在Python2.7中,因此您必须移植到Python3,但它是一个相当小的库。

您可以查看my(其他人实际上没有使用过它)并使用
GF2Element

from libgf2 import GF2Element

x = GF2Element(0x8, 0x11B)
x.inv 
# find the inverse of x^3 in the quotient ring GF(2)[x]/p(x)
# where p(x) = x^8 + x^4 + x^3 + x + 1 (0x11B in bit vector format)
有关更多详细信息,请参阅



注意:libgf2在Python2.7中,因此必须移植到Python3,但是它是一个相当小的库。

我真的不知道
mod
部分在做什么。有限域中的乘法是两个多项式的乘法,然后除以一个模。结果是乘积。最好的方法可能是用生成器g的幂制作一个表(根据定义,g的幂包括字段中除0以外的所有元素,并且
g**255==1
)。您可以找到g的哪个指数对应于要反转的元素(称为e),然后找到对应于指数(255-e)的元素,这将是乘法逆。它基本上使用对数。而且,有限域总是有生成器。我不太明白
mod
部分在做什么。有限域中的乘法是两个多项式的乘法,然后除以模。结果是乘积。最好的方法可能是用t生成一个表生成器g的幂(根据定义,g的幂包括字段中除0和
g**255==1
)之外的每个元素。您可以找到g的哪个指数对应于要反转的元素(称为e),然后找到对应于指数(255-e)的元素也就是有限的域总是有生成器。我理解有限域,但不知道你的代码实际使用什么算法。Jason公平地在C++的GF2^ x库中实现这个(并将它移植到Python上进行这个答案),我不记得这个名字。(或作者)但是,我确实记得我的实现是基于我使用的教科书中的一个算法。@JasonS-这似乎是的一个变体。如果mod设置为0x11B,则可以使用扩展欧几里德算法的典型实现,而不需要度函数或%=256行。如果使用典型方法,则需要进行检查结尾需要:
if(g1<0)g1+=mod
。注意,如果使用日志表,对于mod 0x11b,字段中除0以外的每个数字都是3的幂(与通常的2相比)。好的,这很有意义,因此它试图在多项式环GF(2)[x]中解ka+mv=1,其中a=要求逆的多项式,v=
0x11b
@JasonS-正确且只需计算
k
,求逆不需要
m
。如果确实需要
m
,可以使用
h1
h2
,从
h1=0
h2=1
。对于软件,可以使用256字节的表。在硬件中,可以通过使用子字段映射来减少256字节表所需的门计数,如中所述,子字段映射也使用mod==0x11B,将8位字段映射到两个4位字段,然后映射到四个2位字段。我了解有限字段,但不知道是什么你的代码实际使用的是.jason,公平地说,我在C++的GF2^ x库中实现了这一点(并把它移植到Python上进行这个答案),我不记得这个名字(或作者)但是,我确实记得我的实现是基于我使用的教科书中的一个算法。@JasonS-这似乎是的一个变体。如果mod设置为0x11B,则可以使用扩展欧几里德算法的典型实现,而不需要度函数或%=256行。如果使用典型方法,则需要进行检查结尾需要:
if(g1<0)g1+=mod
。注意,如果使用日志表,对于mod 0x11b,字段中除0以外的每个数字都是3的幂(与通常的2相比)。好的,这很有意义,因此它试图在多项式环GF(2)[x]中解ka+mv=1,其中a=要求逆的多项式,v=
0x11b
@JasonS-正确且只需计算
k
,求逆不需要
m
。如果确实需要
m
,可以使用
h1
h2
,从
h1=0
h2=1
。对于软件,可以使用256字节的表。在硬件中,可以通过使用子字段映射来减少256字节表所需的门计数,如中所述,子字段映射也使用mod==0x11B,将8位字段映射到两个4位字段,然后映射到四个2位字段。