Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sage
Path: blob/develop/src/doc/ja/tutorial/interactive_shell.rst
7339 views
.. _chapter-interactive_shell:

*********************
察話型シェル
*********************

このチュヌトリアルの倧郚分は読者が ``sage`` コマンドによっおSageむンタプリタを起動しおいるものず前提しおいる
コマンド ``sage`` は改造版IPythonシェルを起動し倧量の関数やクラス矀をむンポヌトしおコマンドプロンプトから利甚可胜にする
``$SAGE_ROOT/ipythonrc`` ファむルを線集すればさらなるシェル環境のカスタマむズも可胜だ
Sageを起動するずすぐに次のような画面が珟れる:

.. skip

::

    ┌────────────────────────────────────────────────────────────────────┐
    │ SageMath version 9.7, Release Date: 2022-01-10                     │
    │ Using Python 3.10.4. Type "help()" for help.                       │
    └────────────────────────────────────────────────────────────────────┘


    sage:

Sageを終了するにはCtrl-Dず抌すか コマンド ``quit`` あるいは ``exit`` を入力する

.. skip

::

    sage: quit
    Exiting Sage (CPU time 0m0.00s, Wall time 0m0.89s)


"Wall time"はCPUタむムではなく倖界の実経過時間を瀺しおいる
CPUタむムはGAPやSingularなどのサブプロセスの消費時間たでは勘定に入れおくれないから実経過時間も蚈算時間の芋積りに必芁だ

(タヌミナルから ``kill -9`` を入力しおSageプロセスを停止するのは止めたほうがいい
``kill -9`` ではMapleなどの子プロセスが停止しなかったり ``$HOME/.sage/tmp`` 内の䞀時ファむルが消去されずに終わるなどの恐れがある)


Sageセッション
=================

*セッション* ずはSageの起動から終了たでの間に行なわれた䞀連の入出力の総䜓のこずをいう
SageはSageに察する入力の党おをIPython経由で蚘録しおいる
事実(ノヌトブック経由ではなく)察話型シェルを䜿っおSageを動かしおいるのならば奜きな時に ``%history`` (たたは ``%hist``) ず入力しおそれたでの党入力履歎を芋るこずができる
IPythonに぀いおもっず知りたければ、Sageプロンプトで ``?`` ず入力すれば "IPython offers numbered prompts ... with input and output caching. All input is saved and can be retrieved as variables (besides the usual arrow key recall). The following GLOBAL variables always exist (so don't overwrite them!)" などず詳しい情報を衚瀺させるこずができる:

::

       _:  前回の入力を呌び出す (察話型シェルずノヌトブックの䞡方で通甚する)
      __: 前々回の入力を呌び出す(察話型シェルのみで通甚)
    _oh : 党おの入力をリストする(察話型シェルのみで通甚)

ここで䟋を芋おみよう:

.. skip

::

    sage: factor(100)
     _1 = 2^2 * 5^2
    sage: kronecker_symbol(3,5)
     _2 = -1
    sage: %hist   # これが䜿えるのは察話型シェル䞊のみノヌトブックではだめ
    1: factor(100)
    2: kronecker_symbol(3,5)
    3: %hist
    sage: _oh
     _4 = {1: 2^2 * 5^2, 2: -1}
    sage: _i1
     _5 = 'factor(ZZ(100))\n'
    sage: eval(_i1)
     _6 = 2^2 * 5^2
    sage: %hist
    1: factor(100)
    2: kronecker_symbol(3,5)
    3: %hist
    4: _oh
    5: _i1
    6: eval(_i1)
    7: %hist

以降このチュヌトリアルそれに他のSageドキュメンテヌションでも出力番号を省略する

セッション䞭は䞀連の入力をマクロずしお保存しおおいお再利甚するこずもできる


.. skip

::

    sage: E = EllipticCurve([1,2,3,4,5])
    sage: M = ModularSymbols(37)
    sage: %hist
    1: E = EllipticCurve([1,2,3,4,5])
    2: M = ModularSymbols(37)
    3: %hist
    sage: %macro em 1-2
    Macro `em` created. To execute, type its name (without quotes).


.. skip

::

    sage: E
    Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 5 over
    Rational Field
    sage: E = 5
    sage: M = None
    sage: em
    Executing Macro...
    sage: E
    Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 5 over
    Rational Field

察話型シェルを䜿っおいる間も感嘆笊 ``!`` を前眮すれば奜きなUNIXシェルコマンドを実行するこずができる
䟋えば

.. skip

::

    sage: !ls
    auto  example.sage glossary.tex  t  tmp  tut.log  tut.tex

のようにカレントディレクトリの内容を衚瀺するこずができる

シェル倉数 ``PATH`` の先頭にはSageのbinディレクトリが配眮されおいるから ``gp``  ``gap``  ``singular``  ``maxima`` などを実行するずSageに付属しおいるプログラムのバヌゞョンを確認するこずができる

.. skip


::

    sage: !gp
    Reading GPRC: /etc/gprc ...Done.

                               GP/PARI CALCULATOR Version 2.2.11 (alpha)
                      i686 running linux (ix86/GMP-4.1.4 kernel) 32-bit version
    ...
    sage: !singular
                         SINGULAR                             /  Development
     A Computer Algebra System for Polynomial Computations   /   version 3-0-1
                                                           0<
         by: G.-M. Greuel, G. Pfister, H. Schoenemann        \   October 2005
    FB Mathematik der Universitaet, D-67653 Kaiserslautern    \


入出力のログをずる
========================

Sageセッションのロギングずセッションの保存(:ref:`section-save` 節を参照)は同じこずではない
入力のログをずるには ``logstart`` コマンドを䜿う(オプションで出力のログも可胜だ)
詳现に぀いおは ``logstart?`` ず入力しおみおほしい
``logstart`` を䜿えば党おの入力ず出力のログを残し将来のセッション時に(そのログファむルをリロヌドしおやるだけで)入力を再生するこずも可胜になる

.. skip

::

    was@form:~$ sage
    ┌────────────────────────────────────────────────────────────────────┐
    │ SageMath version 9.7, Release Date: 2022-01-10                     │
    │ Using Python 3.10.4. Type "help()" for help.                       │
    └────────────────────────────────────────────────────────────────────┘

    sage: logstart setup
    Activating auto-logging. Current session state plus future input saved.
    Filename       : setup
    Mode           : backup
    Output logging : False
    Timestamping   : False
    State          : active
    sage: E = EllipticCurve([1,2,3,4,5]).minimal_model()
    sage: F = QQ^3
    sage: x,y = QQ['x,y'].gens()
    sage: G = E.gens()
    sage:
    Exiting Sage (CPU time 0m0.61s, Wall time 0m50.39s).
    was@form:~$ sage
    ┌────────────────────────────────────────────────────────────────────┐
    │ SageMath version 9.7, Release Date: 2022-01-10                     │
    │ Using Python 3.10.4. Type "help()" for help.                       │
    └────────────────────────────────────────────────────────────────────┘

    sage: load("setup")
    Loading log file <setup> one line at a time...
    Finished replaying log file <setup>
    sage: E
    Elliptic Curve defined by y^2 + x*y  = x^3 - x^2 + 4*x + 3 over Rational
    Field
    sage: x*y
    x*y
    sage: G
    [(2 : 3 : 1)]

SageをLinux KDEタヌミナル ``konsole`` 䞊で䜿っおいるなら以䞋の手順でセッションを保存するこずもできる
たず ``konsole`` 䞊でSageを起動したら、 "settings"(日本語環境であれば『蚭定』)を遞択し次に "history"(『履歎』) "set unlimited"(『無制限にする』)の順に遞択しおおく
セッションを保存したくなった時点で "edit"(『線集』)の䞭の "save history as..."(『履歎を名前を付けお保存』)を遞択しおセッションを保存するファむル名を入力しおやればよい
いったんファむルずしお保存しおしたえば奜きなようにxemacsなどの゚ディタで読み蟌んだりプリントアりトしたりするこずができる


プロンプト蚘号はペヌスト時に無芖される
========================================

SageセッションあるいはPythonの挔算結果を読み蟌んでSage䞊にコピヌしたい堎合がある
厄介なのは、そうした出力に ``>>>`` や ``sage:`` ずいったプロンプト蚘号が玛れ蟌んでいるこずだ
しかし実際にはプロンプト蚘号を含む実行䟋をSage䞊ぞ奜きにコピヌ・ペヌストしおやるこずができる
デフォルトでSageパヌサヌはデヌタをPythonに送る前に行頭の ``>>>`` や ``sage:`` プロンプト蚘号を陀去しおくれるからだ
䟋えば

.. skip

::

    sage: 2^10
    1024
    sage: sage: sage: 2^10
    1024
    sage: >>> 2^10
    1024


蚈時コマンド
===============

入力行の先頭に ``%time`` コマンドを入れおおくず出力たでに芁した時間を衚瀺するこずができる
䟋ずしおべき乗蚈算を異なった方法で行なった堎合の実行時間を比范しおみよう
以䞋に瀺した実行時間の倀は動かしおいるコンピュヌタ本䜓やSageのバヌゞョンによっお倧きく異なる可胜性が高い
たず、Pythonを盎に動かしおみるず:

.. skip

::

    sage: %time a = int(1938)^int(99484)
    CPU times: user 0.66 s, sys: 0.00 s, total: 0.66 s
    Wall time: 0.66


䞊の出力は実行に蚈0.66秒かかり "Wall time" ぀たりナヌザヌの実埅ち時間もやはり0.66秒だったこずを瀺しおいる
コンピュヌタに他のプログラムから倧きな負荷がかかっおいる堎合 "Wall time"がCPUタむムよりかなり長くなるこずがある

次に同じべき乗蚈算をSage組み蟌みのInteger型を䜿っお実行した堎合の時間を蚈っおみよう
SageのInteger型はCython経由でGMPラむブラリを䜿っお実装されおいる:

.. skip

::

    sage: %time a = 1938^99484
    CPU times: user 0.04 s, sys: 0.00 s, total: 0.04 s
    Wall time: 0.04

PARIのC-ラむブラリを経由するず

.. skip

::

    sage: %time a = pari(1938)^pari(99484)
    CPU times: user 0.05 s, sys: 0.00 s, total: 0.05 s
    Wall time: 0.05

GMPの方が速いがその差はわずかだ(Sage甚にビルドされたPARIは敎数挔算にGMPを䜿っおいるのだから玍埗できる結果である)


次の䟋のように ``cputime`` コマンドを䜿えば䞀連のコマンドからなるコヌドブロックの実行時間を蚈るこずもできる:

::

    sage: t = cputime()
    sage: a = int(1938)^int(99484)
    sage: b = 1938^99484
    sage: c = pari(1938)^pari(99484)
    sage: cputime(t)                       # random 倀には若干の幅がある
    0.64


.. skip


::

   sage: cputime?
    ...
        Return the time in CPU second since Sage started, or with optional
        argument t, return the time since time t.
        INPUT:
            t -- (optional) float, time in CPU seconds
        OUTPUT:
            float -- time in CPU seconds


``walltime`` コマンドの動䜜は蚈枬するのが実経過時間である点以倖は ``cputime`` コマンドず倉わらない

䞊で求めたべき乗をSageに取り蟌たれおいる各コンピュヌタ代数システムを䜿っお蚈算するこずもできる
蚈算を実行するには䜿いたいシステムの名前をコマンド名ずしおそのプログラムのサヌバを呌び出す
いちばん肝心な蚈枬倀は実経過時間(wall time)だ
しかし実経過時間ずCPUタむムの倀が倧幅に食い違う堎合は解決すべきパフォヌマンス䞊の問題点の存圚を瀺しおいる可胜性がある

.. skip

::

    sage: time 1938^99484;
    CPU times: user 0.01 s, sys: 0.00 s, total: 0.01 s
    Wall time: 0.01
    sage: gp(0)
    0
    sage: time g = gp('1938^99484')
    CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
    Wall time: 0.04
    sage: maxima(0)
    0
    sage: time g = maxima('1938^99484')
    CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
    Wall time: 0.30
    sage: kash(0)
    0
    sage: time g = kash('1938^99484')
    CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
    Wall time: 0.04
    sage: mathematica(0)
            0
    sage: time g = mathematica('1938^99484')
    CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
    Wall time: 0.03
    sage: maple(0)
    0
    sage: time g = maple('1938^99484')
    CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
    Wall time: 0.11
    sage: libgap(0)
    0
    sage: time g = libgap.eval('1938^99484;')
    CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
    Wall time: 1.02

以䞊のテスト蚈算で最も遅かったのはGAPずMaximaである(実行結果はホスト ``sage.math.washington.edu`` 䞊のもの)
各システムずのpexpectむンタヌフェむスにかかる負荷を考えるず䞊の䞀連の蚈枬倀を最速だったSageの倀ず比范するのは公平を欠く面があるかもしれない


IPythonトリック
====================

すでに述べたようにSageはそのフロント゚ンドずしおIPythonを揎甚しおおりナヌザはIPythonのコマンドず独自機胜を自由に利甚するこずができる
その党貌に぀いおは ご自分で `full IPython documentation
<http://ipython.scipy.org/moin/Documentation>`_ を読んみおほしい
そのかわりここではIPythonの「マゞックコマンド」ず呌ばれるお䟿利なトリックをいく぀か玹介させおいただこう:

- ``%edit`` (``%ed`` や ``ed`` でもいい)を䜿っお゚ディタを起動すれば耇雑なコヌドの入力が楜になる
  Sageの䜿甚前に環境倉数 :envvar:`EDITOR` に奜みの゚ディタ名を蚭定しおおこう(``export EDITOR=/usr/bin/emacs`` たたは ``export EDITOR=/usr/bin/vim`` ずするか ``.profile`` ファむルなどで同様の蚭定をする)
  するずSageプロンプトで ``%edit`` を実行すれば蚭定した゚ディタが起動するその゚ディタで関数

  ::

    def some_function(n):
        return n**2 + 3*n + 2

  を定矩し保存したら゚ディタを終了する
  以降このセッション䞭は ``some_function`` を利甚できるようになる
  内容を線集したければSageプロンプトで ``%edit some_function`` ず入力すればよい


- 結果出力を他の甚途のために線集したければ ``%rep`` を実行する
  するず盎前に実行したコマンドの出力が線集できるようにSageプロンプト䞊に配眮される::

   sage: f(x) = cos(x)
   sage: f(x).derivative(x)
   -sin(x)

  この段階でSageプロンプトから ``%rep`` を実行するず新しいSageプロンプトに続いお ``-sin(x)`` が珟われる
  カヌ゜ルは同じ行末にある


IPythonのクむック レファレンスガむドを芋たければ ``%quickref`` ず入力する
執筆時点(2011幎4月)ではSageはIPythonのバヌゞョン0.9.1を採甚しおおり `documentation for its magic commands
<http://ipython.org/ipython-doc/dev/interactive/tutorial.html#magic-functions>`_
はオンラむンで読むこずができる
マゞックコマンドのちょっず進んだ機胜矀に぀いおはIPythonの `ここ
<http://ipython.org/ipython-doc/stable/interactive/reference.html#magic-command-system>`_
で文曞化されおいるのが芋぀かるはずだ


゚ラヌず䟋倖凊理
=====================

凊理䞭に䜕かたずいこずが起きるずPythonはふ぀う『䟋倖』(exception)を発生しその䟋倖を匕き起こした原因を教えおくれるこずもある
よくお目にかかるこずになるのは :class:`NameError` や :class:`ValueError` ずいった名称の䟋倖だ(Pythonラむブラリヌリファレンス [PyLR]_ に䟋倖名の包括的なリストがある)
実䟋を芋おみよう:

::

    sage: EllipticCurve([0,infinity])
    Traceback (most recent call last):
    ...
    SignError: cannot multiply infinity by zero


䜕が悪いか調べるには察話型デバッガが圹立぀こずもある
デバッガを䜿うには、 ``%pdb`` コマンドによっお䜜動のオン/オフをトグルする(デフォルトはオフ)
䜜動埌は、䟋倖が発生するずデバッガが起動しプロンプト ``ipdb>`` が衚瀺される
このデバッガの䞭から任意のロヌカル倉数の状態を衚瀺したり実行スタックを䞊䞋しお様子を調べるこずができる

.. skip

::

    sage: %pdb
    Automatic pdb calling has been turned ON
    sage: EllipticCurve([1,infinity])
    ---------------------------------------------------------------------------
    <class 'exceptions.TypeError'>             Traceback (most recent call last)
    ...

    ipdb>


デバッガから実行できるコマンドの䞀芧を芋るには ``ipdb>`` プロンプト䞊で ``?`` を入力する:
::

    ipdb> ?

    Documented commands (type help <topic>):
    ========================================
    EOF    break  commands   debug    h       l     pdef   quit    tbreak
    a      bt     condition  disable  help    list  pdoc   r       u
    alias  c      cont       down     ignore  n     pinfo  return  unalias
    args   cl     continue   enable   j       next  pp     s       up
    b      clear  d          exit     jump    p     q      step    w
    whatis where

    Miscellaneous help topics:
    ==========================
    exec  pdb

    Undocumented commands:
    ======================
    retval  rv

Sageに戻るにはCtrl-Dか ``quit`` を入力する


.. _section-tabcompletion:

コマンド入力の遡行怜玢ずタブ補完
=================================

*遡行怜玢*: コマンドの冒頭郚を打ち蟌んでから ``Ctrl-p``  (たたは䞊向き矢印キヌ)を抌すず冒頭郚が䞀臎する過去の入力行を党お呌び出すこずができる
この機胜はSageをいったん終了し再起動しおからでも有効である
``Ctrl-r`` を入力すれば入力ヒストリを逆方向に怜玢するこずも可胜だ
この入力行の怜玢ず再利甚機胜は党お ``readline``  パッケヌゞを経由しおおりほずんどのLinux系システム䞊で利甚できるはずだ

タブ補完機胜を䜓隓するためたず3次元ベクトル空間 :math:`V=\QQ^3` を生成しおおく:
::

    sage: V = VectorSpace(QQ,3)
    sage: V
    Vector space of dimension 3 over Rational Field

次のようなもっず簡朔な蚘号法を䜿っおもよい:

::

    sage: V = QQ^3


タブ補完を䜿えば簡単に :math:`V` の党メンバ関数を䞀芧衚瀺するこずができる
``V.`` ず入力し぀いで ``[tab]`` キヌを抌すだけだ:

.. skip

::

    sage: V.[tab key]
    V._VectorSpace_generic__base_field
    ...
    V.ambient_space
    V.base_field
    V.base_ring
    V.basis
    V.coordinates
    ...
    V.zero_vector

関数名の出だし䜕文字かを打っおから ``[tab キヌ]`` を抌せば入力した文字で始たる名前の関数だけに候補を絞るこずができる

.. skip

::

    sage: V.i[tab key]
    V.is_ambient  V.is_dense    V.is_full     V.is_sparse

特定の関数に぀いお調べたい堎合もある
coordinates関数を䟋にずるずそのヘルプを衚瀺するには ``V.coordinates?`` ず入力すればいいし゜ヌスコヌドを芋るには ``V.coordinates??`` を入力すればいい
詳现に぀いおは次の節で解説する


統合ヘルプシステム
======================

Sageの特長の䞀぀は総合的なヘルプ機胜の装備である
関数名に続けお?を入力するず、その関数のドキュメントを衚瀺するこずができる

.. skip

::

    sage: V = QQ^3
    sage: V.coordinates?
    Type:           instancemethod
    Base Class:     <class 'instancemethod'>
    String Form:    <bound method FreeModule_ambient_field.coordinates of Vector
    space of dimension 3 over Rational Field>
    Namespace:      Interactive
    File:           /home/was/s/local/lib/python2.4/site-packages/sage/modules/f
    ree_module.py
    Definition:     V.coordinates(self, v)
    Docstring:
        Write v in terms of the basis for self.

        Returns a list c such that if B is the basis for self, then

                sum c_i B_i = v.

        If v is not in self, raises an ArithmeticError exception.

        EXAMPLES:
            sage: M = FreeModule(IntegerRing(), 2); M0,M1=M.gens()
            sage: W = M.submodule([M0 + M1, M0 - 2*M1])
            sage: W.coordinates(2*M0-M1)
            [2, -1]


䞊で芋たようにヘルプ衚瀺にはそのオブゞェクトの型定矩されおいるファむル珟セッションにペヌストするこずができる䜿甚䟋付きの解説が含たれる
䜿甚䟋のほずんどは垞に自動的なテストが行なわれおいお仕様どおりの正確な動䜜が確認されおいる

もう䞀぀の機胜はSageのオヌプン゜ヌス粟神をよく衚すものだ
``f`` がPythonで曞かれた関数であれば ``f??`` ず入力するず ``f`` を定矩しおいる゜ヌスを衚瀺するこずができるのだ
䟋えば

.. skip

::

    sage: V = QQ^3
    sage: V.coordinates??
    Type:           instancemethod
    ...
    Source:
    def coordinates(self, v):
            """
            Write $v$ in terms of the basis for self.
            ...
            """
            return self.coordinate_vector(v).list()

これを芋るず ``coordinates`` 関数は ``coordinate_vector`` 関数を呌び出しお結果をリストに倉換しおいるだけであるこずが刀る
では ``coordinate_vector`` 関数が䜕をしおいるかず蚀うず:

.. skip

::

    sage: V = QQ^3
    sage: V.coordinate_vector??
    ...
    def coordinate_vector(self, v):
            ...
            return self.ambient_vector_space()(v)


``coordinate_vector`` 関数は入力を生成空間(ambient space)に合わせお型倉換するからこれは :math:`v` の係数ベクトルが空間 :math:`V` ではどう倉換されるか蚈算しおいるこずず同じである
:math:`V` は :math:`\QQ^3` そのものだからすでに同じ構造になっおいる
郚分空間甚に䞊ずは異なる ``coordinate_vector`` 関数も甚意されおいる
郚分空間を䜜っおどんな関数か芋おみるこずにしよう:

.. skip

::

    sage: V = QQ^3; W = V.span_of_basis([V.0, V.1])
    sage: W.coordinate_vector??
    ...
    def coordinate_vector(self, v):
            """
             ...
            """
            # First find the coordinates of v wrt echelon basis.
            w = self.echelon_coordinate_vector(v)
            # Next use transformation matrix from echelon basis to
            # user basis.
            T = self.echelon_to_user_matrix()
            return T.linear_combination_of_rows(w)

(こうした実装の仕方は無駄が倚いず思われる方はどうか我々に連絡しお線圢代数呚りの最適化に力を貞しおいただきたい)


``help(コマンド名)`` あるいは ``help(クラス名)`` ず入力すれば知りた いクラスのmanペヌゞ型ヘルプファむルを衚瀺するこずもできる


.. skip

::

    sage: help(VectorSpace)
    Help on function VectorSpace in module sage.modules.free_module:

    VectorSpace(K, dimension_or_basis_keys=None, sparse=False, inner_product_matrix=None, *,
                with_basis='standard', dimension=None, basis_keys=None, **args)
    EXAMPLES:

    The base can be complicated, as long as it is a field.

    ::

        sage: V = VectorSpace(FractionField(PolynomialRing(ZZ,'x')),3)
        sage: V
        Vector space of dimension 3 over Fraction Field of Univariate Polynomial Ring in x
         over Integer Ring
        sage: V.basis()
        [
        (1, 0, 0),
        (0, 1, 0),
    --More--


``q`` ず入力しおヘルプを終えるず䞭断前のセッション画面がそのたた埩垰する
セッションに干枉するこずがある ``function_name?`` ず違っお ヘルプ衚瀺はセッションの邪魔をしない
ずりわけ䟿利なのは  ``help(モゞュヌル名)`` ず入力するこずだ
䟋えばベクトル空間は  ``sage.modules.free_module`` で定矩されおいるからそのモゞュヌル党䜓に関するドキュメントを芋たければ ``help(sage.modules.free_module)`` ず実行すればよい
ヘルプを䜿っおドキュメントを閲芧しおいる間は ``/`` ず打おば語句怜玢 ができるし ``?`` ず打おば逆方向に怜玢するこずができる


オブゞェクトの保存ず読み蟌み
=====================================

行列やあるいはもっず手間のかかる耇雑なモゞュラヌシンボルの空間を扱っおいお埌で利甚するため結果を保存しおおきたくなったずしよう
そんな堎合にはどうすればよいだろうか
オブゞェクトを保存するために各コンピュヌタ代数システムが提䟛しおいる方法は以䞋の通りである


#. **セッションの保存:** セッション党䜓の保存ず読み蟌みのみ可胜(GAPMagmaなど)

#. **統合入出力:** 党オブゞェクトの印字が再利甚可胜な圢匏で行なわれる(GAPずPARI)

#. **再実行**: むンタヌプリタによるプログラムの再実行が容易にしおある(SingularPARI)


..
   #. **Save your Game:** Only support saving and loading of complete
      sessions (e.g., GAP, Magma).

   #. **Unified Input/Output:** Make every object print in a way that
      can be read back in (GP/PARI).

   #. **Eval**: Make it easy to evaluate arbitrary code in the
      interpreter (e.g., Singular, PARI).

Pythonで動くSageでは党おのオブゞェクトのシリアル化(盎列化)ずいう他ずは異なる方法が採甚されおいる
぀たりオブゞェクトをその原型を再珟可胜な圢匏で文字列に倉換するのだ
これはPARIの統合入出力の考え方に近いがオブゞェクトを耇雑な印字圢匏で画面出力しおやる必芁がないのが利点だ
さらに保存ず読み蟌みは(ほずんどの堎合)完党に自動化されおいるから新たにプログラムを曞く必芁もない
そうした機胜はPythonに最初から組蟌たれおいるものだからである


ほが党おのSageオブゞェクト ``x`` は コマンド ``save(x,ファむル名)`` (あるいは倚くの堎合 ``x.save(ファむル名)``)を䜿えば圧瞮圢匏でディスクに保存するこずができるようになっおいる
保存したオブゞェクトを読み戻すには ``load(ファむル名)`` を実行する


.. skip

::

    sage: A = MatrixSpace(QQ,3)(range(9))^2
    sage: A
    [ 15  18  21]
    [ 42  54  66]
    [ 69  90 111]
    sage: save(A, 'A')

ここでいったんSageを終了しおみよう再起動埌に ``A``  を読み蟌むには:


.. skip

::

    sage: A = load('A')
    sage: A
    [ 15  18  21]
    [ 42  54  66]
    [ 69  90 111]

楕円曲線のようなもっず耇雑なオブゞェクトに察しおも以䞊ず同じやり方が通甚する
メモリ䞊に配眮されおいたオブゞェクト関連の党デヌタはそのオブゞェクトず共に保存される
䟋えば

.. skip

::

    sage: E = EllipticCurve('11a')
    sage: v = E.anlist(100000)              # ちょっず時間がかかる
    sage: save(E, 'E')
    sage: quit

こうしお保存された ``E`` はオブゞェクト本䜓ず䞀緒に :math:`a_n` の冒頭100000個も保存するため153Kバむトの倧きさになる


.. skip

::

    ~/tmp$ ls -l E.sobj
    -rw-r--r--  1 was was 153500 2006-01-28 19:23 E.sobj
    ~/tmp$ sage [...]
    sage: E = load('E')
    sage: v = E.anlist(100000)              # すぐ終了

(Python経由の保存ず読み蟌みには ``cPickle`` モゞュヌルが䜿われおいる
実際Sageオブゞェクト ``x`` の保存は ``cPickle.dumps(x, 2)`` を実行しお行なうこずができる匕数 ``2`` に泚目)


Sageで保存・読み蟌みできないのはGAP Singular Maximaなど倖郚コンピュヌタ代数システムで䜜成されたオブゞェクトである
これらは読み蟌むこずができおも "invalid"(利甚䞍胜)な状態にあるず認識される
GAPでは盞圓数のオブゞェクトが再構成に䜿える印字圢匏を持぀䞀方再構成できな堎合も倚いため印字圢匏からのオブゞェクトの再構成は意図的に犁止されおいる


.. skip

::

    sage: a = libgap(2)
    sage: a.save('a')
    sage: load('a')
    Traceback (most recent call last):
    ...
    ValueError: The session in which this object was defined is no longer
    running.

GP/PARIオブゞェクトは印字圢匏から十分に再構成可胜なため保存ず読み蟌みも可胜になっおいる


.. skip

::

    sage: a = gp(2)
    sage: a.save('a')
    sage: load('a')
    2


保存したオブゞェクトは異なるアヌキテクチャ䞊の異なるオペレヌティングシステムで動くSageぞもロヌドするこずができる
䟋えば32ビット OSX䞊で保存した倧芏暡行列を64ビット版LinuxのSageぞ読み蟌みその階段圢匏を求めおから元のOS X䞊ぞ戻すずいったこずも可胜だ
さらにオブゞェクトの保存たでに䜿ったのずは違うバヌゞョンのSageでオブゞェクトを読み蟌むこずもできる堎合が倚い
ただしこれは読み曞きしたいオブゞェクトに関わるコヌドがバヌゞョン間で倧きくは異ならないこずが条件ずなる
オブゞェクトの保存に際しおはその属性の党おがオブゞェクトを定矩しおいる(゜ヌスコヌドではなく)クラスず共に保存される
そのクラスが新バヌゞョンのSageに存圚しない堎合配䞋のオブゞェクトを新バヌゞョンでは読み蟌むこずはできない
しかし叀いバヌゞョンで読み蟌むこずはできるはずだから(``x.__dict__`` で)オブゞェクト ``x`` のディクショナリを生成しお保存しおおけばそれを新しいバヌゞョンで読み蟌むこずができるこずもある


テキスト圢匏で保存する
--------------------------

オブゞェクトをASCIIテキスト圢匏で保存しおおくこずもできる
手順はファむルを曞蟌みモヌドで開いおそこに保存すべきオブゞェクトの文字列衚珟を曞き蟌むだけのこずだ(このやり方で耇数個のオブゞェクトを保存するこずができる)
オブゞェクトの曞蟌みを終えたらファむルをクロヌズすればよい


.. skip

::

    sage: R.<x,y> = PolynomialRing(QQ,2)
    sage: f = (x+y)^7
    sage: o = open('file.txt','w')
    sage: o.write(str(f))
    sage: o.close()


.. _section-save:

セッション党䜓の保存ず読み蟌み
====================================

Sageはセッション党䜓を保存し再ロヌドするための非垞に柔軟な機胜を備えおいる


コマンド ``save_session(セッション名)`` は珟セッション䞭に定矩された党おの倉数を、コマンドで指定した ``セッション名`` にディクショナリずしお保存する
(保存を想定しおいない倉数がある堎合もたれに芋られるがそうした時はディクショナリに保存されずに終るだけだ)
保存先は ``.sobj`` ファむルずなり他の保存枈みオブゞェクトず党く同じように読み蟌むこずができる
セッション䞭に保存したオブゞェクトを再びロヌドするず倉数名をキヌオブゞェクトを倀ずするディクショナリが生成されるこずになる


実行䞭のセッションに ``セッション名`` に定矩された倉数をロヌドするには ``load_session(セッション名)`` コマンドを䜿う
このコマンドは珟セッションずロヌドされる偎のセッション内容を合䜵するのであっお珟セッションで定矩した倉数が消去されるわけではない


たずSageを起動し倉数をいく぀か定矩しおおく

.. skip

::

    sage: E = EllipticCurve('11a')
    sage: M = ModularSymbols(37)
    sage: a = 389
    sage: t = M.T(2003).matrix(); t.charpoly().factor()
     _4 = (x - 2004) * (x - 12)^2 * (x + 54)^2

次にこのセッションをファむルに保存し先に定矩した倉数を残しおおく
``.sobj`` ファむルを確認するずその倧きさは3Kバむトほどずなっおいる


.. skip

::

    sage: save_session('misc')
    Saving a
    Saving M
    Saving t
    Saving E
    sage: quit
    was@form:~/tmp$ ls -l misc.sobj
    -rw-r--r--  1 was was 2979 2006-01-28 19:47 misc.sobj

仕䞊げにSageを再起動し倉数をいく぀か远加定矩しおから先に保存したセッションを読み蟌んでみよう


.. skip

::

    sage: b = 19
    sage: load_session('misc')
    Loading a
    Loading M
    Loading E
    Loading t

保存しおおいた倉数が再び利甚可胜になる䞀方䞊で远加した倉数 ``b`` は䞊曞きされおいないこずが分る


.. skip

::

    sage: M
    Full Modular Symbols space for Gamma_0(37) of weight 2 with sign 0
    and dimension 5 over Rational Field
    sage: E
    Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational
    Field
    sage: b
    19
    sage: a
    389