Sophie

Sophie

distrib > Fedora > 18 > x86_64 > by-pkgid > 36bf0f125b95a3a5b64c19d86cab692b > files > 271

sagemath-doc-pt-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>Polinômios &mdash; Tutorial Sage 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="Tutorial Sage v5.9" href="index.html" />
    <link rel="up" title="Um passeio guiado" href="tour.html" />
    <link rel="next" title="Famílias, Conversão e Coação" href="tour_coercion.html" />
    <link rel="prev" title="Álgebra Linear" href="tour_linalg.html" />
    <link rel="icon" href="_static/sageicon.png" type="image/x-icon" />

  </head>
  <body>
    <div class="related">
      <h3>Navegação</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="Índice Geral"
             accesskey="I">índice</a></li>
        <li class="right" >
          <a href="py-modindex.html" title="Índice de Módulos do Python"
             >módulos</a> |</li>
        <li class="right" >
          <a href="tour_coercion.html" title="Famílias, Conversão e Coação"
             accesskey="N">próximo</a> |</li>
        <li class="right" >
          <a href="tour_linalg.html" title="Álgebra Linear"
             accesskey="P">anterior</a> |</li>
  
    
      <a href="../index.html"><img src="_static/sagelogo.png" style="vertical-align: middle" title="Sage Logo"></a>
    
  
  
        <li><a href="index.html">Tutorial Sage v5.9</a> &raquo;</li>

          <li><a href="tour.html" accesskey="U">Um passeio guiado</a> &raquo;</li> 
      </ul>
    </div>  

    <div class="document">
      <div class="documentwrapper">
        <div class="bodywrapper">
          <div class="body">
            
  <div class="section" id="polinomios">
<span id="section-poly"></span><h1>Polinômios<a class="headerlink" href="#polinomios" title="Link permanente para este título">¶</a></h1>
<p>Nesta seção vamos ilustrar como criar e usar polinômios no Sage.</p>
<div class="section" id="polinomios-em-uma-variavel">
<span id="section-univariate"></span><h2>Polinômios em Uma Variável<a class="headerlink" href="#polinomios-em-uma-variavel" title="Link permanente para este título">¶</a></h2>
<p>Existem três formas de criar anéis de polinômios.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R = PolynomialRing(QQ, &#39;t&#39;)</span>
<span class="go">sage: R</span>
<span class="go">Univariate Polynomial Ring in t over Rational Field</span>
</pre></div>
</div>
<p>Esse comando cria um anel de polinômios e diz para o Sage usar a letra
&#8216;t&#8217; para representar a variável indeterminada quando imprimir na tela.
Todavia, isso não define o símbolo <tt class="docutils literal"><span class="pre">t</span></tt> para uso no Sage, logo você
não pode usá-lo para definir um polinômio (como <img class="math" src="_images/math/8a00b57e20a3a538f38897e96329a9e4674c797c.png" alt="t^2+1"/>)
pertencente a <tt class="docutils literal"><span class="pre">R</span></tt>.</p>
<p>Uma forma alternativa é</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: S = QQ[&#39;t&#39;]</span>
<span class="go">sage: S == R</span>
<span class="go">True</span>
</pre></div>
</div>
<p>As mesmas observações com respeito a <tt class="docutils literal"><span class="pre">t</span></tt> valem também nesse caso.</p>
<p>Uma terceira e conveniente forma de definir polinômios é</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R.&lt;t&gt; = PolynomialRing(QQ)</span>
</pre></div>
</div>
<p>ou</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R.&lt;t&gt; = QQ[&#39;t&#39;]</span>
</pre></div>
</div>
<p>ou ainda</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R.&lt;t&gt; = QQ[]</span>
</pre></div>
</div>
<p>Isso tem o efeito colateral de definir a variável <tt class="docutils literal"><span class="pre">t</span></tt> como a
variável indeterminada do anel de polinômios, logo você pode
facilmente construir elementos de <tt class="docutils literal"><span class="pre">R</span></tt> da seguinte forma. (Note que
essa terceira alternativa é muito semelhante à notação usada em Magma,
e da mesma forma que no Magma ela pode ser usada para diversos tipos
de objetos.)</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: poly = (t+1) * (t+2); poly</span>
<span class="go">t^2 + 3*t + 2</span>
<span class="go">sage: poly in R</span>
<span class="go">True</span>
</pre></div>
</div>
<p>Qualquer que seja o método usado para definir um anel de polinômios,
você pode recuperar a variável indeterminada como o <img class="math" src="_images/math/bc1f9d9bf8a1b606a4188b5ce9a2af1809e27a89.png" alt="0"/>-ésimo
gerador:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R = PolynomialRing(QQ, &#39;t&#39;)</span>
<span class="go">sage: t = R.0</span>
<span class="go">sage: t in R</span>
<span class="go">True</span>
</pre></div>
</div>
<p>Note que uma construção similar funciona com os números complexos: os
números complexos podem ser vistos como sendo gerados pelo símbolo
<tt class="docutils literal"><span class="pre">i</span></tt> sobre os números reais; logo temos o seguinte:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: CC</span>
<span class="go">Complex Field with 53 bits of precision</span>
<span class="go">sage: CC.0  # 0th generator of CC</span>
<span class="go">1.00000000000000*I</span>
</pre></div>
</div>
<p>Para anel de polinômios, você pode obter tanto o anel como o seu
gerador, ou somente o gerador, no momento em que o anel for criado, da
seguinte forma:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R, t = QQ[&#39;t&#39;].objgen()</span>
<span class="go">sage: t    = QQ[&#39;t&#39;].gen()</span>
<span class="go">sage: R, t = objgen(QQ[&#39;t&#39;])</span>
<span class="go">sage: t    = gen(QQ[&#39;t&#39;])</span>
</pre></div>
</div>
<p>Finalmente apresentamos um pouco de aritmética em <img class="math" src="_images/math/b98c8bc06f91190aef10380e94d98b85005c29d9.png" alt="\QQ[t]"/>.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R, t = QQ[&#39;t&#39;].objgen()</span>
<span class="go">sage: f = 2*t^7 + 3*t^2 - 15/19</span>
<span class="go">sage: f^2</span>
<span class="go">4*t^14 + 12*t^9 - 60/19*t^7 + 9*t^4 - 90/19*t^2 + 225/361</span>
<span class="go">sage: cyclo = R.cyclotomic_polynomial(7); cyclo</span>
<span class="go">t^6 + t^5 + t^4 + t^3 + t^2 + t + 1</span>
<span class="go">sage: g = 7 * cyclo * t^5 * (t^5 + 10*t + 2)</span>
<span class="go">sage: g</span>
<span class="go">7*t^16 + 7*t^15 + 7*t^14 + 7*t^13 + 77*t^12 + 91*t^11 + 91*t^10 + 84*t^9</span>
<span class="go">       + 84*t^8 + 84*t^7 + 84*t^6 + 14*t^5</span>
<span class="go">sage: F = factor(g); F</span>
<span class="go">(7) * t^5 * (t^5 + 10*t + 2) * (t^6 + t^5 + t^4 + t^3 + t^2 + t + 1)</span>
<span class="go">sage: F.unit()</span>
<span class="go">7</span>
<span class="go">sage: list(F)</span>
<span class="go">[(t, 5), (t^5 + 10*t + 2, 1), (t^6 + t^5 + t^4 + t^3 + t^2 + t + 1, 1)]</span>
</pre></div>
</div>
<p>Note que a fatorização corretamente leva em conta e armazena a parte
unitária.</p>
<p>Se você fosse usar, por exemplo, a função <tt class="docutils literal"><span class="pre">R.cyclotomic_polynomial</span></tt>
intensamente para algum projeto de pesquisa, além de citar o Sage,
você deveria tentar descobrir qual componente do Sage é de fato usado
para calcular esses polinômios, e citá-lo também. Nesse caso, se você
digitar <tt class="docutils literal"><span class="pre">R.cyclotomic_polynomial??</span></tt> para ver o código fonte, você
irá facilmente ver uma linha <tt class="docutils literal"><span class="pre">f</span> <span class="pre">=</span> <span class="pre">pari.polcyclo(n)</span></tt> o que significa
que o PARI é usado para o cálculo dos polinômios ciclotrômicos. Cite o
PARI também no seu trabalho.</p>
<p>Dividindo dois polinômios cria-se um elemento do corpo de frações (o
qual o Sage cria automaticamente).</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: x = QQ[&#39;x&#39;].0</span>
<span class="go">sage: f = x^3 + 1; g = x^2 - 17</span>
<span class="go">sage: h = f/g;  h</span>
<span class="go">(x^3 + 1)/(x^2 - 17)</span>
<span class="go">sage: h.parent()</span>
<span class="go">Fraction Field of Univariate Polynomial Ring in x over Rational Field</span>
</pre></div>
</div>
<p>Usando-se a série de Laurent, pode-se calcular a expansão em série no
corpo de frações de <tt class="docutils literal"><span class="pre">QQ[x]</span></tt>:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R.&lt;x&gt; = LaurentSeriesRing(QQ); R</span>
<span class="go">Laurent Series Ring in x over Rational Field</span>
<span class="go">sage: 1/(1-x) + O(x^10)</span>
<span class="go">1 + x + x^2 + x^3 + x^4 + x^5 + x^6 + x^7 + x^8 + x^9 + O(x^10)</span>
</pre></div>
</div>
<p>Se nomearmos a variável de outra forma, obtemos um anel de polinômios
em uma variável diferente.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R.&lt;x&gt; = PolynomialRing(QQ)</span>
<span class="go">sage: S.&lt;y&gt; = PolynomialRing(QQ)</span>
<span class="go">sage: x == y</span>
<span class="go">False</span>
<span class="go">sage: R == S</span>
<span class="go">False</span>
<span class="go">sage: R(y)</span>
<span class="go">x</span>
<span class="go">sage: R(y^2 - 17)</span>
<span class="go">x^2 - 17</span>
</pre></div>
</div>
<p>O anel é determinado pela variável. Note que criar um outro anel com
variável indeterminada <tt class="docutils literal"><span class="pre">x</span></tt> não retorna um anel diferente.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R = PolynomialRing(QQ, &quot;x&quot;)</span>
<span class="go">sage: T = PolynomialRing(QQ, &quot;x&quot;)</span>
<span class="go">sage: R == T</span>
<span class="go">True</span>
<span class="go">sage: R is T</span>
<span class="go">True</span>
<span class="go">sage: R.0 == T.0</span>
<span class="go">True</span>
</pre></div>
</div>
<p>O Sage também possui suporte para séries de potências e séries de
Laurent sobre um anel arbitrário. No seguinte exemplo, nós criamos um
elemento de <img class="math" src="_images/math/0d054bcbcbf87b8d03b8105520077d81ab9d442c.png" alt="\GF{7}[[T]]"/> e dividimos para criar um elemento de
<img class="math" src="_images/math/494316fc12a628e1a24484454c504b0b0a59845e.png" alt="\GF{7}((T))"/>.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R.&lt;T&gt; = PowerSeriesRing(GF(7)); R</span>
<span class="go">Power Series Ring in T over Finite Field of size 7</span>
<span class="go">sage: f = T  + 3*T^2 + T^3 + O(T^4)</span>
<span class="go">sage: f^3</span>
<span class="go">T^3 + 2*T^4 + 2*T^5 + O(T^6)</span>
<span class="go">sage: 1/f</span>
<span class="go">T^-1 + 4 + T + O(T^2)</span>
<span class="go">sage: parent(1/f)</span>
<span class="go">Laurent Series Ring in T over Finite Field of size 7</span>
</pre></div>
</div>
<p>Você também pode criar anéis de polinômios usando a notação de
colchetes duplos:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: GF(7)[[&#39;T&#39;]]</span>
<span class="go">Power Series Ring in T over Finite Field of size 7</span>
</pre></div>
</div>
</div>
<div class="section" id="polinomios-em-mais-de-uma-variavel">
<h2>Polinômios em Mais De Uma Variável<a class="headerlink" href="#polinomios-em-mais-de-uma-variavel" title="Link permanente para este título">¶</a></h2>
<p>Para trabalhar com polinômios em várias variáveis, nós primeiro
declaramos o anel de polinômios e as variáveis.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R = PolynomialRing(GF(5),3,&quot;z&quot;) # here, 3 = number of variables</span>
<span class="go">sage: R</span>
<span class="go">Multivariate Polynomial Ring in z0, z1, z2 over Finite Field of size 5</span>
</pre></div>
</div>
<p>Da mesma forma como ocorre com polinômios em uma variável, existem
três maneiras de fazer isso:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: GF(5)[&#39;z0, z1, z2&#39;]</span>
<span class="go">Multivariate Polynomial Ring in z0, z1, z2 over Finite Field of size 5</span>
<span class="go">sage: R.&lt;z0,z1,z2&gt; = GF(5)[]; R</span>
<span class="go">Multivariate Polynomial Ring in z0, z1, z2 over Finite Field of size 5</span>
</pre></div>
</div>
<p>Se você quiser usar os nomes das variáveis com apenas uma letra, então
você pode usar os seguinte comando:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: PolynomialRing(GF(5), 3, &#39;xyz&#39;)</span>
<span class="go">Multivariate Polynomial Ring in x, y, z over Finite Field of size 5</span>
</pre></div>
</div>
<p>A seguir fazemos um pouco de aritmética.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: z = GF(5)[&#39;z0, z1, z2&#39;].gens()</span>
<span class="go">sage: z</span>
<span class="go">(z0, z1, z2)</span>
<span class="go">sage: (z[0]+z[1]+z[2])^2</span>
<span class="go">z0^2 + 2*z0*z1 + z1^2 + 2*z0*z2 + 2*z1*z2 + z2^2</span>
</pre></div>
</div>
<p>Você também pode usar uma notação mais matemática para criar um anel
de polinômios.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R = GF(5)[&#39;x,y,z&#39;]</span>
<span class="go">sage: x,y,z = R.gens()</span>
<span class="go">sage: QQ[&#39;x&#39;]</span>
<span class="go">Univariate Polynomial Ring in x over Rational Field</span>
<span class="go">sage: QQ[&#39;x,y&#39;].gens()</span>
<span class="go">(x, y)</span>
<span class="go">sage: QQ[&#39;x&#39;].objgens()</span>
<span class="go">(Univariate Polynomial Ring in x over Rational Field, (x,))</span>
</pre></div>
</div>
<p>Polinômios em mais de uma variável são implementados no Sage usando
dicionários em Python e a &#8220;representação distribuída&#8221; de um polinômio.
O Sage usa o Singular <a class="reference internal" href="bibliography.html#si">[Si]</a>, por exemplo, para o cálculo do maior
divisor comum e bases de Gröbner para ideais algébricos.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: R, (x, y) = PolynomialRing(RationalField(), 2, &#39;xy&#39;).objgens()</span>
<span class="go">sage: f = (x^3 + 2*y^2*x)^2</span>
<span class="go">sage: g = x^2*y^2</span>
<span class="go">sage: f.gcd(g)</span>
<span class="go">x^2</span>
</pre></div>
</div>
<p>A seguir criamos o ideal <img class="math" src="_images/math/db7b42a61095556ced1af91db9457c2a5c442b96.png" alt="(f,g)"/> gerado por <img class="math" src="_images/math/bb2c93730dbb48558bb3c4738c956c4e8f816437.png" alt="f"/> e
<img class="math" src="_images/math/311cabda3a9b09f0dde217303ca9d1cd9201dcf6.png" alt="g"/>, simplesmente multiplicando <tt class="docutils literal"><span class="pre">(f,g)</span></tt> por <tt class="docutils literal"><span class="pre">R</span></tt> (nós
poderíamos também escrever <tt class="docutils literal"><span class="pre">ideal([f,g])</span></tt> ou <tt class="docutils literal"><span class="pre">ideal(f,g)</span></tt>).</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: I = (f, g)*R; I</span>
<span class="go">Ideal (x^6 + 4*x^4*y^2 + 4*x^2*y^4, x^2*y^2) of Multivariate Polynomial</span>
<span class="go">Ring in x, y over Rational Field</span>
<span class="go">sage: B = I.groebner_basis(); B</span>
<span class="go">[x^6, x^2*y^2]</span>
<span class="go">sage: x^2 in I</span>
<span class="go">False</span>
</pre></div>
</div>
<p>A base de Gröbner acima não é uma lista mas sim uma sequência
imutável. Isso implica que ela possui universo (universe) e parente
(parent), e não pode ser modificada (o que é bom pois ocasionaria
erros em outras rotinas que usam bases de Gröbner).</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: B.parent()</span>
<span class="go">Category of sequences in Multivariate Polynomial Ring in x, y over Rational</span>
<span class="go">Field</span>
<span class="go">sage: B.universe()</span>
<span class="go">Multivariate Polynomial Ring in x, y over Rational Field</span>
<span class="go">sage: B[1] = x</span>
<span class="gt">Traceback (most recent call last):</span>
<span class="c">...</span>
<span class="gr">ValueError</span>: <span class="n">object is immutable; please change a copy instead.</span>
</pre></div>
</div>
<p>Um pouco (não tanto quanto gostaríamos) de álgebra comutativa está
disponível no Sage, implementado via Singular. Por exemplo, podemos
calcular a decomposição primaria e primos associados de <img class="math" src="_images/math/027f4a11d6090f9eac0ce2488df6384dad1263ea.png" alt="I"/>:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="go">sage: I.primary_decomposition()</span>
<span class="go">[Ideal (x^2) of Multivariate Polynomial Ring in x, y over Rational Field,</span>
<span class="go"> Ideal (y^2, x^6) of Multivariate Polynomial Ring in x, y over Rational Field]</span>
<span class="go">sage: I.associated_primes()</span>
<span class="go">[Ideal (x) of Multivariate Polynomial Ring in x, y over Rational Field,</span>
<span class="go"> Ideal (y, x) of Multivariate Polynomial Ring in x, y over Rational Field]</span>
</pre></div>
</div>
</div>
</div>


          </div>
        </div>
      </div>
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
            <h3><a href="index.html">Tabela de Conteúdo</a></h3>
            <ul>
<li><a class="reference internal" href="#">Polinômios</a><ul>
<li><a class="reference internal" href="#polinomios-em-uma-variavel">Polinômios em Uma Variável</a></li>
<li><a class="reference internal" href="#polinomios-em-mais-de-uma-variavel">Polinômios em Mais De Uma Variável</a></li>
</ul>
</li>
</ul>

            <h4>Tópico anterior</h4>
            <p class="topless"><a href="tour_linalg.html"
                                  title="capítulo anterior">Álgebra Linear</a></p>
            <h4>Próximo tópico</h4>
            <p class="topless"><a href="tour_coercion.html"
                                  title="próximo capítulo">Famílias, Conversão e Coação</a></p>
            <h3>Esta Página</h3>
            <ul class="this-page-menu">
              <li><a href="_sources/tour_polynomial.txt"
                     rel="nofollow">Exibir Fonte</a></li>
            </ul>
          <div id="searchbox" style="display: none">
            <h3>Pesquisa rápida</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="Ir" />
                <input type="hidden" name="check_keywords" value="yes" />
                <input type="hidden" name="area" value="default" />
              </form>
              <p class="searchtip" style="font-size: 90%">
              Digite os termos da busca ou o nome de um módulo, classe ou função.
              </p>
          </div>
          <script type="text/javascript">$('#searchbox').show(0);</script>
        </div>
      </div>
      <div class="clearer"></div>
    </div>
    <div class="related">
      <h3>Navegação</h3>
      <ul>
        <li class="right" style="margin-right: 10px">
          <a href="genindex.html" title="Índice Geral"
             >índice</a></li>
        <li class="right" >
          <a href="py-modindex.html" title="Índice de Módulos do Python"
             >módulos</a> |</li>
        <li class="right" >
          <a href="tour_coercion.html" title="Famílias, Conversão e Coação"
             >próximo</a> |</li>
        <li class="right" >
          <a href="tour_linalg.html" title="Álgebra Linear"
             >anterior</a> |</li>
  
    
      <a href="../index.html"><img src="_static/sagelogo.png" style="vertical-align: middle" title="Sage Logo"></a>
    
  
  
        <li><a href="index.html">Tutorial Sage v5.9</a> &raquo;</li>

          <li><a href="tour.html" >Um passeio guiado</a> &raquo;</li> 
      </ul>
    </div>
    
    <div class="footer">
        &copy; Copyright 2005--2011, The Sage Development Team.
      Criado com <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>