Sophie

Sophie

distrib > Fedora > 18 > i386 > by-pkgid > 971a3706a7676677c8b7bbdffc0c4b9b > files > 197

sagemath-doc-ru-5.9-9.fc18.noarch.rpm


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">


<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
    <title>Интерактивная оболочка &mdash; Sage Tutorial in Russian v5.9</title>
    
    <link rel="stylesheet" href="_static/sage.css" type="text/css" />
    <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
    
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '',
        VERSION:     '5.9',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '.html',
        HAS_SOURCE:  true
      };
    </script>
    <script type="text/javascript" src="_static/jquery.js"></script>
    <script type="text/javascript" src="_static/underscore.js"></script>
    <script type="text/javascript" src="_static/doctools.js"></script>
    <script type="text/javascript" src="_static/translations.js"></script>
    <link rel="shortcut icon" href="_static/favicon.ico"/>
    <link rel="top" title="Sage Tutorial in Russian v5.9" href="index.html" />
    <link rel="next" title="Интерфейсы" href="interfaces.html" />
    <link rel="prev" title="Немного высшей математики" href="tour_advanced.html" />
    <link rel="icon" href="_static/sageicon.png" type="image/x-icon" />

  </head>
  <body>
    <div class="related">
      <h3>Просмотр</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="Словарь-указатель"
             accesskey="I">словарь</a></li>
        <li class="right" >
          <a href="py-modindex.html" title="Python Module Index"
             >модули</a> |</li>
        <li class="right" >
          <a href="interfaces.html" title="Интерфейсы"
             accesskey="N">следующий</a> |</li>
        <li class="right" >
          <a href="tour_advanced.html" title="Немного высшей математики"
             accesskey="P">предыдущий</a> |</li>
  
    
      <a href="../index.html"><img src="_static/sagelogo.png" style="vertical-align: middle" title="Sage Logo"></a>
    
  
  
        <li><a href="index.html">Sage Tutorial in Russian v5.9</a> &raquo;</li>
 
      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="chapter-interactive-shell">
<span id="id1"></span><h1>Интерактивная оболочка<a class="headerlink" href="#chapter-interactive-shell" title="Ссылка на этот заголовок">¶</a></h1>
<p>Почти всегда в этом руководстве мы предполагаем, что интерпретатор
Sage был запущен командой <tt class="docutils literal"><span class="pre">sage</span></tt>. Она запустит специальную версию
консоли IPython и импортирует множество функций и классов, так что
они готовы для использования в командной строке. Более тонкая настройка
производится редактированием файла <tt class="docutils literal"><span class="pre">$SAGE_ROOT/ipythonrc</span></tt>. При запуске
Sage вы увидите вывод, похожий на следующий:</p>
<div class="highlight-python"><pre>----------------------------------------------------------------------
| SAGE Version 3.1.1, Release Date: 2008-05-24                       |
| Type notebook() for the GUI, and license() for information.        |
----------------------------------------------------------------------


sage:</pre>
</div>
<p>Чтобы выйти из Sage, нажмите Ctrl-D или введите <tt class="docutils literal"><span class="pre">quit</span></tt> или <tt class="docutils literal"><span class="pre">exit</span></tt>.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: quit</span>
<span class="go">Exiting SAGE (CPU time 0m0.00s, Wall time 0m0.89s)</span>
</pre></div>
</div>
<p>Wall time — это прошедшее время. Это значение верно, потому как в &#8220;CPU time&#8221;
не входит время, использованное субпроцессами вроде GAP или Singular.</p>
<p>(Постарайтесь не убивать процесс Sage командой <tt class="docutils literal"><span class="pre">kill</span> <span class="pre">-9</span></tt> из терминала,
потому что Sage может не убить дочерние процессы, такие как Maple, или может
не очистить временные файлы из директории <tt class="docutils literal"><span class="pre">$HOME/.sage/tmp</span></tt>.)</p>
<div class="section" id="sage">
<h2>Ваша сессия Sage<a class="headerlink" href="#sage" title="Ссылка на этот заголовок">¶</a></h2>
<p>Сессия — это последовательность вводов и выводов начиная с запуска программы
и заканчивая выходом из нее. Sage заносит всю историю вводов в log-файл,
используя IPython. Если вы используете интерактивную оболочку (не веб-интерфейс
Notebook), то вы можете ввести <tt class="docutils literal"><span class="pre">%hist</span></tt>, чтобы вывести список всех введенных
команд. Вы можете ввести <tt class="docutils literal"><span class="pre">?</span></tt> в командной строке Sage, чтобы получить больше
информации о IPython, например,
&#8220;IPython предоставляет пронумерованные командные строки... с кешированием ввода и вывода. Все введенные данные сохраняются и могут быть использованы как переменные (помимо обычного вызова с помощью стрелок). Следующие глобальные переменные присутствуют всегда (не перезаписывайте их!)&#8221;:</p>
<div class="highlight-python"><pre>_:  previous input (interactive shell and notebook)
__: next previous input (interactive shell only)
_oh : list of all inputs (interactive shell only)</pre>
</div>
<p>Пример:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: factor(100)</span>
<span class="go"> _1 = 2^2 * 5^2</span>
<span class="go">sage: kronecker_symbol(3,5)</span>
<span class="go"> _2 = -1</span>
<span class="go">sage: %hist   # Работает только в интерактивной оболочке, но не в Sage notebook.</span>
<span class="go">1: factor(100)</span>
<span class="go">2: kronecker_symbol(3,5)</span>
<span class="go">3: %hist</span>
<span class="go">sage: _oh</span>
<span class="go"> _4 = {1: 2^2 * 5^2, 2: -1}</span>
<span class="go">sage: _i1</span>
<span class="go"> _5 = &#39;factor(ZZ(100))\n&#39;</span>
<span class="go">sage: eval(_i1)</span>
<span class="go"> _6 = 2^2 * 5^2</span>
<span class="go">sage: %hist</span>
<span class="go">1: factor(100)</span>
<span class="go">2: kronecker_symbol(3,5)</span>
<span class="go">3: %hist</span>
<span class="go">4: _oh</span>
<span class="go">5: _i1</span>
<span class="go">6: eval(_i1)</span>
<span class="go">7: %hist</span>
</pre></div>
</div>
<p>Мы не включаем номера строк в этом учебном пособии и в другой документации Sage.</p>
<p>Вы также можете хранить список введенных команд сессии в виде макроса для сессии.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: E = EllipticCurve([1,2,3,4,5])</span>
<span class="go">sage: M = ModularSymbols(37)</span>
<span class="go">sage: %hist</span>
<span class="go">1: E = EllipticCurve([1,2,3,4,5])</span>
<span class="go">2: M = ModularSymbols(37)</span>
<span class="go">3: %hist</span>
<span class="go">sage: %macro em 1-2</span>
<span class="go">Macro `em` created. To execute, type its name (without quotes).</span>
</pre></div>
</div>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: E</span>
<span class="go">Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 5 over</span>
<span class="go">Rational Field</span>
<span class="go">sage: E = 5</span>
<span class="go">sage: M = None</span>
<span class="go">sage: em</span>
<span class="go">Executing Macro...</span>
<span class="go">sage: E</span>
<span class="go">Elliptic Curve defined by y^2 + x*y + 3*y = x^3 + 2*x^2 + 4*x + 5 over</span>
<span class="go">Rational Field</span>
</pre></div>
</div>
<p>При использовании интерактивной оболочки Sage, любая UNIX-команда может быть
запущена с помощью префикса <tt class="docutils literal"><span class="pre">!</span></tt>. Например</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: !ls</span>
<span class="go">auto  example.sage glossary.tex  t  tmp  tut.log  tut.tex</span>
</pre></div>
</div>
<p>возвращает содержание текущей директории.</p>
<p>Переменная <tt class="docutils literal"><span class="pre">PATH</span></tt> сожержит директорию bin (бинарные файлы) в самом начале,
так что если вы запускаете <tt class="docutils literal"><span class="pre">gp</span></tt>, <tt class="docutils literal"><span class="pre">gap</span></tt>, <tt class="docutils literal"><span class="pre">singular</span></tt>, <tt class="docutils literal"><span class="pre">maxima</span></tt>, и т.д.
вы получаете версии, включенные в Sage.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: !gp</span>
<span class="go">Reading GPRC: /etc/gprc ...Done.</span>

<span class="go">                           GP/PARI CALCULATOR Version 2.2.11 (alpha)</span>
<span class="go">                  i686 running linux (ix86/GMP-4.1.4 kernel) 32-bit version</span>
<span class="gp">...</span>
<span class="go">sage: !singular</span>
<span class="go">                     SINGULAR                             /  Development</span>
<span class="go"> A Computer Algebra System for Polynomial Computations   /   version 3-0-1</span>
<span class="go">                                                       0&lt;</span>
<span class="go">     by: G.-M. Greuel, G. Pfister, H. Schoenemann        \   October 2005</span>
<span class="go">FB Mathematik der Universitaet, D-67653 Kaiserslautern    \</span>
</pre></div>
</div>
</div>
<div class="section" id="id2">
<h2>Журналирование ввода и вывода<a class="headerlink" href="#id2" title="Ссылка на этот заголовок">¶</a></h2>
<p>Журналирование сессии Sage это не то же самое, что сохрнанение
сессии (см. <a class="reference internal" href="#section-save"><em>Сохранение и загрузка полных сессий</em></a> для этого). Для журналирования ввода (и, опционально,
вывода), используйте команду <tt class="docutils literal"><span class="pre">logstart</span></tt>. Введите <tt class="docutils literal"><span class="pre">logstart?</span></tt> для подробностей.
Вы можете использовать эту команду для журналирования всего, что вы вводите, всего
вывода, и даже можете воспроизвести введенные данные в будущей сессии (просто
загрузив log-файл).</p>
<div class="highlight-python"><pre>was@form:~$ sage
----------------------------------------------------------------------
| SAGE Version 3.0.2, Release Date: 2008-05-24                       |
| Type notebook() for the GUI, and license() for information.        |
----------------------------------------------------------------------

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
----------------------------------------------------------------------
| SAGE Version 3.0.2, Release Date: 2008-05-24                       |
| Type notebook() for the GUI, and license() for information.        |
----------------------------------------------------------------------

sage: load "setup"
Loading log file &lt;setup&gt; one line at a time...
Finished replaying log file &lt;setup&gt;
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)]</pre>
</div>
<p>Если вы используете Sage в <tt class="docutils literal"><span class="pre">konsole</span></tt> — терминале среды KDE в GNU/Linux —
тогда вы можете сохранить сессию следующим образом: после запуска Sage в
<tt class="docutils literal"><span class="pre">konsole</span></tt>, выберите &#8220;settings&#8221;, потом &#8220;history...&#8221;, потом &#8220;set unlimited&#8221;.
Когда вы готовы сохранить сессию, выберите &#8220;edit&#8221; и &#8220;save history as...&#8221; и
введите имя файла для сохранения. После этого вы можете воспользоваться
любым текстовым редактором, например xemacs, для чтения файла.</p>
</div>
<div class="section" id="id3">
<h2>Вставка игнорирует приглашение<a class="headerlink" href="#id3" title="Ссылка на этот заголовок">¶</a></h2>
<p>Допустим, вы читаете сессию Sage или вычисления Python, и хотите скопировать
их в Sage. Но есть одна проблема: знаки <tt class="docutils literal"><span class="pre">&gt;&gt;&gt;</span></tt> или <tt class="docutils literal"><span class="pre">sage:</span></tt>. На самом деле
вы можете копировать и вставлять примеры, которые включают эти знаки. Дргуими
словами, Sage игнорирует символы <tt class="docutils literal"><span class="pre">&gt;&gt;&gt;</span></tt> или <tt class="docutils literal"><span class="pre">sage:</span></tt> перед отправкой команд
в Python. Например,</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: 2^10</span>
<span class="go">1024</span>
<span class="go">sage: sage: sage: 2^10</span>
<span class="go">1024</span>
<span class="go">sage: &gt;&gt;&gt; 2^10</span>
<span class="go">1024</span>
</pre></div>
</div>
</div>
<div class="section" id="id4">
<h2>Команды измерения времени<a class="headerlink" href="#id4" title="Ссылка на этот заголовок">¶</a></h2>
<p>Если вы введете команду <tt class="docutils literal"><span class="pre">%time</span></tt> в начале строки ввода, то время,
затраченное на выполнение операции, будет выведено на экран. Например, вы
можете измерить время выполнения операции возведения в степень несколькими
путями. Показания ниже будут отличаться от ваших; они могут отличаться даже
в разных версиях Sage. Чистый Python:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: %time a = int(1938)^int(99484)</span>
<span class="go">CPU times: user 0.66 s, sys: 0.00 s, total: 0.66 s</span>
<span class="go">Wall time: 0.66</span>
</pre></div>
</div>
<p>Это означает что 0.66 секунд было затрачено в сумме, а &#8220;Wall time&#8221;,
(прошедшее время), тоже 0.66 секунд. Если ваш компьютер сильно загружен
другими процессами, то &#8220;Wall time&#8221; может сильно отличаться от процессорного
времени.</p>
<p>Далее мы посчитаем время возведения в степень с использованием встроенного в
Sage целочисленного типа данных, реализованного (в Cython) с использованием
библиотеки GMP:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: %time a = 1938^99484</span>
<span class="go">CPU times: user 0.04 s, sys: 0.00 s, total: 0.04 s</span>
<span class="go">Wall time: 0.04</span>
</pre></div>
</div>
<p>Используя интерфейс PARI из библиотеки C:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: %time a = pari(1938)^pari(99484)</span>
<span class="go">CPU times: user 0.05 s, sys: 0.00 s, total: 0.05 s</span>
<span class="go">Wall time: 0.05</span>
</pre></div>
</div>
<p>GMP ведет себя лучше, но только немного (как и ожидалось, ведь версия PARI,
встроенная в Sage, использует GMP для работы с целыми числами).</p>
<p>Вы также можете замерить время выполнения блока команд с помощью <tt class="docutils literal"><span class="pre">cputime</span></tt>,
как показано ниже:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: t = cputime()</span>
<span class="go">sage: a = int(1938)^int(99484)</span>
<span class="go">sage: b = 1938^99484</span>
<span class="go">sage: c = pari(1938)^pari(99484)</span>
<span class="go">sage: cputime(t)                       # random output</span>
<span class="go">0.64</span>
</pre></div>
</div>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: cputime?</span>
<span class="gp">...</span>
<span class="go">    Return the time in CPU second since SAGE started, or with optional</span>
<span class="go">    argument t, return the time since time t.</span>
<span class="go">    INPUT:</span>
<span class="go">        t -- (optional) float, time in CPU seconds</span>
<span class="go">    OUTPUT:</span>
<span class="go">        float -- time in CPU seconds</span>
</pre></div>
</div>
<p>Команда <tt class="docutils literal"><span class="pre">walltime</span></tt> ведет себя так же, как <tt class="docutils literal"><span class="pre">cputime</span></tt>, но она измеряет
настоящее время.</p>
<p>Мы также можем возвести число в степень, используя системы компьютерной
алгебры, включённые в Sage. В каждом случае мы запускаем простую команду
в системе чтобы запустить сервер для этой программы. Самое точное - время это
Wall time. Однако, если существует существенная разница между этим значением
и процессорным временем (CPU time), то, возможно, есть смысл проверить систему
на наличие проблем производительности.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: time 1938^99484;</span>
<span class="go">CPU times: user 0.01 s, sys: 0.00 s, total: 0.01 s</span>
<span class="go">Wall time: 0.01</span>
<span class="go">sage: gp(0)</span>
<span class="go">0</span>
<span class="go">sage: time g = gp(&#39;1938^99484&#39;)</span>
<span class="go">CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s</span>
<span class="go">Wall time: 0.04</span>
<span class="go">sage: maxima(0)</span>
<span class="go">0</span>
<span class="go">sage: time g = maxima(&#39;1938^99484&#39;)</span>
<span class="go">CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s</span>
<span class="go">Wall time: 0.30</span>
<span class="go">sage: kash(0)</span>
<span class="go">0</span>
<span class="go">sage: time g = kash(&#39;1938^99484&#39;)</span>
<span class="go">CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s</span>
<span class="go">Wall time: 0.04</span>
<span class="go">sage: mathematica(0)</span>
<span class="go">        0</span>
<span class="go">sage: time g = mathematica(&#39;1938^99484&#39;)</span>
<span class="go">CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s</span>
<span class="go">Wall time: 0.03</span>
<span class="go">sage: maple(0)</span>
<span class="go">0</span>
<span class="go">sage: time g = maple(&#39;1938^99484&#39;)</span>
<span class="go">CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s</span>
<span class="go">Wall time: 0.11</span>
<span class="go">sage: gap(0)</span>
<span class="go">0</span>
<span class="go">sage: time g = gap.eval(&#39;1938^99484;;&#39;)</span>
<span class="go">CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s</span>
<span class="go">Wall time: 1.02</span>
</pre></div>
</div>
<p>Заметьте, что GAP и Maxima являются самыми медленными в этом тесте (тест
был проведен на машине <tt class="docutils literal"><span class="pre">sage.math.washington.edu</span></tt>). Так как они работают
с другим интерфейсом, надстроенным над ними, судить об абсолютной
производительности этих систем не стоит.</p>
</div>
<div class="section" id="id5">
<h2>Ошибки и исключения<a class="headerlink" href="#id5" title="Ссылка на этот заголовок">¶</a></h2>
<p>Когда что-то идет не так, обычно можно увидеть исключение Python (Python
&#8220;exception&#8221;). Python даже попытается предположить, что вызвало ошибку. Часто
вы можете видеть имя исключения, например, <tt class="docutils literal"><span class="pre">NameError</span></tt> или <tt class="docutils literal"><span class="pre">ValueError</span></tt>
(см. Python Reference Manual <a class="reference internal" href="bibliography.html#py">[Py]</a> для полного списка исключений). Например,</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: 3_2</span>
<span class="go">------------------------------------------------------------</span>
<span class="go">   File &quot;&lt;console&gt;&quot;, line 1</span>
<span class="go">     ZZ(3)_2</span>
<span class="go">           ^</span>
<span class="go">SyntaxError: invalid syntax</span>

<span class="go">sage: EllipticCurve([0,infinity])</span>
<span class="go">------------------------------------------------------------</span>
<span class="gt">Traceback (most recent call last):</span>
<span class="c">...</span>
<span class="gr">TypeError</span>: <span class="n">Unable to coerce Infinity (&lt;class &#39;sage...Infinity&#39;&gt;) to Rational</span>
</pre></div>
</div>
<p>Интерактивный отладчик может быть полезным для понимая того, что пошло не так.
Отладчик можно включать или выключать командой <tt class="docutils literal"><span class="pre">%pdb</span></tt> (по умолчанию он
выключен). Приглашение командной строки <tt class="docutils literal"><span class="pre">ipdb&gt;</span></tt> появляется на экране,
если случилось исключение и отладчик был включен. Из отладчика вы можете
вывести на экран состояние любой локальной переменной и двигаться вверх и вниз
по стеку (execution stack). Например,</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: %pdb</span>
<span class="go">Automatic pdb calling has been turned ON</span>
<span class="go">sage: EllipticCurve([1,infinity])</span>
<span class="go">---------------------------------------------------------------------------</span>
<span class="go">&lt;type &#39;exceptions.TypeError&#39;&gt;             Traceback (most recent call last)</span>
<span class="gp">...</span>

<span class="go">ipdb&gt;</span>
</pre></div>
</div>
<p>Для получения списка команд отладчика введите <tt class="docutils literal"><span class="pre">?</span></tt> в командной строке <tt class="docutils literal"><span class="pre">ipdb&gt;</span></tt>:</p>
<div class="highlight-python"><pre>ipdb&gt; ?

Documented commands (type help &lt;topic&gt;):
========================================
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</pre>
</div>
<p>Нажмите Ctrl-D или введите <tt class="docutils literal"><span class="pre">quit</span></tt> чтобы вернуться в Sage.</p>
</div>
<div class="section" id="section-tabcompletion">
<span id="id7"></span><h2>Обратный поиск и автодополнение<a class="headerlink" href="#section-tabcompletion" title="Ссылка на этот заголовок">¶</a></h2>
<p>Сначала создадим трехмерное векторное пространство <img class="math" src="_images/math/ea0ae4a2520f18a9a18589c9f5a39e4da25913d8.png" alt="V=\QQ^3"/> следующим
образом:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: V = VectorSpace(QQ,3)</span>
<span class="go">sage: V</span>
<span class="go">Vector space of dimension 3 over Rational Field</span>
</pre></div>
</div>
<p>Можно использовать сокращенное обозначение:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: V = QQ^3</span>
</pre></div>
</div>
<p>Введите начало команды, потом нажмите <tt class="docutils literal"><span class="pre">Ctrl-p</span></tt> (или просто нажмите
стрелку вверх на клавиатуре) чтобы вернуться к любой из строк, которые
вы вводили, начинающейся с таких же символов. Это работает даже если вы
полность вышли из Sage и перезапустили его позже. Можно использовать и
обратный поиск по истории команд с помощью <tt class="docutils literal"><span class="pre">Ctrl-r</span></tt>. Все эти возможности
используют пакет <tt class="docutils literal"><span class="pre">readline</span></tt> который доступен почти на всех разновидностях
GNU/Linux.</p>
<p>Можно с легкостью вывести список всех функций для <img class="math" src="_images/math/12d58aa29201da09d8e620f8698e3a37547f6b4a.png" alt="V"/>, используя
автодополнение. Просто введите <tt class="docutils literal"><span class="pre">V.</span></tt>, потом нажмите <tt class="docutils literal"><span class="pre">[TAB]</span></tt> на своей
клавиатуре:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: V.[tab key]</span>
<span class="go">V._VectorSpace_generic__base_field</span>
<span class="gp">...</span>
<span class="go">V.ambient_space</span>
<span class="go">V.base_field</span>
<span class="go">V.base_ring</span>
<span class="go">V.basis</span>
<span class="go">V.coordinates</span>
<span class="gp">...</span>
<span class="go">V.zero_vector</span>
</pre></div>
</div>
<p>Если вы введете первые несколько символов команды, а потом нажмёте <tt class="docutils literal"><span class="pre">[TAB]</span></tt>,
вы получите функции, которые начинаются с этих символов.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: V.i[tab key]</span>
<span class="go">V.is_ambient  V.is_dense    V.is_full     V.is_sparse</span>
</pre></div>
</div>
<p>Если вам интересно, что делает какая-нибудь функция, например coordinates,
введите <tt class="docutils literal"><span class="pre">V.coordinates?</span></tt> для получения справки или <tt class="docutils literal"><span class="pre">V.coordinates??</span></tt> для
получения исходного кода (объясняется в следующем разделе).</p>
</div>
<div class="section" id="id8">
<h2>Встроенная справочная система<a class="headerlink" href="#id8" title="Ссылка на этот заголовок">¶</a></h2>
<p>Sage обладает встроенной справочной системой. Введите название функции со
знаком ? для доступа к документации по этой функции.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: V = QQ^3</span>
<span class="go">sage: V.coordinates?</span>
<span class="go">Type:           instancemethod</span>
<span class="go">Base Class:     &lt;type &#39;instancemethod&#39;&gt;</span>
<span class="go">String Form:    &lt;bound method FreeModule_ambient_field.coordinates of Vector</span>
<span class="go">space of dimension 3 over Rational Field&gt;</span>
<span class="go">Namespace:      Interactive</span>
<span class="go">File:           /home/was/s/local/lib/python2.4/site-packages/sage/modules/f</span>
<span class="go">ree_module.py</span>
<span class="go">Definition:     V.coordinates(self, v)</span>
<span class="go">Docstring:</span>
<span class="go">    Write v in terms of the basis for self.</span>

<span class="go">    Returns a list c such that if B is the basis for self, then</span>

<span class="go">            sum c_i B_i = v.</span>

<span class="go">    If v is not in self, raises an ArithmeticError exception.</span>

<span class="go">    EXAMPLES:</span>
<span class="go">        sage: M = FreeModule(IntegerRing(), 2); M0,M1=M.gens()</span>
<span class="go">        sage: W = M.submodule([M0 + M1, M0 - 2*M1])</span>
<span class="go">        sage: W.coordinates(2*M0-M1)</span>
<span class="go">        [2, -1]</span>
</pre></div>
</div>
<p>Как показано выше, вывод показывает тип объекта, файл, в котором он
определен и полезное описание функции с примерами, которые можно вставить
в вашу текущую сессию. Почти все примеры подвергаются регулярной
автоматической проверке на предмет работоспособности и наличия требуемого
поведения.</p>
<p>Другая возможность хорошо отражает дух открытого программного обеспечения:
если <tt class="docutils literal"><span class="pre">f</span></tt> это функция Python&#8217;а, то <tt class="docutils literal"><span class="pre">f??</span></tt> выведет исходный код, который
определяет <tt class="docutils literal"><span class="pre">f</span></tt>. Например,</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: V = QQ^3</span>
<span class="go">sage: V.coordinates??</span>
<span class="go">Type:           instancemethod</span>
<span class="gp">...</span>
<span class="go">Source:</span>
<span class="go">def coordinates(self, v):</span>
<span class="go">        &quot;&quot;&quot;</span>
<span class="go">        Write $v$ in terms of the basis for self.</span>
<span class="go">        ...</span>
<span class="go">        &quot;&quot;&quot;</span>
<span class="go">        return self.coordinate_vector(v).list()</span>
</pre></div>
</div>
<p>Отсюда мы знаем, что все, что делает функция <tt class="docutils literal"><span class="pre">coordinates</span></tt>, это вызов функции
<tt class="docutils literal"><span class="pre">coordinate_vector</span></tt> и превращает результат в список. Что делает функция
<tt class="docutils literal"><span class="pre">coordinate_vector?</span></tt></p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: V = QQ^3</span>
<span class="go">sage: V.coordinate_vector??</span>
<span class="gp">...</span>
<span class="go">def coordinate_vector(self, v):</span>
<span class="go">        ...</span>
<span class="go">        return self.ambient_vector_space()(v)</span>
</pre></div>
</div>
<p>Функция <tt class="docutils literal"><span class="pre">coordinate_vector</span></tt> удерживает введенные значения во внешнем
пространстве, что позволяет добиться такого же эффекта, как при вычислении
вектора коэффициентов переменной <img class="math" src="_images/math/a9f23bf124b6b2b2a993eb313c72e678664ac74a.png" alt="v"/> с точки зрения <img class="math" src="_images/math/12d58aa29201da09d8e620f8698e3a37547f6b4a.png" alt="V"/>.
Пространство <img class="math" src="_images/math/12d58aa29201da09d8e620f8698e3a37547f6b4a.png" alt="V"/> уже внешнее, так как оно является <img class="math" src="_images/math/1219c02f3a57aca09c165eb787dbc502d8479099.png" alt="\QQ^3"/>.
Существует также функция <tt class="docutils literal"><span class="pre">coordinate_vector</span></tt> для подпространств, и она
ведет себя по-иному. Мы создим подпространство и посмотрим:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: V = QQ^3; W = V.span_of_basis([V.0, V.1])</span>
<span class="go">sage: W.coordinate_vector??</span>
<span class="gp">...</span>
<span class="go">def coordinate_vector(self, v):</span>
<span class="go">        &quot;&quot;&quot;</span>
<span class="go">         ...</span>
<span class="go">        &quot;&quot;&quot;</span>
<span class="go">        # First find the coordinates of v wrt echelon basis.</span>
<span class="go">        w = self.echelon_coordinate_vector(v)</span>
<span class="go">        # Next use transformation matrix from echelon basis to</span>
<span class="go">        # user basis.</span>
<span class="go">        T = self.echelon_to_user_matrix()</span>
<span class="go">        return T.linear_combination_of_rows(w)</span>
</pre></div>
</div>
<p>(Если вы считаете, что существующая реализация неэффективна, пожалуйста,
зарегистрируйтесь и помогите оптимизировать линейную алгебру.)</p>
<p>Вы также можете ввести <tt class="docutils literal"><span class="pre">help(имя_команды)</span></tt> или <tt class="docutils literal"><span class="pre">help(класс)</span></tt> для
получения справки о классах или функциях в стиле man-страниц.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: help(VectorSpace)</span>
<span class="go">Help on class VectorSpace ...</span>

<span class="go">class VectorSpace(__builtin__.object)</span>
<span class="go"> |  Create a Vector Space.</span>
<span class="go"> |</span>
<span class="go"> |  To create an ambient space over a field with given dimension</span>
<span class="go"> |  using the calling syntax ...</span>
<span class="go"> :</span>
<span class="go"> :</span>
</pre></div>
</div>
<p>Когда вы вводите <tt class="docutils literal"><span class="pre">q</span></tt> для выхода из справочной системы, ваша сессия
находится в том же состоянии, что и до этого. Справка не захламляет ваш
экран, в отличие от формы <tt class="docutils literal"><span class="pre">function_name?</span></tt>, которая иногда может
оставлять информацию в вашей сессии. Особенно полезно использовать
<tt class="docutils literal"><span class="pre">help(module_name)</span></tt>. Например, векторные пространства описаны в
<tt class="docutils literal"><span class="pre">sage.modules.free_module</span></tt>, поэтому введите <tt class="docutils literal"><span class="pre">help(sage.modules.free_module)</span></tt>
для документации обо всем модуле. Когда вы просматриваете документацию в
справочной системе, вы можете осуществлять поиск с помощью <tt class="docutils literal"><span class="pre">/</span></tt> и в обратном
порядке с помощью <tt class="docutils literal"><span class="pre">?</span></tt>.</p>
</div>
<div class="section" id="id9">
<h2>Сохранение и загрузка отдельных объектов<a class="headerlink" href="#id9" title="Ссылка на этот заголовок">¶</a></h2>
<p>Допустим вы вычислили матрицу или хуже: сложное пространство модулярных
символов, и хотите сохранить его для работы в будущем. Как это сделать? Есть
несколько способов, которыми компьютерные алгебры пользуются для сохранения
объектов.</p>
<ol class="arabic simple">
<li><strong>Сохранить игру:</strong> Поддерживается сохранение и загрузка только полных сессий
(например, GAP, Magma).</li>
<li><strong>Унифицированный ввод/вывод:</strong> Вывод объектов на экран в таком виде, в
котором они могут быть считаны позже. (GP/PARI).</li>
<li><strong>Eval</strong>: Легкий способ запуска любого кода в интерпретаторе (например,
Singular, PARI).</li>
</ol>
<p>Так как Sage построен на Python&#8217;е, он использует иной подход: каждый объект
может быть превращен в строку, из которой в последствии можно восстановить объект.
Способ схож со способом унификации ввода и вывода, как в PARI, но в случае с
Sage нет необходимости выводить объект на экран в самой неудобной форме.
Также, поддержка сохранения и загрузки (в большинстве случаев) полностью
автоматична, не требует дополнительного программирования; это просто возможность
Python&#8217;а, которая была включена в язык с самого начала.</p>
<p>Почти любой объект x может быть сохранен в сжатой форме на диск при помощи
команды &#8216;&#8217;save(x, filename)&#8217;&#8217; (или во многих случаях &#8216;&#8217;x.save(filename)&#8217;&#8216;).
Для загрузки объекта введите &#8216;&#8217;load(filename)&#8217;&#8216;.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: A = MatrixSpace(QQ,3)(range(9))^2</span>
<span class="go">sage: A</span>
<span class="go">[ 15  18  21]</span>
<span class="go">[ 42  54  66]</span>
<span class="go">[ 69  90 111]</span>
<span class="go">sage: save(A, &#39;A&#39;)</span>
</pre></div>
</div>
<p>Теперь выйдите из Sage и перезапустите. Теперь вы можете получить &#8216;&#8217;A&#8217;&#8217; обратно:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: A = load(&#39;A&#39;)</span>
<span class="go">sage: A</span>
<span class="go">[ 15  18  21]</span>
<span class="go">[ 42  54  66]</span>
<span class="go">[ 69  90 111]</span>
</pre></div>
</div>
<p>То же самое можно делать и с более сложными объектами, например эллиптическими
кривыми. Вся информация об объекте (которая находится в кеше) сохраняется вместе
с объектом. Например,</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: E = EllipticCurve(&#39;11a&#39;)</span>
<span class="go">sage: v = E.anlist(100000)              # требует некоторого времени...</span>
<span class="go">sage: save(E, &#39;E&#39;)</span>
<span class="go">sage: quit</span>
</pre></div>
</div>
<p>Сохраненная версия <tt class="docutils literal"><span class="pre">E</span></tt> занимает 153 килобита, так как в нем содержатся первые
100000 <img class="math" src="_images/math/6f1a2b6b7c193f9ba2b2134a59f1da5addcfbc98.png" alt="a_n"/>.</p>
<div class="highlight-python"><pre>~/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)              # моментально!</pre>
</div>
<p>(В Python, сохранение и загрузка осуществляется модулем <tt class="docutils literal"><span class="pre">cPickle</span></tt>. Объект
Sage <tt class="docutils literal"><span class="pre">x</span></tt> может быть сохранен с помощью <tt class="docutils literal"><span class="pre">cPickle.dumps(x,</span> <span class="pre">2)</span></tt>. Обратите
внимание на <tt class="docutils literal"><span class="pre">2</span></tt>!)</p>
<p>Sage не может сохранять и загружать объекты, созданные в других системах
компьютерной алгебры, таких как GAP, Singular, Maxima и пр. Они загружаются
в состоянии, которое помечено как &#8220;invalid&#8221;. Хотя, в GAP многие объекты выводятся
в форме, из которой их потом можно восстановить, но многие не выводятся в
такой форме, поэтому их восстановление из такого вида нарочно запрещено.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: a = gap(2)</span>
<span class="go">sage: a.save(&#39;a&#39;)</span>
<span class="go">sage: load(&#39;a&#39;)</span>
<span class="gt">Traceback (most recent call last):</span>
<span class="c">...</span>
<span class="gr">ValueError</span>: <span class="n">The session in which this object was defined is no longer</span>
<span class="go">running.</span>
</pre></div>
</div>
<p>Объекты GP/PARI могут быть сохранены и загружены, так как их вид при выводе
на экран достаточен для восстановления объекта.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: a = gp(2)</span>
<span class="go">sage: a.save(&#39;a&#39;)</span>
<span class="go">sage: load(&#39;a&#39;)</span>
<span class="go">2</span>
</pre></div>
</div>
<p>Сохраненные объекты могут быть загружены позже на компьютерах с другой
архитектурой или операционной системой, например, вы можете сохранить
огромную матрицу в 32-битной OS X и загрузить ее в 64-битную GNU/Linux,
привести к ступенчатой форме и переместить обратно. Также во многих случаях
вы можете загружать объекты в версии Sage, отличные от версии, на которой
они были сохранены. Все атрибуты объекта сохраняются вместе с классом (но не
включая исходный код), который описывает объект. Если класс более не существует
в новой версии Sage, тогда объект не может быть загружен в эту новую версию.
Но если вы загрузите ее на версию ниже, получите словарь объектов (с помощью
<tt class="docutils literal"><span class="pre">x.__dict__</span></tt>) и сохраните словарь, то сможете загрузить его в новую версию.</p>
<div class="section" id="id10">
<h3>Сохранение в виде текста<a class="headerlink" href="#id10" title="Ссылка на этот заголовок">¶</a></h3>
<p>Вы также можете сохранять объекты в виде набора ASCII символов в простой
текстовый файл простым открытием файла и сохранением строки, которая выражает
(описывает) объект (вы можете записывать несколько объектов). Не забудьте
закрыть файл после добавления данных.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R.&lt;x,y&gt; = PolynomialRing(QQ,2)</span>
<span class="go">sage: f = (x+y)^7</span>
<span class="go">sage: o = open(&#39;file.txt&#39;,&#39;w&#39;)</span>
<span class="go">sage: o.write(str(f))</span>
<span class="go">sage: o.close()</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="section-save">
<span id="id11"></span><h2>Сохранение и загрузка полных сессий<a class="headerlink" href="#section-save" title="Ссылка на этот заголовок">¶</a></h2>
<p>Sage обладает очень гибкими возможностями сохранения и загрузки полных сессий.</p>
<p>Команда <tt class="docutils literal"><span class="pre">save_session(sessionname)</span></tt> сохраняет все переменные, которые
вы задали в текущей сессии в виде словаря в заданном <tt class="docutils literal"><span class="pre">sessionname</span></tt>. (В редком
случае, когда объект не поддерживает сохранения, он просто не будет включен
в словарь.) В результате будет создан файл с расширением <tt class="docutils literal"><span class="pre">.sobj</span></tt> и может быть
загружен как любой другой объект. Когда вы загружаете сохраненные объекты в
сессию, вы получаете словарь, ключами которого являются имена переменных, а
значениями — объекты.</p>
<p>Вы можете использовать команду <tt class="docutils literal"><span class="pre">load_session(sessionname)</span></tt>, чтобы загрузить
переменные, описанные в <tt class="docutils literal"><span class="pre">sessionname</span></tt>, в текущую сессию. Заметьте, что это
не удаляет переменные, заданные в этой сессии. Вместо этого, две сессии
объединяются.</p>
<p>Для начала запустим Sage и зададим несколько переменных.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: E = EllipticCurve(&#39;11a&#39;)</span>
<span class="go">sage: M = ModularSymbols(37)</span>
<span class="go">sage: a = 389</span>
<span class="go">sage: t = M.T(2003).matrix(); t.charpoly().factor()</span>
<span class="go"> _4 = (x - 2004) * (x - 12)^2 * (x + 54)^2</span>
</pre></div>
</div>
<p>Далее, сохраним нашу сессию, что включит в себя сохранение всех заданных
выше переменных в файл. Потом мы проверим информацию о файле. Его размер —
3 килобайта.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: save_session(&#39;misc&#39;)</span>
<span class="go">Saving a</span>
<span class="go">Saving M</span>
<span class="go">Saving t</span>
<span class="go">Saving E</span>
<span class="go">sage: quit</span>
<span class="go">was@form:~/tmp$ ls -l misc.sobj</span>
<span class="go">-rw-r--r--  1 was was 2979 2006-01-28 19:47 misc.sobj</span>
</pre></div>
</div>
<p>Наконец, мы перезапустим Sage, зададим дополнительную переменную и загрузим
сохраненную сессию.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: b = 19</span>
<span class="go">sage: load_session(&#39;misc&#39;)</span>
<span class="go">Loading a</span>
<span class="go">Loading M</span>
<span class="go">Loading E</span>
<span class="go">Loading t</span>
</pre></div>
</div>
<p>Каждая сохраненная переменная снова является переменной. Кроме того, переменная
<tt class="docutils literal"><span class="pre">b</span></tt> не была перезаписана.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: M</span>
<span class="go">Full Modular Symbols space for Gamma_0(37) of weight 2 with sign 0</span>
<span class="go">and dimension 5 over Rational Field</span>
<span class="go">sage: E</span>
<span class="go">Elliptic Curve defined by y^2 + y = x^3 - x^2 - 10*x - 20 over Rational</span>
<span class="go">Field</span>
<span class="go">sage: b</span>
<span class="go">19</span>
<span class="go">sage: a</span>
<span class="go">389</span>
</pre></div>
</div>
</div>
<div class="section" id="notebook">
<span id="section-notebook"></span><h2>Интерфейс Notebook<a class="headerlink" href="#notebook" title="Ссылка на этот заголовок">¶</a></h2>
<p>Sage notebook запускается с помощью следующей команды</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: notebook()</span>
</pre></div>
</div>
<p>введенной в командной строке. Она запустит Sage notebook и откроет его в
браузере по умолчанию. Файлы состояния сервера хранятся в
<tt class="docutils literal"><span class="pre">$HOME/.sage/sage\_notebook</span></tt>.</p>
<p>Другие параметры включают в себя:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: notebook(&quot;directory&quot;)</span>
</pre></div>
</div>
<p>Этот параметр позволяет запустить сервер Notebook, используя файлы в заданной
директории, вместо использования директории по умолчанию
<tt class="docutils literal"><span class="pre">$HOME/.sage/sage_notebook</span></tt>. Это может оказаться полезным, если вы хотите
иметь коллекцию рабочих листов, связанных с конкретным проектом, или если вы
хотите запускать несколько отдельных серверов Notebook в одно время.</p>
<p>Когда вы запускаете Notebook, вначале он создает следующие файлы в директории
<tt class="docutils literal"><span class="pre">$HOME/.sage/sage_notebook</span></tt>:</p>
<div class="highlight-python"><pre>nb.sobj       (the notebook SAGE object file)
objects/      (a directory containing SAGE objects)
worksheets/   (a directory containing SAGE worksheets).</pre>
</div>
<p>После создания этих файлов, Notebook запускает веб-сервер.</p>
<p>Notebook — это коллекция учетных записей пользователей (аккаунтов), каждый
из которых может иметь любое количество рабочих листов. Когда вы создаете
новый рабочий лист, информация, которая описывает его, сохраняется в директории
<tt class="docutils literal"><span class="pre">worksheets/username/number</span></tt>. В каждой такой директории находится простой
текстовый файл <tt class="docutils literal"><span class="pre">worksheet.txt</span></tt>; если что-то случится с вашими рабочими листами,
или с Sage, или что-нибудь еще пойдет не так, то текcтовый файл, который легко
читается, поможет восстановить ваш лист полностью.</p>
<p>В Sage введите <tt class="docutils literal"><span class="pre">notebook?</span></tt> для получения подробной информации о том, как
запустить сервер Notebook.</p>
<p>Следующая диаграмма иллюстрирует архитектуру Sage Notebook:</p>
<div class="highlight-python"><pre>----------------------
|                    |
|                    |
|   firefox/safari   |
|                    |
|     javascript     |
|      program       |
|                    |
|                    |
----------------------
      |      ^
      | AJAX |
      V      |
----------------------
|                    |
|       sage         |                SAGE process 1
|       web          | ------------&gt;  SAGE process 2    (Python processes)
|      server        |   pexpect      SAGE process 3
|                    |                    .
|                    |                    .
----------------------                    .</pre>
</div>
<p>Для получения справки о команде Sage, <tt class="docutils literal"><span class="pre">cmd</span></tt>, в notebook введите, <tt class="docutils literal"><span class="pre">cmd?</span></tt> и
нажмите <tt class="docutils literal"><span class="pre">&lt;esc&gt;</span></tt> (не <tt class="docutils literal"><span class="pre">&lt;shift-enter&gt;</span></tt>).</p>
<p>Для получения справки о горячих клавишах интерфейса notebook нажмите ссылку
<tt class="docutils literal"><span class="pre">Help</span></tt>.</p>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
            <h3><a href="index.html">Содержание</a></h3>
            <ul>
<li><a class="reference internal" href="#">Интерактивная оболочка</a><ul>
<li><a class="reference internal" href="#sage">Ваша сессия Sage</a></li>
<li><a class="reference internal" href="#id2">Журналирование ввода и вывода</a></li>
<li><a class="reference internal" href="#id3">Вставка игнорирует приглашение</a></li>
<li><a class="reference internal" href="#id4">Команды измерения времени</a></li>
<li><a class="reference internal" href="#id5">Ошибки и исключения</a></li>
<li><a class="reference internal" href="#section-tabcompletion">Обратный поиск и автодополнение</a></li>
<li><a class="reference internal" href="#id8">Встроенная справочная система</a></li>
<li><a class="reference internal" href="#id9">Сохранение и загрузка отдельных объектов</a><ul>
<li><a class="reference internal" href="#id10">Сохранение в виде текста</a></li>
</ul>
</li>
<li><a class="reference internal" href="#section-save">Сохранение и загрузка полных сессий</a></li>
<li><a class="reference internal" href="#notebook">Интерфейс Notebook</a></li>
</ul>
</li>
</ul>

            <h4>Предыдущий раздел</h4>
            <p class="topless"><a href="tour_advanced.html"
                                  title="предыдущая глава">Немного высшей математики</a></p>
            <h4>Следующий раздел</h4>
            <p class="topless"><a href="interfaces.html"
                                  title="следующая глава">Интерфейсы</a></p>
            <h3>На этой странице</h3>
            <ul class="this-page-menu">
              <li><a href="_sources/interactive_shell.txt"
                     rel="nofollow">Показать исходный текст</a></li>
            </ul>
          <div id="searchbox" style="display: none">
            <h3>Быстрый поиск</h3>
              <form class="search" action="search.html" method="get">
                <input type="text" name="q" size="18" />
                <!-- The shading of the "Go" button should be consistent -->
                <!-- with the colour of the header and footer. See the file -->
                <!-- doc/common/themes/sage/theme.conf for colours used by -->
                <!-- the Sage theme. -->
                <input type="submit" style="background-color: #B8B9F6" value="Искать" />
                <input type="hidden" name="check_keywords" value="yes" />
                <input type="hidden" name="area" value="default" />
              </form>
              <p class="searchtip" style="font-size: 90%">
              Введите слова для поиска или имя модуля, класса или функции.
              </p>
          </div>
          <script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Просмотр</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="Словарь-указатель"
             >словарь</a></li>
        <li class="right" >
          <a href="py-modindex.html" title="Python Module Index"
             >модули</a> |</li>
        <li class="right" >
          <a href="interfaces.html" title="Интерфейсы"
             >следующий</a> |</li>
        <li class="right" >
          <a href="tour_advanced.html" title="Немного высшей математики"
             >предыдущий</a> |</li>
  
    
      <a href="../index.html"><img src="_static/sagelogo.png" style="vertical-align: middle" title="Sage Logo"></a>
    
  
  
        <li><a href="index.html">Sage Tutorial in Russian v5.9</a> &raquo;</li>
 
      </ul>
    </div>
    
    <div class="footer">
        &copy; Copyright 2005--2011, The Sage Development Team.
      При создании использован <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.1.3.
    </div>
    <script type="text/javascript">
/*global jQuery, window */
/* Sphinx sidebar toggle.  Putting this code at the end of the body
 * enables the toggle for the live, static, and offline docs.  Note:
 * sage.misc.html.math_parse() eats jQuery's dollar-sign shortcut. */
var jq = jQuery;  
jq(document).ready(function () {
    var bar, bod, bg, fg, key, tog, wid_old, wid_new, resize, get_state, set_state;
    bod = jq('div.bodywrapper');
    bar = jq('div.sphinxsidebar');
    tog = jq('<div class="sphinxsidebartoggle"></div>');
    
    /* Delayed resize helper.  Not perfect but good enough. */
    resize = function () {
        setTimeout(function () {
            tog.height(bod.height());
        }, 100);
    };
    jq(window).resize(function () {
        resize();
    });
    
    /* Setup and add the toggle. See Sphinx v0.5.1 default.css. */
    fg = jq('div.sphinxsidebar p a').css('color') || 'rgb(152, 219, 204)';
    bg = jq('div.document').css('background-color') || 'rgb(28, 78, 99)';
    wid_old = '230px';
    wid_new = '5px';
    tog.css('background-color', bg)
        .css('border-width', '0px')
        .css('border-right', wid_new + ' ridge ' + bg)
        .css('cursor', 'pointer')
        .css('position', 'absolute')
        .css('left', '-' + wid_new)
        .css('top', '0px')
        .css('width', wid_new);
    bod.css('position', 'relative');
    bod.prepend(tog);
    resize();
    
    /* Cookie helpers. */
    key = 'sphinxsidebar=';
    set_state = function (s) {
        var date = new Date();
        /* Expiry in 7 days. */
        date.setTime(date.getTime() + (7 * 24 * 3600 * 1000));
        document.cookie = key + encodeURIComponent(s) + '; expires=' +
            date.toUTCString() + '; path=/';
    };
    get_state = function () {
        var i, c, crumbs = document.cookie.split(';');
        for (i = 0; i < crumbs.length; i += 1) {
            c = crumbs[i].replace(/^\s+/, '');
            if (c.indexOf(key) === 0) {
                return decodeURIComponent(c.substring(key.length, c.length));
            }
        }
        return null;
    };
    
    /* Event handlers. */
    tog.mouseover(function (ev) {
        tog.css('border-right-color', fg);
    }).mouseout(function (ev) {
        tog.css('border-right-color', bg);
    }).click(function (ev) {
        if (bod.hasClass('wide')) {
            bod.removeClass('wide');
            bod.css('margin-left', wid_old);
            bar.css('width', wid_old);
            bar.show();
            set_state('visible');
        } else {
            set_state('hidden');
            bar.hide();
            bar.css('width', '0px');
            bod.css('margin-left', wid_new);
            bod.addClass('wide');
        }
        resize();
    });
    
    /* Hide the normally visible sidebar? */
    if (get_state() === 'hidden') {
        tog.trigger('click');
    } else {
        set_state('visible');
    }
});
    </script>
  </body>
</html>