sage之数论

R = IntegerModRing(97)
//分数模运算a=2/3 mod 97
a = R(2) / R(3)
//还原a的分数形式
a.rational_reconstruction()
b = R(47)
//计算b的幂次,返回的是50
b^20052005
//检测b是否是模97的平方剩余,b=12^2 mod 97,故b是模97的平方剩余
b.is_square()
//计算原根
gp ( 'znprimroot(7)' )
//或者
pari ( 'znprimroot(7)' )
//计算公约数
gcd(515,2005)
//因式分解
factor(2005)
//计算阶乘
c = factorial(25)
[valuation(c,p) for p in prime_range(2,23)]

对这一行命令:首先,prime_range(2,23)就是2(包括)至23(不包括)之间的素数列表,即[2, 3, 5, 7, 11, 13, 17, 19],那么valuation(c,p)又是什么意思呢?我用几个例子测试之后才明白:若p不整除c,则valuation(c,p)=0;若p整除c,则valuation(c,p)为c的唯一分解式中p的指数。举个例子,valuation(120,5)=1,因为120的唯一分解为2^3 * 3 * 5,可以看到唯一分解式中5的指数为1,于是valuation(120,5)=1。

//大于2005的下一个素数
next_prime(2005)
//小于2005的前一个素数
previous_prime(2005)
//前20个素数
primes_first_n(20)
//产生0-2005之间的随机数
e = ZZ.random_element(2005)
//m,e,n均为大数,计算m^e mod n
c = power_mod(m, e, n); c
//28的因子
divisors(28)
//sigma(n,k)函数:sum_{d|n}d^k,即n的所有正因子的k次方之和
sigma(28,0); sigma(28,1); sigma(28,2)
//扩展的欧几里得算法,d为12与15的公约数且d=u*12+v*15
d,u,v = xgcd(12,15)
//3在模n下的逆
inverse_mod(3,n)
//素因子
prime_divisors(n)
//欧拉函数
phi = n*prod([1 - 1/p for p in prime_divisors(n)]); phi
euler_phi(n)
//可以当做计算n/5
prime_to_m_part(n, 5)
//若n为奇数,odd_part(n)就是n;若n为偶数,则n可被分解为n=2^k * p,p为奇数,则odd_part(n)为p
odd_part(n)
//中国剩余定理,crt是Chinese remainder theorem的缩写;
//下面求解的是方程:x=2 mod 3,x=1 mod 5
x = crt(2, 1, 3, 5); x
//计算二项式
[binomial(13,m) for m in range(14)]
//计算雅克比(m/13),若m是13的平方剩余,(m/13)=1;否则,(m/13)=-1
[kronecker(m,13) for m in range(1,13)]
//莫比乌斯函数
n = 10000; sum([moebius(m) for m in range(1,n)])
//加法分解
Partitions(4).list()
//x的ASCII码
m = [ord(x) for x in "HELLOWORD"]; m
//对消息编码;reversed(m)是一个反向迭代器,ZZ(list,100)代表一个整数,计算方式为:
//list[0]+list[1]*100+...+list[n-1]*100^(n-1)
m = ZZ(list(reversed(m)), 100) ; m

猜你喜欢

转载自blog.csdn.net/ckm1607011/article/details/106819776