8

GMPY2(或 GMP)有一个powmod功能,但除了 python 的 native 之外,我找不到任何用于常规求幂的东西powmpz整数是否存在这样的函数?

4

3 回答 3

9

只需使用 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() 等也是如此。

于 2014-05-17T21:06:56.430 回答
2

一些性能信息:

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 是绝对等价的。

于 2018-04-19T12:50:20.633 回答
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 提升为 exp。案例 0^0 产生 1。

当然没有mpz_pow(...)哪个会接受两个mpz_t输入参数。这样做的原因是,如果内存服务,因为unsigned long被认为是足够的,而mpz_t e, bforb^e可能很容易在内存需求方面不成比例。我似乎找不到提出索赔的邮件列表帖子,但当我找到时,我会发布参考。


编辑:我似乎找不到pow没有 Python 模运算的纯函数,但这可能是我不够努力的情况。但是,我确实看到了一个sqrt功能,这意味着您可以实现自己的pow功能(也是this)。

于 2014-05-17T20:49:41.583 回答