介绍
SageMath 是一个基于 GPL 协议的开源数学软件。它使用 Python 作为通用接口,将现有的许多开源软件包整合在一起,构建一个统一的计算平台。
Sage 基于并使用 Python,Python 程序可以在 Sage 中直接运行,也可以在 Sage 中使用 Python 的各种库,就像是提供一个包含各种数学功能的 Python 环境。
在 CTF 密码学中,经常要用到 SageMath。
安装
官网:https://www.sagemath.org/zh/
blog教程:https://www.lainme.com/doku.php/topic/sage/start
本人是放在 windows 上运行的。windows 的 SageMath 是在虚拟机环境下运行的,一般使用时打开 SageMath Shell 运行。
有一个在线运行sage脚本的网站:https://sagecell.sagemath.org/
建议 Ubuntu18.04 安装 sagemath(命令行安装,超方便)
1 | sudo -i |
windows下使用
打开 SageMath Shell 。输入 sage 即可进入 Sage 会话。
如果使用脚本,shell 进入相关路径,用命令 sage xxx.sage
运行脚本。
linux下使用就不用那么麻烦了:)
常用命令
基本运算
1 | a = 5 # 赋值 |
基本代数
解方程
solve 函数用于解方程。要使用它,先要指定变量,然后将方程(或方程组)以及要求解的变量作为参数 传给 solve。
1 | x = var('x') |
可以求解方程,解出用其他变量表示的一个变量
1 | x, b, c = var('x b c') |
也可以求解多个变量:
1 | x, y = var('x, y') |
求解方程的数值解
用 find_root 在区间 0 < ϕ < π/2 上寻找上述方程的解。
1 | phi = var('phi') |
基本的环
• 整数环 {…,−1,0,1,2,…}, Sage 中叫 ZZ;
• 有理数环 ,即整数构成的分数,Sage 中叫 QQ;
• 实数环,Sage 中叫 RR;
• 复数环,Sage 中叫 CC;
sage: ratpoly.
ratpoly是集合的名字,自己定义
.
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:
1 | A = Matrix([[1,2,3],[3,2,1],[1,1,1]]) |
类似的,使用 A.solve left(Y) 求解满足 XA = Y 的 X.
矩阵所在的环影响它的性质。
matrix 命令中的第一个参数告诉 Sage 这个矩阵 是整数环 (ZZ) 上的,有理数环 (QQ) 上的,还是实数环 (RR) 上的:
1 | AZ = matrix(ZZ, [[2,0], [0,1]]) |
1 | A = Matrix(3,range(9)) # 新建一个3*3的矩阵A |
多项式
一元多项式
三种方式创建多项式环
1 | R = PolynomialRing(QQ, ‘t’) |
eg:
1 | sage: R.<t> = QQ[] |
生成随机多项式
1 | R.<y> = PolynomialRing(GF(p)) |
检测多项式是否不可约:
1 | S.is_irreduceible() |
(把多项式每一项的模数由p转变为S对应项的系数)
1 | Rs = R.quotient(S) |
将整数列表转为多项式对应项的系数,
1 | RS([111,111]) |
1 | F.<x> = GF(2^8,modulus=[1,0,0,1,1,1,0,0,1]) #感觉那个PolymonialRing都不用写了 |
多元多项式
跟定义一元多项式一样,定义多元多项式也有多种方法:
1 | GF(5)[‘z0, z1, z2’] |
eg:
1 | sage: R.<x,y> = RationalField()[] |
数论
1 | R = IntegerModRing(97) or R = Zmod(97) # 定义模数为97的环 |
椭圆曲线
1 | EllipticCurve(R, [a1, a2, a3, a4, a6]) |
eg1:
1 | sage: ecc = EllipticCurve(GF(q), [a,b]) #初始化一条线 |
eg2:
1 | a4=2;a6=3;F=GF(7); |