あとがき#

なぜPyhtonなのか#

Pythonの強み#

Sageの実装には主要言語としてPython([Py] を参照)が採用されている. 高速性を要する部分のコードはコンパイラ言語で実装されているものの,Pythonには固有の利点がある:

  • オブジェクト保存機能 が充実している.Pythonは,(ほぼ)いかなるオブジェクトでもディスクファイルあるいはデータベースとして保存するための機能を豊富に備えている.

  • 優秀な ドキュメント作成支援機能 を備えている. 関数やパッケージ群のソースコードに対しては,ドキュメントの抽出と全具体例の検証までが自動化されている. 具体例の自動検証は常時行なわれており,記載通りの動作を保証している.

  • メモリ管理: Pythonは,入念に設計された頑健なメモリ管理機能と,循環参照を間違いなく処理するガーベッジコレクタを備えており,異なるファイル内で定義された局所変数群も問題なく扱うことができる.

  • Pythonで利用できる 豊富なパッケージ群 は,Sageユーザにとっても非常に有益であることは間違いない. 数値解析,線形代数,2次元および3次元グラフィクス,ネットワーキング(例えばtwistedを経由した分散処理とサーバー構築),データベース対応など,幅広い分野のパッケージが用意されている.

  • 高い移植性: 一般的なプラットフォームでは,Pythonをソースコードからビルドするのは簡単で時間もかからない仕事である.

  • 例外処理: Pythonは,細部まで考え抜かれ洗練された例外処理システムを備えている. この例外処理システムを使えば,呼出し先のコードでエラーが発生した場合でもプログラム本体を破綻なく障害から復帰させることが可能だ.

  • デバッガ: 何らかの理由でコードがうまく動かない場合,Pythonのデバッガを使って詳細なスタックトレースを実行したり関連変数全ての状態を調べることができるし,スタック内を上下動することも可能だ.

  • プロファイラ: Pythonのプロファイラを使えば,実際にコードを動かして関数の呼出し回数と処理時間を調べることができる.

  • 汎用言語: 数学指向の 独自言語 を開発したMagma, Maple,Mathematica, Matlab,GP/PARI, GAP, Macaulay 2, Simathなどとは違って,Sageは広く普及している汎用言語Pythonを採用している. オープンソースの代表的成功事例であるPythonは,安定した開発体制下,熟練したソフトウェア技術者多数によって研究開発と最適化が進められている([PyDev] を参照).

前処理パーサ: SageとPython の相違点#

Pythonの数学機能には混乱を招きがちな面があり,SageにはPythonとは異なる振舞いを示す部分がある.

  • べき乗の記法: **^ の意味が異なる. Pythonでは ^ は "xor"の意味で,べき乗を意味しない. したがって,Pythonでは

    >>> 2^8
    10
    >>> 3^2
    1
    >>> 3**2
    9
    

    この ^ の使い方は奇妙な感じがするし,「排他的論理和」機能をほとんど使わない純粋な数学研究では無駄でもある. Sageでは,Pythonに送る前に全コマンド行に対して文字列中にない限り ^** に置換する前処理をしている:

    sage: 2^8
    256
    sage: 3^2
    9
    sage: "3^2"
    '3^2'
    
    >>> from sage.all import *
    >>> Integer(2)**Integer(8)
    256
    >>> Integer(3)**Integer(2)
    9
    >>> "3^2"
    '3^2'
    

    Sageでは,ビット単位のXOR演算子は ^^ である. 同じ記号は代入演算子 ^^= にも応用されている:

    sage: 3^^2
    1
    sage: a = 2
    sage: a ^^= 8
    sage: a
    10
    
    >>> from sage.all import *
    >>> Integer(3)^Integer(2)
    1
    >>> a = Integer(2)
    >>> a ^= Integer(8)
    >>> a
    10
    
  • 整数の除算: Pythonにおける式 2/3 は,数学者が当然と思う値にならない. Pythonでは, mn がint型であれば, m/n つまり mn で割った商もint型になる. 2/3=0 となるのはこのためだ. Pythonコミュニティでは,仕様を変更して 2/3 は浮動小数点数 0.6666... を返し, 2//30 を返すよう修正すべきという議論が続いている.

    この問題を解決するために,Sageインタプリタは整数リテラルを Integer() でラップし,その除算を有理数のコンストラクタとして機能させている. 具体例を見てみよう:

    sage: 2/3
    2/3
    sage: (2/3).parent()
    Rational Field
    sage: 2//3
    0
    
    >>> from sage.all import *
    >>> Integer(2)/Integer(3)
    2/3
    >>> (Integer(2)/Integer(3)).parent()
    Rational Field
    >>> Integer(2)//Integer(3)
    0
    
  • 長整数: Python本体は,C言語由来のint型だけではなく任意精度整数をサポートしている. Pythonの任意精度整数はGMP提供のものと比べると著しく速度が劣り,通常のintと区別するために末尾に L を付けて出力される仕様になっている(この仕様はすぐには変更されそうにない). Sageの任意精度整数はGMP C-ライブラリを使って実装されており,末尾の L なしで出力される.

Sageでは,(一部の人たちが内輪でやっているように)Pythonインタプリタそのものを改造することはせず,Python言語をそのままの形で使っている. 代りにIPythonに対する前処理パーサを開発して,IPythonコマンドラインの振舞いを数学者に馴染めるようにしてある. これにより既存のPythonプログラムは例外なくSageで使えることになるが,Sageにインポートして使うパッケージを開発する場合には標準的なPythonの書法に従わなければならない.

(インターネットで見つけたPythonライブラリをインストールする場合は, python コマンドではなく sage -python としてインストール手順に従えばよい. こうすると, sage -python setup.py install の意味になる.)

Sageプロジェクトを手助けするには?#

Sageプロジェクトに助力いただけるのなら,たいへん有難い. 実質的なコードの提供からSageドキュメンテーションの追加やバグ報告まで,どんな形であれ大歓迎である.

開発者向けの情報については、SageのWebページをご覧いただきたい. 優先順位とカテゴリー順に整理されたSage関連プロジェクトの長いリストが見つかるはずだ. 開発に役立つ情報は Sage Developer's Guide にも載っているし,Googleグループ sage-devel も役立つ.

Sageを引用するには#

Sageを使って論文を書く場合は,Sageによる計算が行なわれたことを明記するため,以下の一文を参考文献として引用していただきたい(Version 8.7の部分は実際に使用したバージョン番号に修正してください.):

[Sage] Sage Mathematics Software (Version 8.7).
       The Sage Development Team, 2019, https://www.sagemath.org.

さらに,Sageを構成するPARI,GAP,Singular,Maximaなどのシステムの内,どれを計算に利用したのかを特定してそのシステムも引用していただけるようお願いする. もし計算に使ったソフトウェアがどれなのか確信がもてない場合は, Googleグループ sage-devel で気軽に尋ねてみよう. こうした点については, 1変数多項式 節に詳しい話がある.


このチュートリアルを最後まで読み終えた方は,どのくらい時間がかかったかGoogleグループ sage-devel で教えていただければ幸いである.

どうかSageで楽しんでほしい.