SageMath

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

SageMath
Sage logo
初版2005年2月14日 (19年前) (2005-02-14)
最新版10.3 - 2023年8月20日 (10か月前) (2023-08-20)[1] [±]
最新評価版10.2rc4 - 2023年11月17日 (7か月前) (2023-11-17)[2] [±]
リポジトリ ウィキデータを編集
プログラミング
言語
Python, Cython
対応OSLinux, macOS, Microsoft Windows, Solaris, Android, iOS
プラットフォーム
種別計算機代数
ライセンスGPLv3
公式サイトwww.sagemath.org ウィキデータを編集
テンプレートを表示
ウィリアム・スタイン(2011年6月)

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

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

特徴

Sageのドキュメント(ノートブック)を操作するインターフェイスは、Firefox (および Mozilla)、OperaKonquerorSafariで実行できる
Sageノートブックのウェブインターフェースを使って解いた数式の例

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

インタフェース
  • ノートブック形式で対話的に作業を行うインタフェースを持つ。そのためそれまでの入力を確認したり再利用したりすることが簡便である。文字入出力と画像の両方が扱え、多くのウェブブラウザFirefoxOperaKonquerorSafariなど)から利用できる。状況に応じてHTTPS接続を行うこともでき、Sageのノートブックはネットワーク越しでも、ローカルでも扱うことができる。
  • IPythonによるコマンドライン・インターフェイス
  • Pythonの導入による、手続き型、関数型、オブジェクト指向を両立するプログラミング
  • MaximaSymPy を使った計算のサポート
  • スライダーなどの直観的な操作を備えたGUI[5]
  • ユーザインタフェースを追加するためのツールキット
  • データ、画像、動画、音声、CADGIS (地理情報システム)、ワープロ文書、医用データ形式の入出力
  • 数式の表示と LaTeX 文書の埋め込み[6]
  • Twisted によるネットワーク経由のSQLJava.NET FrameworkC++FORTRANの利用ツール (これによりHTTPNNTPIMAPSSHIRCFTP が利用可能となっている)
  • 外部ソフトウェア(Mathematica、Magma、Mapleなど)をSageMathから呼び出し、処理結果や実行速度を比較する機能(GNU TeXmacsのような、外部ソフトウェアへのフロントエンドとしてSageMathを利用できる)
  • 情報集約のためのWikiシステムとして MoinMoinを備える
  • ユーザーから利用できる、テストの自動実行環境
  • FORTRAN、C、C++とCythonのコードの実行
演算
グラフ描画
  • データおよび関数の2Dおよび3Dプロット
  • グラフ(ノードとリンクからなる)の可視化と解析

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

開発方針

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

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

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

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

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

成果

  • 2007年 : SageMathは国際的なフリーソフトウェアのコンクールであるトルフェ・ド・リブレ英語版の科学技術ソフトウェア部門で一等賞を受賞している[10]
  • 2012年 : Google Summer of Codeのプロジェクトのひとつに選ばれた。[11]
  • 2013年 : ACM/SIGSAM Jenks賞を受賞。[12]
  • SageMath は多くの数学の論文や本で引用されている。[13][14]

性能

SageMathのソースコードバイナリともに開発元のウェブページからダウンロードできる。SageMathをソースからビルドすると、その環境のプロセッサ数、キャッシュのサイズ、SSEサポートの有無などによって、SageMathの内部で利用するATLASFLINTNTLなどの数値演算ライブラリのチューニングが行われる。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に含まれるソフトウェア・パッケージ

数学機能のパッケージ
計算機代数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
GUISage 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)/2log(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)ˆ5expand((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ˆ5limit((xˆ2+1)/(2+x+3*xˆ2), x=infinity)  # returns 1/3limit(sin(x)/x, x=0)                    # returns 1diff(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^3solve(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/xsolve(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 tx = function('x',t)                     # define x to be a function of that variableDE = lambda y: diff(y,t) + y - 1desolve(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 numpyC = 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 millionE = EllipticCurve('389a')               # construct an elliptic curve from its Cremona labelP, Q = E.gens()7*P + Q                                 # returns (2869/676 : -171989/17576 : 1)

開発の経緯

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

Sage versions
VersionRelease DateDescription
0.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.

関連項目

外部リンク