SageMath

SageMath（曾叫做Sage或SAGE，為「System for Algebra and Geometry Experimentation」的首字母縮寫），是一個覆蓋許多數學功能的應用軟體，包括代數、組合數學、圖論、計算數學、數論、微積分和統計。

SAGE的第一個版本在GNU許可證下發布於2005年2月24日，最初的目標是創造一個「Magma、Maple、Mathematica和MATLAB的開源替代品」。Sage的主導開發人員威廉·斯坦因是華盛頓大學的數學家。

## 功能

Sage的功能包括

- 一個用於回顧及重新使用以前的輸入和輸出及加入圖形和文本注釋的記事本文檔接口，可在通用的網頁瀏覽器如Firefox、Opera、Konqueror和Safari中使用。在安全和保密要求高的情況下可通過HTTPS與記事本連接，Sage可同時在本地和遠程使用。
- 一個使用IPython的基於文本的命令行界面
- Python程式語言，支持函數化編程和面向對象的結構。
- 支持多核處理器，多處理器，及在並行計算。
- 使用Maxima和SymPy進行微積分計算。
- 使用GSL，SciPy和NumPy做線性代數數值計算。
- 基礎和特殊數學函數庫
- 函數和數據的二維和三維圖形顯示
- 矩陣和數據處理工具，支持稀疏陣列
- 使用R和SciPy的多元統計分析庫
- 一個在計算和應用上添加使用者界面的工具箱的
- 使用Pylab以及Python程式語言的圖像處理工具
- 圖論可視化和分析工具
- 數論的函數庫
- 數據，圖像，影片，聲音，電腦輔助設計，地理資訊系統，文檔和生物醫學格式的輸入輸出過濾器
- 適當支持在函數中進行複數，任意精度及符號計算
- 包括公式編輯的文字處理技術，並可在Sage內嵌入LaTeX文檔
- Twisted提供的連接到SQL、Java、.NET、C++和FORTRAN語言的網路工具，支持包括HTTP、NNTP、IMAP、SSH、IRC、FTP等在內的大量協議
- 與Mathematica、Maxima及Maple等一些第三方軟體的接口，允許用戶組合軟體及比較輸出和性能。因此，它也是一個類似於GNU TeXmacs的其他數學工具的「前端」
- 使用MoinMoin作為知識管理的維基系統
- 使用Sphinx的文檔管理
- 一個自動化測試套件，允許電腦終端用戶進行測試

雖然不是Sage直接提供的功能，但Sage可以從Mathematica內部調用。Mathematica的一個記事本可用於此。

## 設計理念

威廉.斯坦在設計Sage時意識到了有不同的語言（包括有C、C++、Fortran和Python）編寫的大量現成的大型開源數學軟體可用。

因此，Sage（用Python和Cython實現的）將所有專用的數學軟體集成到一個通用的接口而不是從頭開發。使用者只需要了解Python。

Sage由學生和專業人士開發。Sage的開發由志願工作和贈款支持。

## 性能

二進位包和原始碼都可以從Sage頁面下載。如果從原始碼構建，許多包含的庫如Atlas、FLINT和NTL和都會針對該電腦考慮到處理器數量，緩存大小的，是否有硬體支持SSE指令等進行調整和優化。

## 許可和可用性

Sage在GNU通用公共許可證2+下自由軟體條款下發布。Sage可通過多種方式獲得：

- 原始碼可以直接從網上下載的下載頁面。開發版本的Sage也可用，不建議最終使用者使用。
- 可以下載用於Linux、OS X、Solaris（x86和SPARC）及windows的可執行文件。
- 一個包含可啟動Linux作業系統的live CD。允許不安裝Linux直接使用Sage。

## Sage包含的軟體包

如上所述，SAGE的理念是利用現有的任何開放源碼庫。因此，借用了許多項目。

代數｜GAP (電腦代數系統)，Maxima，Singular

代數幾何｜Singular

任意精度計算｜MPIR，MPFR，MPFI，NTL

算術幾何｜PARI/GP，NTL，mwrank，ecm

微積分｜Maxima，SymPy，GiNaC

組合數學｜Symmetrica，Sage-Combinat

線性代數｜ATLAS，BLAS，LAPACK，NumPy，LinBox，IML，GSL

圖論｜NetworkX

群論｜GAP (電腦代數系統)

數值計算｜GSL，SciPy，NumPy，ATLAS

數論｜PARI/GP，FLINT，NTL

統計計算｜R, SciPy

命令行｜IPython

資料庫｜ZODB， Python Pickles，SQLite

圖形界面｜Sage Notebook， jsmath

圖像｜Matplotlib，Tachyon3d，GD, Jmol

交互式程式語言｜Python

網路｜Twisted

## 語言範例

### 微積分

```python
x,a,b,c = var('x,a,b,c')
log(sqrt(a)).simplify_log() # returns log(a)/2
sin(a+b).simplify_trig() # returns cos(a)*sin(b) + sin(a)*cos(b)
cos(a+b).simplify_trig() # returns cos(a)*cos(b) - sin(a)*sin(b)

limit((xˆ2+1)/(2+x+3*xˆ2), x=infinity) # returns 1/3
limit(sin(x)/x, x=0) # returns 1

diff(acos(x),x) # returns -1/sqrt(1 - xˆ2)
f = exp(x)*log(x)
f.diff(x,3) # returns e^x*log(x) + 3*e^x/x - 3*e^x/x^2 + 2*e^x/x^3

solve(a*x^2 + b*x + c, x) # returns [x == (-sqrt(b^2 - 4*a*c) - b)/(2*a),
 # x == (sqrt(b^2 - 4*a*c) - b)/(2*a)]
```

### 微分方程

```python
t = var('t') # define a variable t
x = function('x',t) # define x to be a function of that variable
DE = lambda y: diff(y,t) + y - 1
desolve(DE(x(t)), [x,t]) # returns '%e^-t*(%e^t+%c)'
```

### 線性代數

```python
A = Matrix([[1,2,3],[3,2,1],[1,1,1]])
y = vector([0,-4,-1])
A.solve_right(y) # returns (-2, 1, 0)
A.eigenvalues() # returns [5, 0, -1]

B = Matrix([[1,2,3],[3,2,1],[1,2,1]])
B.inverse() # returns [ 0 1/2 -1/2]
 # [-1/4 -1/4 1]
 # [ 1/2 0 -1/2]

# Call numpy for the Moore-Penrose pseudo-inverse,
# since Sage does not support that yet.

import numpy
C = Matrix([[1 , 1], [2 , 2]])
matrix(numpy.linalg.pinv(C.numpy())) # returns [0.1 0.2]
 # [0.1 0.2]
```

### 數論

```python
prime_pi(1000000) # returns 78498, the number of primes less than one million

E = EllipticCurve('389a') # construct an elliptic curve from its Cremona label
P, Q = E.gens()
7*P + Q # returns (2869/676 : -171989/17576 : 1)
```

## 歷史

只列出了主要發布版本。Sage採用的「早發布，常發布」的理念，每兩至三個星期發布一次。

版本｜發布日期｜說明

0.1｜2005年1月｜包括 Pari，但不包含GAP和 Singular

0.2 - 0.4｜2005年5-7月｜Cremona的資料庫，多元多項式，大型有限域和更多的文檔

0.5 - 0.7｜2005年8-9月｜向量空間，環，模塊化符號和Windows使用

0.8｜2005年10月｜完整發布的GAP，和Singular

0.9｜2005年11月｜添加了Maxima和clisp

1.0｜2006年2月

2.0｜2007年1月

3.0｜2008年4月

4.0｜2009年5月

5.0｜2012年5月｜5.0里程碑

6.0｜2013年12月

2007年，Sage贏得自由軟體的國際競爭中科學軟體部分的Les Trophées du Libre首獎。

## 基本資料

- 發行日期：2005年2月24日
- 軟體版本週期：yes
- 程式語言：Python、Cython
- 作業系統：跨平台
- 平台：Python
- 類型：電腦代數系統
- 許可協議：GNU通用公共許可證
- 網站： www.sagemath.org