小编tor*_*edo的帖子

Python:为固定 exp 和 mod 或通过矢量化加速 pow(base,exp,mod)

我的代码的瓶颈是对非常大的整数重复调用 pow(base,exponent,modulus)(numpy 不支持这么大的整数,大约 100 到 256 位)。但是,我的指数和模数始终相同。我可以以某种方式利用它来通过自定义函数加速计算吗?我尝试定义一个函数,如下所示(下面的函数用于一般模数和指数)。

然而,即使我在没有 while 循环和 if 语句的情况下对固定指数和模数的每个操作进行硬编码,它也比 pow 慢。

def modular_pow(self, base, exponent, modulus):
    result = 1
    base = base % modulus
    while exponent > 0:
        if (exponent % 2 == 1):
            result = (result * base) % modulus
        exponent = exponent >> 1
        base = (base * base) % modulus
    return result
Run Code Online (Sandbox Code Playgroud)

另一种选择是如果我能以某种方式“矢量化”它。我必须计算大约 100000000 个不同基值的 pow。虽然这些值在我的脚本运行之间经常发生变化(因此查找表没有用),但我在运行时就会知道这些值(我可以立即计算它们)。

有任何想法吗?我通过使用 gmpy2 中的 mpz 数据类型获得了一些加速,但它仍然太慢。

python modulo exponentiation modular-arithmetic

3
推荐指数
1
解决办法
2563
查看次数

广播用于元素乘法的3d数组

晚上好,

我需要一些帮助来理解复杂numpy数组的高级广播.

我有:

阵列A:50000x2000

阵列B:2000x10x10

使用for循环实现:

for k in range(50000):
    temp = A[k,:].reshape(2000,1,1)
    finalarray[k,:,:]=np.sum ( B*temp , axis=0)
Run Code Online (Sandbox Code Playgroud)

我想要一个以元素为单位的乘法和轴与2000个元素的求和,以及endproduct:

finalarray:50000x10x10

是否可以避免for循环?谢谢!

python numpy broadcasting

2
推荐指数
1
解决办法
82
查看次数