对用户自定义类型的矩阵执行Numpy操作
在我的密码学项目中,我需要处理GF(2^8)的算术运算。简单来说,这个领域里的加法运算其实就是普通的异或(XOR)操作,而乘法运算a*b则是(a*b)模m(x)。你可以跳过这部分数学内容。
我的任务是对一个4x4的矩阵在GF(2^8)中进行求逆。这并不难,但手动重新实现每个矩阵操作实在是太繁琐了。我想利用numpy中的这个功能(求矩阵的逆),但是我无法让numpy在矩阵的元素之间使用我的操作。也就是说,我希望在进行加法时,使用'+'时能执行异或操作,而不是普通的加法。
我创建了一个自定义类型的类,叫做GF28。相关代码如下:
class GF28(float):
def __init__(self, value):
self.value = value
def __add__(self, b):
if isinstance(b, GF28):
return GF28(ops.add(self.value, b.value))
else:
return GF28(ops.add(self.value, b))
__rsub__ = __isub__ = __sub__ = __radd__ = __iadd__ = __add__
def __mul__(self, b):
if isinstance(b, GF28):
return GF28(ops.mul(self.value, b.value))
else:
return GF28(ops.mul(self.value, b))
__rmul__ = __imul__ = __mul__
def __div__(self, b):
return self.__mul__(self.inv(b))
__rdiv__ = __idiv__ = __div__
def inv(self):
return GF28(ops.inv(self.value))
def __float__(self):
return self
然后我使用以下代码创建了一个由这些GF28元素组成的矩阵:
a = array([[GF28(10), GF28(20), GF28(30)],
[GF28(12), GF28(21), GF28(4)],
[GF28(9), GF28(16), GF28(13)]])
看起来只有float()这个转换函数被使用了,其他的都没有被触及。
请帮我实现这个操作重载的功能。非常感谢。
[编辑] 基本的矩阵操作已经可以了。如果有人能让我在矩阵求逆时也能用这个功能,我会非常感激。谢谢!
1 个回答
2
把 a
声明为 dtype
类型为 object
:
a = np.array([(GF28(10), GF28(20), GF28(30)),
(GF28(12), GF28(21), GF28(4)),
(GF28(9), GF28(16), GF28(13))],dtype='object')
那么数组里面的元素类型就是 GF28
。比如说:
type(a[0,0])
# <class '__main__.GF28'>