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ネイティブ版がリリースされている． 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" であり、数週間または一ヶ月おきにリリースされている。