SageMath代码
1.同余运算
R.<x> = Zmod(module)[]
相当于将 x 作为需要求得的未知数 Zmod()内填入同余运算的模数
f = x^3 + ...
将同余运算的所有项移到同一边,赋值给函数 f 来表示
f.roots()
运行之后就求解出来;以列表形式返回所有解 列表内部是元组类型
f.smallroots(upper)
以upper作为求解的上限
eg
需要求解
$ n^2\equiv p^3+ap^2+bp\pmod{moudle} $
把同余式移到一边
$ 0\equiv p^3+ap^2+bp-n^2\pmod{moudle} $
已知 a,b,n,moudle 要求p
R.<p> = Zmod(moudle)[]
f = p^3 + a*p^2 + b*p - n^2
f = f.monic()
roots = f.small_roots()
那么 p 的所有满足该同余式的解就会返回出来
PR.<x> = PolynomialRing(Zmod(n))
f = (M + x*r)**e - c
f = f.monic()
roots = f.small_roots()
2.基本运算
sage的大部分基本运算和python都一样、
比较运算符
== <= >= < >
数学运算符
2**3 代表幂运算 ^ 和 **的作用一样
% 对于整型参数 %代表mod运算
/
//
常见的数学函数
sqrt(4) #2
sin()
cos()
#有些数学表达式返回的是精确的值而不是近似值,要想得到近似值使用函数n或者方法n(均有一个长名称,numerical_approx,并且函数N和n相同),它们都有可选参数prec,即所需的比特位精度以及digits,即所需的十进制位精度
exp(2) e^2
n(exp(2)) #7.38905609893065
sin(10).n(digits=5) #-0.54402
numerical_approx(pi,prec=200) #3.1415926535897932384626433832795028841971693993751058209749
3.基础代数和微积分
solve函数用来求解方程
x=var('x')
solve(x^2+3*x+2,x)
也可以求解用其他变量表示另一个变量
x,b,c=var('x b c')
solve([x^2+b**x+c==0],x)
#[x == -sqrt(-b^x - c), x == sqrt(-b^x - c)]
也可以求解多个变量
x,y=var('x y')
solve([x+y==6,x-y==4],x,y)
微分函数
u=var('u')
diff(sin(u),u)
#cos(u)
求四阶导数
diff(sin(x^2),x,4)
求偏导数
求x^2 + 17*y^2
x,y=var('x,y')
f=x^2+17*y^2
f.diff(x)
f.diff(y)
积分函数
integral(x*sin(x^2),x)
-1/2*cos(x^2)
4.基础的环
整数环 ZZ
有理数环 QQ
实数环 RR
复数环 CC
ratpoly.<t>=PolynomialRing(QQ) #这里的ratpoly和realpoly没什么很大区别无关紧要
realpoly.<z>=PolynomiaRing(RR)
factor(t^2 - 2) #无结果
factor(z^2 -2) #(z - 1.41421356237310) * (z + 1.41421356237310)
5.线性代数
创建矩阵和实现矩阵运算
A = Matrix([[1,2,3],[3,2,1],[1,1,1]])
w = vector([1,1,-4])
w*A
(0, 0, 0)
A*w
(-9, 1, -2)
求解矩阵方程是容易的,使用solve_right方法求解A.solve_right(Y)返回使得AX=Y成立的矩阵或向量X:
A = Matrix([[1,2,3],[3,2,1],[1,1,1]])
Y = vector([0,-4,-1])
X = A.solve_right(Y)
#(-2, 1, 0)
反斜杠 \ 可以用来代替solve_right A\Y
A\Y
#(-2, 1, 0)
6.多项式
一元多项式
第一种方法
R = PolynomialRing(QQ, 't')
这将创建一个多项式环,并告诉Sage在向屏幕打印时使用(字符串)“t”作为未定元。然而,这并未定义供Sage使用的符号t,因此您不能使用它输入属于R的多项式(例如t^2+1).
第二种方法
S = QQ['t']
第三种方法
R.<t> = PolynomialRing(QQ)
R.<t> = QQ['t']
7.数论函数
gcd(10,25) #5
factor(35) #5*7
next_prime(2005) #2011
previous_prime(2005) #2003
#扩展欧几里得算法
d,u,v = xgcd(12,15)
d == u*12 + v*15
True
phi=euler_phi(n)
中国剩余定理
x = crt(2, 1, 3, 5)