【发布时间】:2021-07-01 18:25:55
【问题描述】:
我有一些用于椭圆曲线密码学的大数。到目前为止,我一直在使用“bignum”整数类型在原生支持任意大小的数字的普通 python 中进行所有计算。但是,我想对其中一些操作进行矢量化(出于性能原因),并想使用一个包含 256 位无符号整数的数组。但是AFAIK通过使用np.longlong(或np.ulonglong对于无符号版本),numpy中整数的最大大小是64位。 the following post 的一个想法是将每个 256 位数字表示为一个包含四个 64 位整数的数组:
large = 105951305240504794066266398962584786593081186897777398483830058739006966285013
arr = np.array([large.to_bytes(32,'little')]).view('P')
arr
输出:
array([18196013122530525909, 15462736877728584896, 12869567647602165677,
16879016735257358861], dtype=uint64)
我可以通过执行以下操作将其转换回本机 python“bignum”:
int.from_bytes(arr.tobytes(), 'little')
输出:
105951305240504794066266398962584786593081186897777398483830058739006966285013
但是,我想在将其转换回“bignum”之前进行一些操作:
arr2 = arr + 1
int.from_bytes(arr2.tobytes(), 'little')
输出:
105951305240504794072543500697971467357257258687906003363414235534976478560982
当然不等于large + 1
是否可以在 numpy 中处理 256 位数字?如果没有,是否存在任何合适的解决方法?
【问题讨论】:
-
Python 支持使用
int整数类型的任意精度整数。bignum是什么?另外,不要忘记语言标签 -
您必须自己有效地实施所有操作。到那时,直接用 C 语言编写可能会更快/更容易,因为您可以绕过 python 的循环,例如,您需要这样做。结转数字。
-
"vectorize" 在 fast(er)
numpy意义上意味着使用已编译的numpy方法。如果这些方法仅针对int64编译,则尝试绕过它们将不会获得任何速度。 -
另外,不要做
arr + 1,而是做arr + [0, 0, 0, 1] -
@hpaulj。取决于你是怎么做的