繁体   English   中英

Charm-crypto 如何在矩阵中进行元素取幂?

[英]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

什么是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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM