【问题标题】:Perform Numpy operation on matrix of user-defined type items对用户定义类型项的矩阵执行 Numpy 操作
【发布时间】:2011-09-18 18:16:16
【问题描述】:

在我的密码学项目中,我必须处理 GF(2^8) 算术运算。本质上,这个字段(GF(2^8) 的求和运算是正常的异或运算,乘积运算 a*b 是 (a*b) mod m(x)。您可以跳过这部分数学部分。

我的工作是在 GF(2^8) 中逆矩阵 4x4。这并不难,但是手动重新实现每个矩阵运算太繁琐了。我想在 numpy 中使用这个功能(逆矩阵),但我无法让 numpy 在矩阵的项目之间使用我的操作。说,而不是使用“+”执行两个项目之间的添加,我希望它在使用“+”操作时执行 XOR。

我创建了一个属于我的客户类型的类,称为 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() 强制转换函数,其余部分根本没有触及。

请帮助我使这个操作覆盖工作。非常感谢。

[edit] 执行基本的矩阵运算已经可以了。如果有人可以通过矩阵求逆来完成这项工作,我将非常感激。谢谢!

【问题讨论】:

    标签: python cryptography numpy


    【解决方案1】:

    声明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'>
    

    【讨论】:

    • 非常感谢。您的解决方案适用于正常操作(例如,mat(a)*mat(b)),但是在应用逆操作时,结果不是我所期望的......
    • @wakandan: np.linalg.inv 调用 np.linalg.solve,后者调用 lapack 例程,例如 zgesvdgesv。这些 fortran 函数需要浮点数,因此如果您调用 np.linalg.inv,我认为您将 GF28 对象与 numpy 结合的想法不会奏效。
    • 嗨。嗯,这意味着这些底层 Fortran 函数将无法正确操作我的数据?我们能否以某种方式将这些底层函数挂钩以使用我们的实现?它仍然会很乏味,但至少我们不必重写所有内容......
    • @wakandan:我怀疑这会很难。也许找到矩阵求逆的纯 Python 实现会容易得多。由于 Python 使用鸭子类型,它可以在不做任何更改的情况下与您的 GF28 矩阵一起使用。
    • 您能否将这些 cmets 的结果放入答案本身?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-11-30
    • 1970-01-01
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    相关资源
    最近更新 更多