SageMath常用函数
Sage 是一个免费的、开源的数学软件系统,采用GPL协议。它整合了许多开源Python包,采用Python语言编写,但也支持其他语言。
一、算术函数
1.1 基本运算
+、-、*、/
加减乘除大家都懂
近似除法(RealDoubleField)
1 | print(RDF(5/3))#近似除法 |
1 | 1.6666666666666667 |
通常用来在近似计算中将表达式变成实数,损失一定精度,但可以提高计算效率
模除
1 | print(5//3) |
1 | 1 |
幂运算
1 | print(2^3,2**3) |
1 | 8 8 |
向下、向上取整
1 | print(floor(5/3),ceil(5/3)) |
1 | 1 2 |
1.2 最大公因数&最小公倍数
1 | print(gcd(6,9),lcm(6,9)) |
1 | 3 18 |
1.3 扩展欧几里得算法
1 | a=6 |
1 | 3=-1*6+1*9 |
1.4 幂模运算
1 | print("17^20200301(mod 105)="+str(power_mod(17,2020301,105))) |
1 | 17^20200301(mod 105)=47 |
1.5 模逆运算
1 | print("5^-1="+str(inverse_mod(5,14))+"(mod 14)") |
1 | 5^-1=3(mod 14) |
1.7 中国剩余定理
$\begin{cases}
x\equiv1(mod 11)\\
x\equiv2(mod 3)\\
x\equiv3(mod 5)\\
x\equiv4(mod 7)\\
\end{cases}$
1 | print(crt([1,2,3,4],[11,3,5,7])) |
1 | 683 |
即$\begin{cases}x\equiv683(mod 1155)\end{cases}$
1.8 素数相关函数
判断是否为素数
1 | print(is_prime(3),is_prime(4))#判断是否为素数 |
1 | True False |
求第几位素数
1 | print(nth_prime(1),nth_prime(2),nth_prime(10))#第几个素数 |
1 | 2 3 29 |
求小于a的最大素数、大于a的最小素数
1 | print("大于10的最小素数:"+str(next_prime(10))+",小于10的最大素数:"+str(previous_prime(10))) |
1 | 大于10的最小素数:11,小于10的最大素数:7 |
前n个素数
1 | print(primes_first_n(10))#前十个素数 |
1 | [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] |
区间内的素数
1 | print(list(primes(2,30)))#区间[2,30)内的素数,左闭右开 |
1 | [2, 3, 5, 7, 11, 13, 17, 19, 23, 29] |
欧拉函数
1 | print(euler_phi(31))#欧拉函数 |
1 | 30 |
1.9 整数分解
分解整数
1 | print(factor(100)) |
1 | 2^2 * 5^2 |
椭圆曲线分解寻找素因子
1 | print(ecm(1234567)) |
1 | GMP-ECM 7.0.4 [configured with MPIR 3.0.0, --enable-asm-redc] [ECM] |
二次筛法分解
1 | print(qsieve(12345678901234567890123456789012345678902)) |
1 | ([2, 22, 6418, 70598, 349745854025172608009389976741900498, 3847204394276898688103289744160905478, 1122334445566778899102132435364758698082], '') |
仅求出素因子
1 | print(prime_divisors(100)) |
1 | [2, 5] |
二、代数系统
2.1 P元有限域
有限域$z_7$
1 | k1=GF(7) |
操作$z_7$上的元素
1 | a=k1(5) |
1 | 5 1 3 |
求解$x^5\equiv2(mod 7)$和$x^2\equiv2(mod 7)$
1 | print(k1(2).nth_root(5),k1(2).sqrt(2)) |
1 | 4 3 |
$z_7$的模多项式,以及其根
1 | print(k1.modulus(),k1.gen()) |
1 | x + 6 1 |
用本原多项式生成$z^7$
1 | k2=GF(7,modulus='primitive') |
1 | x + 4 3 |
2.2 $p^n$元有限域
定义一个$z^{7^3}$的有限域,以及对应的本原多项式、本原多项式的根、有限域元素个数、元素的阶
1 | k1.<x>=GF(7^3,modulus='primitive') |
1 | x^3 + 6*x^2 + 4 |
在有限域中计算$x^{100}$
1 | print(x^100) |
1 | 2*x^2 + x + 4 |
指定不可约多项式生成有限域,如$x^3+2*x^2+1$
1 | k2.<a>=GF(7^3,modulus=[1,0,2,1])#低次写到高次的系数 |
1 | x^3 + 2*x^2 + 1 |
计算极小多项式,可通过列表获取系数
1 | print(a^100) |
1 | 2*a^2 + 5*a + 4 |
2.3 整数环
环的定义
1 | r=Zmod(26) |
1 | 20 |
求逆、求离散对数、判断是否平方元、求平方根
1 | a^-1,a.log(7),a.is_square(),a.sqrt() |
1 | (3, 4, True, 3) |
求a的乘法阶和加法阶
1 | a.multiplicative_order(),a.additive_order() |
1 | (3, 26) |
求a的极小多项式
1 | print(a.minimal_polynomial()) |
1 | x + 17 |
2.4 多项式环
一元多项式环
1 | R.<x>=ZZ[]#定义R为整系数上的多项式环,文字为x |
1 | False (2*x + 1)^2 |
定义多项式的两种方式
1 | g=3*x^2+2*x+1#直接定义 |
1 | True |
模除多项式、查找多项式的整数解
1 | print(f.factor_mod(3)) |
1 | (x + 2)^2 |
环上的多项式
1 | R.<x>=Zmod(26)[]#定义R为Z26上的环,文字为x |
1 | x^4 + x^3 + x^2 + 2*x + 1 |
域上的多项式
1 | R.<x>=Zmod(13)[]#定义R为Z13上的环,文字为x 与GF(13)相同 |
1 | False (x + 1) * (x + 6) * (x^2 + 7*x + 11) |
三、矩阵操作
定义整数环上的矩阵,并作求逆运算
1 | mt=matrix(r,2,2,[[24,15],[19,14]])#定义矩阵并赋值 |
1 | 24 |
矩阵乘法
1 | mt2=matrix(r,2,2,[[17,23],[23,20]]) |
1 | [17 23] |