您好我正在为AES混合色谱柱阶段编写程序。在这里,我必须乘以(4,4)
形状的两个矩阵。唯一的区别是,虽然乘以两个矩阵,但我必须采用“xor”和“xor”。而不是我必须添加的地方。例如
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.dot(a,b) # this gives [[(1*5+2*7),(1*6+2*8)][(3*5+4*7),(3*6+4*8)]]
# but I want [[((1*5)^(2*7)),((1*6)^(2*8))][((3*5)^(4*7)),((3*6)^(4*8))]]
这是带循环的解决方案
result = [[0,0,0,0],
[0,0,0,0],
[0,0,0,0],
[0,0,0,0]]
# iterate through rows of X
for i in range(len(X)):
# iterate through columns of Y
for j in range(len(Y[0])):
# iterate through rows of Y
for k in range(len(Y)):
result[i][j] = result[i][j] ^ (X[i][k] * Y[k][j])
如何在不使用循环的情况下实现这一目标?
答案 0 :(得分:0)
xor_ab=np.bitwise_xor.reduce(a[...,None]*b,axis=1)
为了便于说明,请考虑一个矩形问题,以便于识别:
a=np.arange(12).reshape(4,3).astype(object)
b=np.arange(12).reshape(3,4).astype(object)
对象是为AES提供python int任意精度。
产品通过广播获得,
c=a[...,None]*b # dims : (4,3,1) * ((1),3,4) -> (4,3,4) , c_ijk =a_ij*b_jk
然后通过以下方式获得点积:
dot_ab=c.sum(axis=1) # ->(4,4)
In [734]: (dot_ab==a.dot(b)).all()
Out[734]: True
然后更改为等效的xor函数:
xor_ab=np.bitwise_xor.reduce(a[...,None]*b,axis=1)
作为替代方案,您可以使用numba(0.23)解释您的循环:
from numba import jit
@jit(nopython=True)
def xor(X,Y):
result=np.zeros((4,4),np.uint64)
for i in range(len(X)):
# iterate through columns of Y
for j in range(Y.shape[1]):
# iterate through rows of Y
for k in range(len(Y)):
result[i,j] = result[i,j] ^ (X[i,k] * Y[k,j])
return result
由于最佳内存使用率,效率显着提升。 但是对于a和b:
,限制为32位In [790]: %timeit xor(a,b)
1000000 loops, best of 3: 580 ns per loop
In [791]: %timeit xor_ab=np.bitwise_xor.reduce(a[...,None]*b,axis=1)
100000 loops, best of 3: 13.2 µs per loop
In [792] (xor(a,b)==np.bitwise_xor.reduce(a[...,None]*b,axis=1)).all()
Out[792]: True