![](/img/trans.png)
[英]How to install Charm-crypto library for python3 on windows 10?
[英]Charm-crypto how to do elementwise exponentiation in matrix?
我正在研究一个与 Charm jhuisi link合作的密码学课程项目。 我有两个 numpy 矩阵:V(2,3) 属于 ZR,M(3x2) 属于 G1。 我想把 V 带到 G1,所以我可以对 M^V 取幂。 要执行此操作,在 Charm 中我不能简单地使用 M**V,但我必须逐个元素地执行此操作。
from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
import numpy as np
M = np.array([[group.random(G1) for i in range(2)] for j in range(3)])
V_t = np.transpose(np.array([[group.random(ZR) for i in range(2)] for j in range(3)]))
matrix = np.array([[M[i][j] ** V[j][i] for j in range(3)] for i in range(2)]
但它返回给我一个错误"IndexError: index 2 is out of bounds for axis 0 with size 2"
以前用过Charm的人可以帮帮我吗?
您的索引不只是错误的方式吗?
import numpy as np
from numpy.random import random
M = np.array([[random() for i in range(2)] for j in range(3)])
V = np.transpose(np.array([[random() for i in range(2)] for j in range(3)]))
matrix = [[M[i][j] ** V[j][i] for j in range(2)] for i in range(3)]
这是一个疯狂的想法。 尝试:
import numpy as np
from god_knows_what import random
M = np.array([[random() for i in range(2)] for j in range(3)], dtype=object)
V = np.transpose(np.array([[random() for i in range(2)] for j in range(3)], dtype=object))
matrix = np.array([[M[i][j] ** V[j][i] for j in range(2)] for i in range(3)], dtype=object)
如果最后一行失败,请尝试
matrix = np.array([[M[i][j] ** V[j][i] for j in range(3)] for i in range(2)], dtype=object)
您的代码是 python 列表和 numpy arrays 的混淆组合。 让我们首先使用列表进行计算,并特别注意保持索引正确。
制作 2 个列表:
In [358]: M = [[1,2,3],[4,5,6]]
In [359]: V = [[1,2],[3,4],[5,6]]
从一个空列表开始,用一个新列表填充它:
In [360]: res = []
In [361]: for i in range(2):
...: res1 = []
...: for j in range(3):
...: res1.append(M[i][j]**V[j][i])
...: res.append(res1)
...:
In [362]: res
Out[362]: [[1, 8, 243], [16, 625, 46656]]
注意i
range 是 2, j
range 是 3,匹配列表的长度。
使用 numpy arrays 进行相同的计算:
In [363]: np.array(M)**np.array(V).T
Out[363]:
array([[ 1, 8, 243],
[ 16, 625, 46656]])
np.array(M)
是 (2,3) 形状; np.array(V)
是 (3,2)。 要执行元素幂, V
必须转置为 (2,3)。
嵌套循环可以写成一种理解——同样注意索引:
In [364]: [[M[i][j]**V[j][i] for j in range(3)] for i in range(2)]
Out[364]: [[1, 8, 243], [16, 625, 46656]]
什么是V_t
? 我懂了
In [365]: from random import random
In [366]: V = np.transpose(np.array([[random() for i in range(2)] for j in rang
...: e(3)]))
In [367]: V
Out[367]:
array([[0.8748556 , 0.10373381, 0.23399403],
[0.95388354, 0.24060715, 0.38468676]])
In [368]: V.shape
Out[368]: (2, 3)
您是否进行了一些未记录的转置来产生(3,2)? 如果是这样,那么您需要使用V_t[i][j]
。 您的问题仅仅是因为使用了转置的草率造成的吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.