SageMath

**SageMath**（セイジ、以前はSage、SAGEと記した）は数学の幅広い処理を扱うソフトウェアである。扱う処理は計算機代数、組み合わせ、数値計算など多岐に及ぶ。工学的応用に加え基礎科学の研究も対応している。

SageMathは2005年2月24日に自由ソフトウェアとしてGNU General Public Licenseの元で初版が公開された。その開発目的はMagma、Maple、Mathematica（いずれも計算機代数ソフトウェア）、MATLABの代替となるフリーかつオープンソースなソフトウェアを提供することであった。開発は、米ワシントン大学の数学准教授のウィリアム・スタイン (William Stein) が主導して始まった。

SageMathはPythonプログラミング言語を使用しており、手続き型・関数型・オブジェクト指向によるプログラムの記述を行うことができる。

## 特徴

SageMath のマニュアルに記載されている機能から、以下に抜粋する。

; インタフェース
* ノートブック形式で対話的に作業を行うインタフェースを持つ。そのためそれまでの入力を確認したり再利用したりすることが簡便である。文字入出力と画像の両方が扱え、多くのウェブブラウザ（Firefox、Opera、Konqueror、Safariなど）から利用できる。状況に応じてHTTPS接続を行うこともでき、Sageのノートブックはネットワーク越しでも、ローカルでも扱うことができる。
* IPythonによるコマンドライン・インターフェイス
* Pythonの導入による、手続き型、関数型、オブジェクト指向を両立するプログラミング
* Maximaと SymPy を使った計算のサポート
* スライダーなどの直観的な操作を備えたGUI
* ユーザインタフェースを追加するためのツールキット
* データ、画像、動画、音声、CAD、GIS (地理情報システム)、ワープロ文書、医用データ形式の入出力
* 数式の表示と LaTeX 文書の埋め込み
* Twisted によるネットワーク経由のSQL、Java、.NET Framework、C++、FORTRANの利用ツール (これによりHTTP、NNTP、IMAP、SSH、IRC、FTP が利用可能となっている)
* 外部ソフトウェア（Mathematica、Magma、Mapleなど）をSageMathから呼び出し、処理結果や実行速度を比較する機能（GNU TeXmacsのような、外部ソフトウェアへのフロントエンドとしてSageMathを利用できる）
* 情報集約のためのWikiシステムとして MoinMoinを備える
* ユーザーから利用できる、テストの自動実行環境
* FORTRAN、C、C++とCythonのコードの実行
; 演算
* SMPなどのマルチコアCPU環境での並列実行、および分散コンピューティング環境での並列計算のサポート
* GNU Scientific Library、SciPy、NumPyによる線形代数の数値計算
* 初等関数および特殊関数のライブラリ
* 行列およびベクトル演算 (疎行列にも対応)
* RとSciPyによる多変量解析のサポート
* Python同様のpylabによる画像解析ツール
* 数論の関数のライブラリ
* 複素数、多倍長計算、記号計算のサポート
; グラフ描画
* データおよび関数の2Dおよび3Dプロット
* グラフ（ノードとリンクからなる）の可視化と解析

この他に、SageMathが直接提供する機能ではないが、MathematicaからSageMathを呼び出して利用することができる。そのための Mathematicaノートブックが用意されている。

## 開発方針
ウィリアム・スタインは設計にあたって、以下の要素を取り込んだ。

* 現実的に意味のある、Magma、Maple、Mathematica、MATLABの対抗となるソフトウェアを作り上げること。これを最初からやろうとすると、膨大な労力を要するであろうと考えられた。
* 当時すでに、多数の実用に耐える数学関連ソフトウェアがオープンソースで提供されていたが、それぞれ異なるプログラミング言語（C、C++、FORTRAN、Pythonなどが多かった）で実装されていた。

そこで、目的とするソフトウェアをゼロから書き始めることはせずに、SageMathはPythonとCythonを使って、さまざまな数学関連ソフトウェアを統合して一つのインターフェイスで使えるようにすることを目指した。Pythonは非常に多くのアプリケーションで利用されている言語であり、SageMathの利用者はPythonだけを知っていればよいことになる。

これを実現するためのオープンソース実装はまだなかったことが、SageMathを開発する動機となった。SageMathはいわゆる車輪の再発明とは異なる。たとえばMathematicaは同じような開発方針で作られているが、商用のソフトウェアはソース開示を義務づけられているソフトウェアを利用することができない。Sageにはそういった制限はなく、それだけ幅広い分野のソフトウェアを利用することができる。

SageMathの開発には、学生も職業研究者も関わっている。またボランティアの開発労力に加え、助成金による援助も受けている。

## 成果
* 2007年 : SageMathは国際的な自由ソフトウェアのコンクールであるの科学技術ソフトウェア部門で一等賞を受賞している。
* 2012年 : Google Summer of Codeのプロジェクトのひとつに選ばれた。
* 2013年 : ACM/SIGSAM Jenks賞を受賞。
* SageMath は多くの数学の論文や本で引用されている。

## 性能
SageMathのソースコード、バイナリともに開発元のウェブページからダウンロードできる。SageMathをソースからビルドすると、その環境のプロセッサ数、キャッシュのサイズ、SSEサポートの有無などによって、SageMathの内部で利用するATLAS、FLINT、NTLなどの数値演算ライブラリのチューニングが行われる。SageMathの開発者の多くは実効性能の向上に注力しており、中には世界最速を目指しているものもある。

## 利用条件
SageMathはGNU General Public License version 2+にしたがった利用、配布ができる自由ソフトウェアである。入手方法は複数用意されている。
* ソースコードはダウンロード・ページからダウンロードできる。開発者用として、開発途中のバージョンもダウンロードできる。開発用については、開発者用リファレンスマニュアル（英語のみ）を読むことを推奨する。
* Linux、macOS、Solaris（x86およびSPARCの両方）についてはバイナリが用意されている。Solaris版は試験的な提供である。Solaris版は、Sage-8.3にて終了しているため、その後のバージョンでは、ソースコードからのコンパイルが必要である。
* LinuxのブータブルCDとしても配布されている。これを使えば、SageMathのインストール作業を行わずに使うことができる。
* Sageのオンライン版もhttp://demo.sagenb.orgで提供されている。しかし技術的な理由からユーザーが利用できるメモリサイズに、またセキュリティ面に制限がある。

* WindowsではWSLの上で実行する。（Sage 8.0 以降からWindowsネイティブ版がリリースされていたが、9.7で廃止されている。）WSLでの利用の場合、githubからMiniForge(旧miniconda)をダウンロードし、それを用いてSage用の環境を作る必要がある。この機能は、Pythonのvenv機能と同じくして、システムにインストールしたPythonのオリジナルLibを汚さずに、必要なsite-packageを使った環境構築ができる機能である。
* Sage-10.7より、インストール方法が変更になり、MiniForgeまたはconda（Anaconda）を用いることになった。ただし、Arch Linux及びManjaro用は、2025年12月30日時点でもバイナリー配布がされているため、パッケージとして導入が可能である。

## SageMathに含まれるソフトウェア・パッケージ

## 利用例
### 数式処理

```python
x,a,b,c = var('x,a,b,c')

log(sqrt(a))                            # returns log(a)/2
log(a/b).simplify_log()                 # returns log(a) - log(b)
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)
(a+b)ˆ5                                 # returns (b + a)ˆ5
expand((a+b)ˆ5)                         # returns bˆ5 + 5*a*bˆ4 + 10*aˆ2*bˆ3 +
                                        #         10*aˆ3*bˆ2 + 5*aˆ4*b + aˆ5

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)]

f = xˆ2 + 432/x
solve(f.diff(x)==0,x)                   # returns [x == 3*sqrt(3)*I - 3,
                                        #          x == -3*sqrt(3)*I - 3, x == 6]
```


### 微分方程式

```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)
```


## 開発の経緯

メジャーバーションについてのみ記す。SageMath のリリース方針は、"Release Early, Release Often" であり、数週間または一ヶ月おきにリリースされている。

## 脚注

## 参考文献
* Zimmermann, P., Casamayou, A., Cohen, N., Connan, G., Dumont, T., Fousse, L., ... & Bray, E. (2018). Computational Mathematics with SageMath. SIAM.
* Kim, D. S., Lee, S. G., & Markowsky, G. (2010). Mobile Sage-Math for Linear Algebra and its Application. Electronic Journal of Mathematics & Technology, 4(3).
* Ko, R. Y., Kim, D. S., Bak, J. Y., & Lee, S. G. (2009). Development of Mobile Sage-math and its use in Linear Algebra. Communications of Mathematical Education, 23(4), 1023-1041.
* Heuberger, C., Krenn, D., & Kropf, S. (2014). Automata in SageMath---Combinatorics meet Theoretical Computer Science. arXiv preprint arXiv:1404.7458.

## 関連項目

* 数式処理システムの一覧
* Macsyma
* Mathematica
* MATLAB
* Maple
* REDUCE_(数式処理システム)

## 外部リンク
* 
* 電子本（PDF, CCライセンス）: P. Zimmermann, et al.: "Computational Mathematics with SageMath" (Dec, 2018). (リンク切れの可能性)
* Official Sage Documentation Manual, Reference, Tutorials, ...
* Sage introduction videos
* Use Sage online in your web-browser
* Free software brings affordability, transparency to mathematics
* AMS Notices Opinion - Open Source Mathematical Software
* 数学ソフトウェアとフリードキュメントXIV(2012年3月25日) - 数式処理システム Sage 入門 - 横山俊一 (リンク切れ)
*竹本　浩のページ - Sageの紹介。公開Sageサーバ。
*（ Book Review）John B. Little ："Computational Mathematics with SageMath", Bull.AMS, v.57, no.3, (Jul,2020), pp.515–521, url="https://doi.org/10.1090/bull/1690"
* Sageチュートリアルへようこそ
* 佐々木格:「PythonとSageMath」(2022年）
* Paul Zimmermann, et al.: "Computational Mathmatics with SageMath",(2018), (open textbook in PDF).
* Gregory V. Bard: "Sage for Undergraduates", AMS (2015). (PDF入手可能)
* Gregory V. Bard: "Sage for Undergraduates: Compatible With Python 3",2nd Ed., AMS, ISBN 978-1470461553 (2022年10月30日）．