sagemath中常用的命令

解方程:

solve 函数用于解方程。要使用它,先要指定变量,然后将方程(或方程组)以及要求解的变量作为参数 传给 solve。

sage: var('x y p q')
sage: eq1 = p+q==9 
sage: eq2 = q*y+p*x==-6 
sage: eq3 = q*yˆ2+p*xˆ2==24 
sage: solve([eq1,eq2,eq3,p==1],p,q,x,y) 

[[p == 1, q == 8, x == -4/3*sqrt(10) - 2/3, y == 1/6*sqrt(2)*sqrt(5) - 2/3], [p == 1, q == 8, x == 4/3*sqrt(10) - 2/3, y == -1/6*sqrt(2)*sqrt(5) - 2/3]]

要求解的近似值,可以这样:
sage: solns = solve([eq1,eq2,eq3,p==1],p,q,x,y, solution dict=True) 
sage: [[s[p].n(30), s[q].n(30), s[x].n(30), s[y].n(30)] for s in solns] 

[[1.0000000, 8.0000000, -4.8830369, -0.13962039], [1.0000000, 8.0000000, 3.5497035, -1.1937129]]
求解方程的数值解

求解方程的数值解

用 find root 在区间 0 < ϕ < π/2 上寻找上述方程的解。

sage: phi = var('phi') 
sage: find root(cos(phi)==sin(phi),0,pi/2) 

0.785398163397448..

基本的环

• 整数环 {…,−1,0,1,2,…}, Sage 中叫 ZZ;

• 有理数环 ,即整数构成的分数,Sage 中叫 QQ;

• 实数环,Sage 中叫 RR;

• 复数环,Sage 中叫 CC;

sage: ratpoly.<t> = PolynomialRing(QQ)

ratpoly是集合的名字,自己定义

.<t>是变量的名字,自己定义

PolynomialRing()是环

QQ是有理数环

有限域还有,GF(2)、GF(2^8,modulus=[1,0,0,1,1,1,0,0,1]) ……

线性代数

使用方法 solve right. 执行 A.solve right(Y) 返回一个矩阵(或向量)X 满 足 AX = Y:

sage: A = Matrix([[1,2,3],[3,2,1],[1,1,1]]) 
sage: Y = vector([0, -4, -1]) 
sage: X = A.solve_right(Y) 

反斜杠 \ 可以代替 solve_right; 用 A \ Y 代替 A.solve right(Y).
sage: A \ Y

类似的,使用 A.solve left(Y) 求解满足 XA = Y 的 X.

矩阵所在的环影响它的性质。

matrix 命令中的第一个参数告诉 Sage 这个矩阵 是整数环 (ZZ) 上的,有理数环 (QQ) 上的,还是实数环 (RR) 上的:

sage: AZ = matrix(ZZ, [[2,0], [0,1]]) 
sage: AQ = matrix(QQ, [[2,0], [0,1]]) 
sage: AR = matrix(RR, [[2,0], [0,1]])

新建一个3*3的矩阵A

sage: A = Matrix(3,range(9))

A的阶梯形式

sage: A.echelon form()

A的转置矩阵

sage: A.T == A.transpose()

A的行向量

sage: A.rows()

A的列向量

sage: A.columns()

多项式

一元多项式

sage: R = PolynomialRing(QQ, ‘t’)

sage: R = QQ[‘t’]

sage: R.<t> = PolynomialRing(QQ) or sage: R.<t> = QQ[‘t’] or R.<t> = QQ[]

eg:

sage: R.<t> = QQ[]
sage: f = 2*t^7 +3*t^2 -15/19
sage: f^2
4*t^14 + 12*t^9 - 60/19*t^7 + 9*t^4 - 90/19*t^2 + 225/361

生成随机多项式

sage: R.<y> = PolynomialRing(GF(p))

sage: S = R.random_element(degree)

多项式的系数

sage: S.coefficients()

检测多项式是否不可约:

sage: S.is_irreducible()

(把多项式每一项的模数由p转变为S对应项的系数)

sage: RS = R.quotient(S)

将整数列表转为多项式对应项的系数(阶递增)

sage: R([111,222])
222*y + 111

F.<x> = GF(2^8,modulus=[1,0,0,1,1,1,0,0,1])	 #感觉那个PolymonialRing都不用写了
F.fetch_int(21) == F(21.bits())
F(21.bits()).integer_representation()	#逆过程

多元多项式

跟定义一元多项式一样,定义多元多项式也有多种方法:

sage: GF(5)[‘z0, z1, z2’]

sage: R.<z0,z1,z2> = GF(5)[];

sage: PolynomialRing(GF(5), 3, ‘xyz’)

eg:

sage: R.<x,y> = RationalField()[]
sage: f = (x^3 +2*y^2*x)^2
sage: g = x^2*y^2
sage: f.gcd(g)
x^2
sage: gcd(f,g)
x^2

数论

sage: R = IntegerModRing(97) or R = Zmod(97) #定义模数为97的环

sage: a = R(2) / R(3) #环上的除法

sage: a.is_square() #是否为二次剩余

sage: gcd(3,2) #最大公因数

sage: factorial(5) #阶乘

sage: next_prime() #后一个素数

sage: previous_prime() #前一个素数

sage: divisors() #所有因子

sage: sigma(n,k) #n的所有因子的k次幂之和

sage: inverse_mod(a,n) #求逆

两种因式分解

sage: factor(1024) -> 2^10
sage: prime_divisors(1024) -> [2]

有限域下开根

sage: R.<X> = PolynomialRing(Zmod(p))

sage: f = x^256 - c

sage: f.monic().roots()

sage: euler_phi(n) #求n的欧拉函数 sage: phi = n*prod([1 - 1/p for p in prime divisors(n)]);

sage: crt(m1,m2,n1,n2) #中国剩余定理 【x % n1 = m1; x % n2 = m3】

R = IntegerModRing(97) or R = Zmod(97)	#  定义模数为97的环
a = R(2) / R(3) 						#  环上的除法
a.is_square() 							#  是否为二次剩余
gcd(3,2) 								#  最大公因数
factorial(5) 							#  阶乘
next_prime() 							#  后一个素数
previous_prime() 						#  前一个素数
divisors() 								#  所有因子
sigma(n,k)								#  n的所有因子的k次幂之和
inverse_mod(a,n) 						#  求逆
euler_phi(n) 							#  求n的欧拉函数 phi = n*prod([1 - 1/p for p in prime divisors(n)]);
crt(m1,m2,n1,n2) 						#  中国剩余定理 【x % n1 = m1; x % n2 = m3】
d,u,v=xgcd(20,30)						#  扩展欧几里得算法

#两种因式分解
factor(1024) -> 2^10
prime_divisors(1024) -> [2]

#有限域下开根
R.<X> = PolynomialRing(Zmod(p))
f = x^256 - c
f.monic().roots()

#求模取根
x=mod(5,41)
r=x.nth_root(22)

#求离散对数
x=discrete_log(mod(13,23),mod(2,23))	#  或discrete_log(13,mod(2,23))

#素数分布(Pi(x))
result=prime_pi(1000)/(1000/log(1000))
result.numerical_approx() #1.16050288686900

Elliptic Curves

EllipticCurve(R, [a1, a2, a3, a4, a6]) eg:

sage: ecc = EllipticCurve(GF(q), [a,b]) #初始化一条线

sage: G = ecc(x,y) #选定其上的一个点

sage: G.order() #G点的阶

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值