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版は試験的な提供である。
 LinuxのブータブルCDとしても配布されている。これを使えば、SageMathのインストール作業を行わずに使うことができる。
 Sageのオンライン版もhttp://demo.sagenb.orgで提供されている。しかし技術的な理由からユーザーが利用できるメモリサイズに、またセキュリティ面に制限がある。

Sage 8.0 以降からWindowsネイティブ版がリリースされている．

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

利用例

数式処理 
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]

微分方程式 
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)'

線形代数 
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]

数論 

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日）．

数式処理システム
Linux向け数式処理システム
数学に関する記事
Pythonライブラリ
2005年のソフトウェア
数学ソフトウェア
フリー教育ソフトウェア