gmpy2 & sympy¶
gmpy2/sympy 是一个 Python 库,用于进行任意精度整数和有理数的算术运算。它提供了高性能的 GMP 和 MPIR 库的接口,可以处理非常大的整数和有理数。
- 安装指令
pip install gmpy2
pip install sympy
- 适合:大数运算
gmpy2¶
下面我们简单地使用一些基本的用法(这些功能 sage 都能够快速实现,所以不详细讲解了
gmpy2.is_prime(n)
: 检查一个整数n
是否为素数。gmpy2.next_prime(n)
: 返回大于n
的下一个素数。gmpy2.prev_prime(n)
: 返回小于n
的上一个素数。gmpy2.gcd(a, b)
: 计算a
和b
的最大公约数。gmpy2.lcm(a, b)
: 计算a
和b
的最小公倍数。gmpy2.invert(a, m)
: 计算a
在模m
下的乘法逆元。gmpy2.powmod(a, b, m)
: 计算a
的b
次幂模m
。gmpy2.is_power(n)
: 检查n
是否为完全幂。gmpy2.root(a, b)
: 计算a
的b
次方根。gmpy2.iroot(a, b)
: 计算a
的b
次方根,返回一个元组,包含结果和布尔值,表示是否为完全幂。
In [2]:
Copied!
import gmpy2
gmpy2.gcd(6,18), gmpy2.invert(4,23), gmpy2.powmod(2,11,13), gmpy2.is_prime(564587462423644586312345678908654325263456667), gmpy2.iroot(125, 3), gmpy2.next_prime(100)
import gmpy2
gmpy2.gcd(6,18), gmpy2.invert(4,23), gmpy2.powmod(2,11,13), gmpy2.is_prime(564587462423644586312345678908654325263456667), gmpy2.iroot(125, 3), gmpy2.next_prime(100)
Out[2]:
(mpz(6), mpz(6), mpz(7), False, (mpz(5), True), mpz(101))
In [7]:
Copied!
import sympy
sympy.prime(9), sympy.isprime(564587462423644586312345678908654325263456667), sympy.primepi(101), sympy.prevprime(101), sympy.nextprime(101), sympy.nthroot_mod(18, 2, 23, all_roots=True)
import sympy
sympy.prime(9), sympy.isprime(564587462423644586312345678908654325263456667), sympy.primepi(101), sympy.prevprime(101), sympy.nextprime(101), sympy.nthroot_mod(18, 2, 23, all_roots=True)
Out[7]:
(23, False, 26, 97, 103, [8, 15])
In [ ]:
Copied!
import sympy
n= 23298836191712395990541254600776262066247692725919114528027158820049802443474994576179738462067629079873633948850637889127452791527914591229415148712172587856497614285410824614070907847594399218298016379507879066220104597707859246179921731928508884947347652904142879813069359815823184922170241099916465722623
e = 9
c= 9314530945343661153059846131608414257092556390479105017633636336832925597262814680689800448223193301814365726128618348603188219757245073917910487794768758461683644600756896595336654006282030911824869219015400826589122838492456940861634378619000373353637666835642505021355710338342048772713981673863167110471
# c = pow(m, e, n)
sympy.nthroot_mod(c, e, n, all_roots=True)
import sympy
n= 23298836191712395990541254600776262066247692725919114528027158820049802443474994576179738462067629079873633948850637889127452791527914591229415148712172587856497614285410824614070907847594399218298016379507879066220104597707859246179921731928508884947347652904142879813069359815823184922170241099916465722623
e = 9
c= 9314530945343661153059846131608414257092556390479105017633636336832925597262814680689800448223193301814365726128618348603188219757245073917910487794768758461683644600756896595336654006282030911824869219015400826589122838492456940861634378619000373353637666835642505021355710338342048772713981673863167110471
# c = pow(m, e, n)
sympy.nthroot_mod(c, e, n, all_roots=True)