我有一些大数用于椭圆曲线加密。目前我使用纯Python进行所有计算,它原生支持通过使用“bignum”整数类型来处理任意大小的数字。但是,出于性能原因,我想对其中一些操作进行矢量化,并希望使用包含256位无符号整数的数组。但据我所知,使用np.longlong
(或无符号版本的np.ulonglong
)在numpy中整数的最大大小为64位。根据下面的帖子的一个想法是将每个256位数表示为具有四个64位整数的数组:
large = 105951305240504794066266398962584786593081186897777398483830058739006966285013
arr = np.array([large.to_bytes(32,'little')]).view('P')
arr
输出:
array([18196013122530525909, 15462736877728584896, 12869567647602165677,
16879016735257358861], dtype=uint64)
而我可以通过以下方式将其转换回本地的Python“大数”:
int.from_bytes(arr.tobytes(), 'little')
输出:
105951305240504794066266398962584786593081186897777398483830058739006966285013
然而,在将其转换回“bignum”之前,我想执行一些操作:
arr2 = arr + 1
int.from_bytes(arr2.tobytes(), 'little')
输出:
105951305240504794072543500697971467357257258687906003363414235534976478560982
当然,这与
large + 1
不相等
在numpy中处理256位数是否可能?如果不行,有没有合适的解决方法?
int
整数类型的任意精度整数。什么是bignum
?另外,不要忘记语言标签。 - Mad Physicistnumpy
意义上,“向量化”意味着使用编译好的numpy
方法。如果这些方法只编译为int64
,那么尝试绕过它们是得不到任何加速的。 - hpauljarr + 1
,而是使用arr + [0, 0, 0, 1]
。 - Mad Physicist