SageMath

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

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

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

 特徴 

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

 インタフェース
 ノートブック形式で対話的に作業を行うインタフェースを持つ。そのためそれまでの入力を確認したり再利用したりすることが簡便である。文字入出力と画像の両方が扱え、多くのウェブブラウザ（Firefox、Opera、Konqueror、Safariなど）から利用できる。状況に応じてHTTPS接続を行うこともでき、Sageのノートブックはネットワーク越しでも、ローカルでも扱うことができる。
 IPythonによるコマンドライン・インターフェイス
 Pythonの導入による、手続き型、関数型、オブジェクト指向を両立するプログラミング
 Maximaと SymPy を使った計算のサポート
 スライダーなどの直観的な操作を備えたGUI（英語）
 ユーザインタフェースを追加するためのツールキット
 データ、画像、動画、音声、CAD、GIS (地理情報システム)、ワープロ文書、医用データ形式の入出力
 数式の表示と LaTeX 文書の埋め込みThe TeX Catalogue OnLine, Entry for sagetex, Ctan Edition (英語)
 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を呼び出して利用することができるhttp://facstaff.unca.edu/mcmcclur/Mathematica/Sage/ Calling Sage from Mathematica（英語）。そのための Mathematicaノートブックが用意されているhttp://facstaff.unca.edu/mcmcclur/Mathematica/Sage/UsingSage.nb A Mathematica notebook to call Sage from 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に含まれるソフトウェア・パッケージ 

 + 数学機能のパッケージ 計算機代数 GAP, Maxima, SINGULAR 代数幾何学 SINGULAR 多倍長計算 MPIR, MPFR, MPFI, NTL, mpmath 数論幾何学 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 GUI Sage Notebook, jsmath グラフィクス Matplotlib, Tachyon3d, GD Graphics Library, Jmol 対話的プログラミング環境 Python ネットワーク Twisted

 利用例 
 数式処理 
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" であり、数週間または一ヶ月おきにリリースされている。

+ Sage versions Version Release Date Description0.12005年1月PARI/GP に対応、しかし GAP と Singular は未対応0.2 - 0.42005年3月〜6月Cremona データベース、多変数の多項式、大規模な有限体、ドキュメントの整備0.5 - 0.72005年8月〜9月ベクトル、環、モジュラー0.82005年10月GAP のフルサポート、Singular サポート0.92005年11月Maxima、clisp 追加1.02006年2月2.02007年1月3.02008年4月Interacts, Rインターフェース4.02009年5月Solaris 10サポート, 64bit OSXサポート5.02012年5月OSX Lionサポート6.02013年12月Sageの開発はGitへ移行7.02016年1月8.02017年7月

 脚注 

参考文献
 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日）．

Category:数式処理システム
Category:Linux向け数式処理システム
Category:数学に関する記事
Category:Pythonライブラリ
Category:2005年のソフトウェア
Category:数学ソフトウェア
Category:教育に関する自由ソフトウェア
Category:Pythonでプログラムされた自由ソフトウェア