GMPY2(或GMP)具有powmod
功能,但除了python的本地pow
之外,我找不到任何常规取幂的内容。 mpz
整数是否存在这样的函数?
答案 0 :(得分:7)
只需使用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()等也是如此。
答案 1 :(得分:1)
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 to exp。情况0 ^ 0产生1。
当然没有mpz_pow(...)
会占用两个mpz_t
输入参数。这样做的原因是,如果内存服务,因为unsigned long
被认为是足够的,而mpz_t e, b
的{{1}}可能很容易在内存要求方面变得不成比例。我似乎无法找到提出索赔的邮件列表帖子,但是当我这样做时,我会发布参考文献。
编辑:我似乎没有找到一个纯b^e
函数而没有用于Python的模块化算法,但可能是我不够努力的情况。但我确实看到pow
函数,这意味着您可以implement your own pow
(也this)。
答案 2 :(得分:0)
一些效果信息:
即使考虑到施工因素,gmpy2 pow的速度也是python的两倍:VideoOutput
你可以在mpz上使用内置的>>> timeit.timeit('pow(98765, 10)', number=100000)
0.048412954514788
>>> timeit.timeit('pow(gmpy2.mpz(98765), 10)', number=100000, setup='import gmpy2')
0.024286470230094892
,但使用powmod的速度提高约10%。
pow(x,y,modulus)
gmpy2版本比具有模数的原生python快得多(有时快10倍)。使用powmod只比使用pow / mpz快一点,因为mpz的构建时间。
如果你已经拥有一个mpz,那么powmod和pow就是非常相同的。