GMPY2(或 GMP)有一个powmod
功能,但除了 python 的 native 之外,我找不到任何用于常规求幂的东西pow
。mpz
整数是否存在这样的函数?
3 回答
只需使用 Python 的标准pow()
函数或指数**
运算符。GMPY2 的mpz
类型重载了所有标准的特殊方法,因此您应该能够使用标准的 Python 命令。
例如:
>>> from gmpy2 import mpz
>>> pow(mpz(3),7)
mpz(2187)
>>> pow(mpz(3),7,13)
mpz(3)
>>> mpz(3)**7
mpz(2187)
>>>
divmod() 等也是如此。
一些性能信息:
gmpy2 pow 的速度是 python pow 的两倍,即使考虑到结构:
>>> timeit.timeit('pow(98765, 10)', number=100000)
0.048412954514788
>>> timeit.timeit('pow(gmpy2.mpz(98765), 10)', number=100000, setup='import gmpy2')
0.024286470230094892
您可以在 mpz 上使用内置功能pow(x,y,modulus)
,但使用 powmod 会快 10% 左右。
>>> timeit.timeit('pow(gmpy2.mpz(987654321),1000,100003)',
number=100000, setup='import gmpy2')
0.057212181510976734
>>> timeit.timeit('gmpy2.powmod(987654321,1000,100003)',
number=100000, setup='import gmpy2')
0.04513445007546579
>>> timeit.timeit('pow(987654321,1000,100003)',
number=100000, setup='import gmpy2')
0.15511784474188062
gmpy2 版本比带有模数的原生 python 快得多(有时快 10 倍)。由于 mpz 的构建时间,使用 powmod 仅比使用 pow/mpz 快一点。
如果你已经有一个 mpz,powmod 和 pow 是绝对等价的。
当然可以。
void mpz_pow_ui (mpz_t rop, const mpz_t base, unsigned long int exp)
void mpz_ui_pow_ui (mpz_t rop, unsigned long int base, unsigned long int exp)
将 rop 设置为 base 提升为 exp。案例 0^0 产生 1。
当然没有mpz_pow(...)
哪个会接受两个mpz_t
输入参数。这样做的原因是,如果内存服务,因为unsigned long
被认为是足够的,而mpz_t e, b
forb^e
可能很容易在内存需求方面不成比例。我似乎找不到提出索赔的邮件列表帖子,但当我找到时,我会发布参考。
编辑:我似乎找不到pow
没有 Python 模运算的纯函数,但这可能是我不够努力的情况。但是,我确实看到了一个sqrt
功能,这意味着您可以实现自己的pow
功能(也是this)。