mirror of
https://src.fedoraproject.org/rpms/sagemath.git
synced 2025-04-19 02:29:02 -04:00
6801 lines
219 KiB
Diff
6801 lines
219 KiB
Diff
# HG changeset patch
|
||
# User Gustavo de Oliveira <goliveira5d@gmail.com>
|
||
# Date 1334006083 -7200
|
||
# Node ID ad8e41651a3187a45f087335cb048418bf545506
|
||
# Parent bbd101e6eaa8de241270aa8063dc8380a6d983e3
|
||
Trac 12822: Portuguese translation of "Tutorial".
|
||
|
||
diff --git a/doc/pt/tutorial/afterword.rst b/doc/pt/tutorial/afterword.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/afterword.rst
|
||
@@ -0,0 +1,181 @@
|
||
+********
|
||
+Posfacio
|
||
+********
|
||
+
|
||
+Por quê o Python?
|
||
+=================
|
||
+
|
||
+Vantagens do Python
|
||
+-------------------
|
||
+
|
||
+A primeira linguagem de implementação do Sage é o Python (veja [Py]_),
|
||
+embora rotinas que precisam ser muito rápidas são implementadas em uma
|
||
+linguagem compilada. O Python possui várias vantagens:
|
||
+
|
||
+- **Salvar objetos** é bem suportado em Python. Existe suporte
|
||
+ extenso em Python para salvar (na grande maioria dos casos) objetos
|
||
+ arbitrários em arquivos em disco ou em uma base de dados.
|
||
+
|
||
+- Suporte excelente para **documentação** de funções e pacotes no
|
||
+ código fonte, incluindo extração automática de documentação e teste
|
||
+ automático de todos os exemplos. Os exemplos são automaticamente
|
||
+ testados regularmente para garantir que funcionam como indicado.
|
||
+
|
||
+- **Gerenciamento de memória:** O Python agora possui um sistema de
|
||
+ gerenciamento de memória e "garbage collector" muito bem pensados e
|
||
+ robustos que lidam corretamente com referências circulares, e
|
||
+ permitem variáveis locais em arquivos.
|
||
+
|
||
+- O Python possui **diversos pacotes** disponíveis que podem ser de
|
||
+ grande interesse para os usuários do Sage: análise numérica e
|
||
+ álgebra linear, visualização 2D e 3D, comunicação via rede (para
|
||
+ computação distribuída e servidores, por exemplo, via twisted),
|
||
+ suporte a base de dados, etc.
|
||
+
|
||
+- **Portabilidade:** O Python é fácil de compilar a partir do código
|
||
+ fonte em poucos minutos na maioria das arquiteturas.
|
||
+
|
||
+- **Manuseamento de exceções:** O Python possui um sofisticado e bem
|
||
+ pensado sistema de manuseamento de exceções, através do qual
|
||
+ programas podem facilmente se recuperar mesmo se ocorrerem erros no
|
||
+ código que está sendo executado.
|
||
+
|
||
+- **Debugador:** O Python inclui um debugador, de modo que quando
|
||
+ alguma rotina falha por algum motivo, o usuário pode acessar
|
||
+ extensiva informação sobre a pilha de cálculos e inspecionar o
|
||
+ estado de todas as variáveis relevantes.
|
||
+
|
||
+- **Profiler:** Existe um profiler para o Python, o qual executa
|
||
+ programas e cria um relatório detalhando quantas vezes e por quando
|
||
+ tempo cada função foi executada.
|
||
+
|
||
+- **Uma Linguagem:** Em vez de escrever uma **nova linguagem** para
|
||
+ matemática como foi feito para o Magma, Maple, Mathematica, Matlab,
|
||
+ GP/PARI, GAP, Macaulay 2, Simath, etc., nós usamos a linguagem
|
||
+ Python, que é uma linguagem de programação popular que está
|
||
+ sendo desenvolvida e otimizada ativamente por centenas de
|
||
+ engenheiros de software qualificados. O Python é uma grande
|
||
+ história de sucesso em desenvolvimento com código aberto com um
|
||
+ processo de desenvolvimento maduro (veja [PyDev]_).
|
||
+
|
||
+.. _section-mathannoy:
|
||
+
|
||
+O Pré-Processador: Diferenças entre o Sage e o Python
|
||
+-----------------------------------------------------
|
||
+
|
||
+Alguns aspectos matemáticos do Python podem ser confusos, logo o Sage
|
||
+se comporta diferentemente do Python em diversas situações.
|
||
+
|
||
+- **Notação para exponenciação:** ``**`` versus ``^``. Em Python,
|
||
+ ``^`` significa "xor", não exponenciação, logo em Python temos
|
||
+
|
||
+ ::
|
||
+
|
||
+ >>> 2^8
|
||
+ 10
|
||
+ >>> 3^2
|
||
+ 1
|
||
+ >>> 3**2
|
||
+ 9
|
||
+
|
||
+ Esse uso de ``^`` pode parecer estranho, e é ineficiente para
|
||
+ pesquisa em matemática pura, pois a função "ou exclusivo" é
|
||
+ raramente usada. Por conveniência, o Sage pre-processa todos as
|
||
+ linhas de comandos antes de passá-las para o Python, substituindo
|
||
+ ocorrências de ``^`` que não estão em strings por ``**``:
|
||
+
|
||
+ ::
|
||
+
|
||
+ sage: 2^8
|
||
+ 256
|
||
+ sage: 3^2
|
||
+ 9
|
||
+ sage: "3^2"
|
||
+ '3^2'
|
||
+
|
||
+- **Divisão por inteiros:** A expressão em Python ``2/3`` não se
|
||
+ comporta da forma que um matemático esperaria. Em Python, se ``m``
|
||
+ e ``n`` são inteiros (int), então ``m/n`` também é um inteiro
|
||
+ (int), a saber, o quociente de ``m`` dividido por ``n``. Portanto
|
||
+ ``2/3=0``. Tem havido discussões na comunidade do Python para
|
||
+ modificar o Python de modo que ``2/3`` retorne um número de
|
||
+ precisão flutuante (float) ``0.6666...``, e ``2//3`` retorne ``0``.
|
||
+
|
||
+ Nós lidamos com isso no interpretador Sage, encapsulando inteiros
|
||
+ literais em ``Integer()`` e fazendo a divisão um construtor para
|
||
+ números racionais. Por exemplo:
|
||
+
|
||
+ ::
|
||
+
|
||
+ sage: 2/3
|
||
+ 2/3
|
||
+ sage: (2/3).parent()
|
||
+ Rational Field
|
||
+ sage: 2//3
|
||
+ 0
|
||
+ sage: int(2)/int(3)
|
||
+ 0
|
||
+
|
||
+- **Inteiros longos:** O Python possui suporte nativo para inteiros
|
||
+ com precisão arbitrária, além de int's do C. Esses são
|
||
+ significantemente mais lentos do que os fornecidos pela biblioteca
|
||
+ GMP, e têm a propriedade que eles são impressos com o sufixo ``L``
|
||
+ para distingui-los de int's (e isso não será modificado no futuro
|
||
+ próximo). O Sage implementa inteiros com precisão arbitrária usando
|
||
+ a biblioteca C do GMP, e esses são impressos sem o sufixo ``L``.
|
||
+
|
||
+Em vez de modificar o interpretador Python (como algumas pessoas
|
||
+fizeram para projetos internos), nós usamos a linguagem Python
|
||
+exatamente com ela é, e escrevemos um pré-processador para o IPython de
|
||
+modo que o comportamento da linha de comando seja o que um matemático
|
||
+espera. Isso significa que qualquer programa existente em Python pode
|
||
+ser usado no Sage. Todavia, deve-se obedecer as regras padrão do
|
||
+Python para escrever programas que serão importados no Sage.
|
||
+
|
||
+(Para instalar uma biblioteca do Python, por exemplo uma que você
|
||
+tenha encontrado na internet, siga as instruções, mas execute ``sage
|
||
+-python`` em vez de ``python``. Frequentemente isso significa digitar
|
||
+``sage -python setup.py install``.)
|
||
+
|
||
+Eu gostaria de contribuir de alguma forma. Como eu posso?
|
||
+=========================================================
|
||
+
|
||
+Se você quiser contribuir para o Sage, a sua ajuda será muito bem
|
||
+vinda! Ela pode variar desde substancial quantidade de código, até
|
||
+contribuições com respeito à documentação ou notificação de defeitos
|
||
+(bugs).
|
||
+
|
||
+Explore a página na web do Sage para informações para desenvolvedores;
|
||
+entre outras coisas, você pode encontrar uma lista longa de projetos
|
||
+relacionados ao Sage ordenados por prioridade e categoria. O `Guia
|
||
+para desenvolvedores do Sage
|
||
+<http://www.sagemath.org/doc/developer/>`_ (em inglês) também possui
|
||
+informações úteis, e você pode também visitar o grupo de discussões
|
||
+``sage-devel`` no Google Groups.
|
||
+
|
||
+Como eu faço referência ao Sage?
|
||
+================================
|
||
+
|
||
+Se você escrever um artigo usando o Sage, por favor faça referência
|
||
+aos cálculos feitos com o Sage incluindo
|
||
+
|
||
+::
|
||
+
|
||
+ [Sage] William A. Stein et al., Sage Mathematics Software (Version 4.3).
|
||
+ The Sage Development Team, 2009, http://www.sagemath.org.
|
||
+
|
||
+na sua bibliografia (substituindo 4.3 pela versão do Sage que você
|
||
+está usando). Além disso, procure observar quais componentes do Sage
|
||
+você está usando em seus cálculos, por exemplo, PARI, Singular, GAP,
|
||
+Maxima, e também site esses sistemas. Se você está em dúvida sobre
|
||
+qual software está sendo usado em seus cálculos, fique à vontade para
|
||
+perguntar no grupo ``sage-devel`` do Google Groups. Veja
|
||
+:ref:`section-univariate` para mais discussões sobre esse aspecto.
|
||
+
|
||
+------------
|
||
+
|
||
+Se por acaso você leu este tutorial do começo ao fim em uma só vez, e
|
||
+faz idéia de quanto tempo você levou, por favor nos informe no grupo
|
||
+``sage-devel`` do Google Groups.
|
||
+
|
||
+Divirta-se com o Sage!
|
||
diff --git a/doc/pt/tutorial/appendix.rst b/doc/pt/tutorial/appendix.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/appendix.rst
|
||
@@ -0,0 +1,33 @@
|
||
+********
|
||
+Apêndice
|
||
+********
|
||
+
|
||
+.. _section-precedence:
|
||
+
|
||
+Precedência de operações aritméticas binárias
|
||
+=============================================
|
||
+
|
||
+Quanto é ``3^2*4 + 2%5``? A resposta (38) é determinada pela "tabela
|
||
+de precedência" abaixo. A tabela abaixo é baseada na tabela em § 5.14
|
||
+do *Python Language Reference Manual* by G. Rossum and F. Drake. As
|
||
+operações estão listadas aqui em ordem crescente de precedência.
|
||
+
|
||
+
|
||
+========================== =================
|
||
+Operadores Descrição
|
||
+========================== =================
|
||
+or "ou" booleano
|
||
+and "e" booleano
|
||
+not "não" booleano
|
||
+in, not in pertence
|
||
+is, is not teste de identidade
|
||
+>, <=, >, >=, ==, !=, <> comparação
|
||
++, - adição, subtração
|
||
+\*, /, % multiplicação, divisão, resto
|
||
+\*\*, ^ exponenciação
|
||
+========================== =================
|
||
+
|
||
+Portanto, para calcular ``3^2*4 + 2%5``, O Sage inclui parenteses de
|
||
+precedência da seguinte forma: ``((3^2)*4) + (2%5)``. Logo, primeiro
|
||
+calcula ``3^2``, que é ``9``, então calcula ``(3^2)*4`` e ``2%5``, e
|
||
+finalmente soma os dois.
|
||
diff --git a/doc/pt/tutorial/bibliography.rst b/doc/pt/tutorial/bibliography.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/bibliography.rst
|
||
@@ -0,0 +1,52 @@
|
||
+************
|
||
+Bibliografia
|
||
+************
|
||
+
|
||
+.. [Cyt] Cython, http://www.cython.org.
|
||
+
|
||
+.. [Dive] Dive into Python, disponível gratuitamente na internet em
|
||
+ http://diveintopython.org.
|
||
+
|
||
+.. [GAP] The GAP Group, GAP - Groups, Algorithms, and
|
||
+ Programming, Version 4.4; 2005, http://www.gap-system.org
|
||
+
|
||
+.. [GAPkg] GAP Packages,
|
||
+ http://www.gap-system.org/Packages/packages.html
|
||
+
|
||
+.. [GP] PARI/GP http://pari.math.u-bordeaux.fr/.
|
||
+
|
||
+.. [Ip] The IPython shell http://ipython.scipy.org.
|
||
+
|
||
+.. [Jmol] Jmol: an open-source Java viewer for chemical
|
||
+ structures in 3D http://www.jmol.org/.
|
||
+
|
||
+.. [Mag] Magma http://magma.maths.usyd.edu.au/magma/.
|
||
+
|
||
+.. [Max] Maxima http://maxima.sf.net/
|
||
+
|
||
+.. [NagleEtAl2004] Nagle, Saff, and Snider.
|
||
+ *Fundamentals of Differential Equations*. 6th edition, Addison-Wesley,
|
||
+ 2004.
|
||
+
|
||
+.. [Py] The Python language http://www.python.org/
|
||
+ Reference Manual http://docs.python.org/ref/ref.html.
|
||
+
|
||
+.. [PyDev] Guido, Some Guys, and a Mailing List: How Python is
|
||
+ Developed,
|
||
+ http://www.python.org/dev/dev_intro.html.
|
||
+
|
||
+.. [Pyr] Pyrex,
|
||
+ http://www.cosc.canterbury.ac.nz/~greg/python/Pyrex/.
|
||
+
|
||
+.. [PyT] The Python Tutorial http://www.python.org/.
|
||
+
|
||
+.. [SA] Sage web site http://www.sagemath.org/.
|
||
+
|
||
+.. [Si] G.-M. Greuel, G. Pfister, and H. Schönemann. Singular
|
||
+ 3.0. A Computer Algebra System for Polynomial Computations. Center
|
||
+ for Computer Algebra, University of Kaiserslautern (2005).
|
||
+ http://www.singular.uni-kl.de.
|
||
+
|
||
+.. [SJ] William Stein, David Joyner, Sage: System for Algebra and
|
||
+ Geometry Experimentation, Comm. Computer Algebra {39}(2005)61-64.
|
||
+
|
||
diff --git a/doc/pt/tutorial/conf.py b/doc/pt/tutorial/conf.py
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/conf.py
|
||
@@ -0,0 +1,35 @@
|
||
+# -*- coding: utf-8 -*-
|
||
+#
|
||
+# Sage documentation build configuration file, based on the file created by
|
||
+# sphinx-quickstart on Thu Aug 21 20:15:55 2008.
|
||
+#
|
||
+# This file is execfile()d with the current directory set to its containing dir.
|
||
+#
|
||
+# The contents of this file are pickled, so don't put values in the namespace
|
||
+# that aren't pickleable (module imports are okay, they're removed automatically).
|
||
+#
|
||
+# All configuration values have a default; values that are commented out
|
||
+# serve to show the default.
|
||
+
|
||
+import sys, os
|
||
+sys.path.append(os.environ['SAGE_DOC'])
|
||
+from common.conf import *
|
||
+
|
||
+# General information about the project.
|
||
+project = u"Tutorial Sage"
|
||
+name = u'tutorial-pt'
|
||
+language = "pt_BR"
|
||
+
|
||
+# The name for this set of Sphinx documents. If None, it defaults to
|
||
+# "<project> v<release> documentation".
|
||
+html_title = project + " v"+release
|
||
+
|
||
+# Output file base name for HTML help builder.
|
||
+htmlhelp_basename = name
|
||
+
|
||
+# Grouping the document tree into LaTeX files. List of tuples
|
||
+# (source start file, target name, title, author, document class [howto/manual]).
|
||
+latex_documents = [
|
||
+ ('index', name+'.tex', project,
|
||
+ u'The Sage Group', 'manual'),
|
||
+]
|
||
diff --git a/doc/pt/tutorial/index.rst b/doc/pt/tutorial/index.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/index.rst
|
||
@@ -0,0 +1,46 @@
|
||
+.. Sage documentation master file, created by sphinx-quickstart on Thu Aug 21 20:15:55 2008.
|
||
+ You can adapt this file completely to your liking, but it should at least
|
||
+ contain the root `toctree` directive.
|
||
+
|
||
+Bem-vindo ao Tutorial Sage!
|
||
+===========================
|
||
+
|
||
+Sage é um software de matemática gratuito, de código aberto, para uso
|
||
+em ensino e pesquisa em álgebra, geometria, teoria de números,
|
||
+criptografia, computação numérica, e áreas relacionadas. Tanto o
|
||
+modelo de desenvolvimento como a tecnologia empregada no Sage se
|
||
+distinguem pela forte ênfase em transparência, cooperação, e
|
||
+colaboração: estamos desenvolvendo o carro, não reinventando a roda. O
|
||
+objetivo maior do Sage é criar uma alternativa viável, gratuita, e de
|
||
+código aberto aos programas Maple, Mathematica, Magma e MATLAB.
|
||
+
|
||
+Este tutorial é a melhor forma de se familiarizar com o Sage em apenas
|
||
+algumas horas. Você pode lê-lo em versão HTML ou PDF, ou diretamente
|
||
+no Notebook Sage (clique em ``Help``, e então clique em ``Tutorial``
|
||
+para percorrer o tutorial de forma iterativa diretamente do Sage).
|
||
+
|
||
+Este documento está sob a licença `Creative Commons CompartilhaIgual
|
||
+3.0`__.
|
||
+
|
||
+__ http://creativecommons.org/licenses/by-sa/3.0/deed.pt
|
||
+
|
||
+.. toctree::
|
||
+ :maxdepth: 2
|
||
+
|
||
+ introduction
|
||
+ tour
|
||
+ interactive_shell
|
||
+ interfaces
|
||
+ latex
|
||
+ programming
|
||
+ sagetex
|
||
+ afterword
|
||
+ appendix
|
||
+ bibliography
|
||
+
|
||
+Índices e tabelas
|
||
+=================
|
||
+
|
||
+* :ref:`genindex`
|
||
+* :ref:`modindex`
|
||
+* :ref:`search`
|
||
diff --git a/doc/pt/tutorial/interactive_shell.rst b/doc/pt/tutorial/interactive_shell.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/interactive_shell.rst
|
||
@@ -0,0 +1,1024 @@
|
||
+.. _chapter-interactive_shell:
|
||
+
|
||
+*****************************
|
||
+A Linha de Comando Interativa
|
||
+*****************************
|
||
+Na maior parte deste tutorial, assumimos que você iniciou o
|
||
+interpretador Sage usando o comando ``sage``. Isso inicia uma versão
|
||
+personalizada da linha de comando IPython, e importa diversas funções
|
||
+e classes de modo que elas fiquem prontas para serem usadas a partir
|
||
+da linha de comando. Configuração adicional é possível editando o
|
||
+arquivo ``$SAGE_ROOT/ipythonrc``. Assim que você inicia o Sage, você
|
||
+obtém o seguinte:
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ ----------------------------------------------------------------------
|
||
+ | SAGE Version 3.1.1, Release Date: 2008-05-24 |
|
||
+ | Type notebook() for the GUI, and license() for information. |
|
||
+ ----------------------------------------------------------------------
|
||
+ sage:
|
||
+
|
||
+Para sair do Sage pressione Ctrl-D ou digite ``quit`` ou ``exit``.
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: quit
|
||
+ Exiting SAGE (CPU time 0m0.00s, Wall time 0m0.89s)
|
||
+
|
||
+O wall time é o tempo que passou no relógio "pendurado na sua parede".
|
||
+Isso é relevante, pois o tempo CPU não conta o tempo usado por
|
||
+subprocessos como GAP ou Singular.
|
||
+
|
||
+(Evite terminar um processo do Sage usando ``kill -9`` a partir de um
|
||
+terminal, pois o Sage pode não terminal seus subprocessos, por
|
||
+exemplo, subprocessos do Maple, ou limpeza de arquivos temporários em
|
||
+``$HOME/.sage/tmp``.)
|
||
+
|
||
+A Sua Sessão no Sage
|
||
+====================
|
||
+
|
||
+A sessão é a sequência de entradas e saídas de dados desde o momento em
|
||
+que você inicia até o momento em que você termina o Sage. O Sage grava
|
||
+todas as entradas de dados, através do IPython. De fato, se você está
|
||
+usando a linha de comando (não o Notebook), então a qualquer momento
|
||
+você pode digitar ``%history`` (ou ``%hist``) para obter uma lista de
|
||
+todas as linhas digitadas até então. Você pode digitar ``?`` no prompt
|
||
+do Sage para aprender mais sobre o IPython, por exemplo, "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!)":
|
||
+
|
||
+::
|
||
+
|
||
+ _: previous input (interactive shell and notebook)
|
||
+ __: next previous input (interactive shell only)
|
||
+ _oh : list of all inputs (interactive shell only)
|
||
+
|
||
+Aqui vai um exemplo:
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: factor(100)
|
||
+ _1 = 2^2 * 5^2
|
||
+ sage: kronecker_symbol(3,5)
|
||
+ _2 = -1
|
||
+ sage: %hist #This only works from the interactive shell, not the notebook.
|
||
+ 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
|
||
+
|
||
+Vamos omitir a numeração das linhas no restante deste tutorial e em
|
||
+outras documentações do Sage.
|
||
+
|
||
+Você também pode salvar uma lista de comandos em uma macro.
|
||
+
|
||
+.. 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
|
||
+
|
||
+Quando se usa a linha de comando, qualquer comando UNIX pode ser
|
||
+executado a partir do Sage inserindo um ponto de exclamação ``!`` como
|
||
+prefixo. Por exemplo,
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: !ls
|
||
+ auto example.sage glossary.tex t tmp tut.log tut.tex
|
||
+
|
||
+fornece a lista de arquivos do atual diretório.
|
||
+
|
||
+O ``PATH`` possui o diretório bin do Sage em primeiro, portanto se
|
||
+você digitar ``p``, ``gap``, ``singular``, ``maxima``, etc., você
|
||
+executa a versão incluída no 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 \
|
||
+
|
||
+Gravando Entradas e Saídas de dados
|
||
+===================================
|
||
+
|
||
+Gravar a sua sessão no Sage não é o mesmo que salvá-la (veja
|
||
+:ref:`section-save`). Para gravar a entrada de dados (e opcionalmente
|
||
+a saída) use o comando ``logstart``. Digite ``logstart?`` para mais
|
||
+detalhes. Você pode usar esse comando para gravar tudo o que você
|
||
+digita, toda a saída de dados, e até mesmo usar essa entrada de dados
|
||
+que você guardou em uma sessão futura (simplesmente importando o
|
||
+arquivo log).
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ 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 <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)]
|
||
+
|
||
+Se você usa o Sage no terminal ``konsole`` do Linux KDE, então você
|
||
+pode gravar a sessão da seguinte forma: após iniciar o Sage no
|
||
+``konsole``, selecione "settings", então "history...", então "set
|
||
+unlimited". Quando você estiver pronto para guardar a sua sessão,
|
||
+selecione "edit" e então "save history as..." e digite um nome para
|
||
+salvar o texto de sua sessão em seu computador. Após salvar esse
|
||
+arquivo, você poderia abri-lô em um editor, tal como o xemacs, e
|
||
+imprimi-lo.
|
||
+
|
||
+Colar Texto Ignora Prompts
|
||
+==========================
|
||
+
|
||
+Suponha que você está lendo uma sequência de comandos em Sage ou
|
||
+Python e quer copiá-los no Sage. Mas eles têm os irritantes prompts
|
||
+``>>>`` ou ``sage:`` para te aborrecer. De fato, você pode copiar e
|
||
+colar um exemplo, incluindo os prompts se você quiser, no Sage. Em
|
||
+outras palavras, automaticamente o Sage remove os caracteres ``>>>``
|
||
+ou ``sage:`` antes de colar o conteúdo no Python. Por exemplo,
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: 2^10
|
||
+ 1024
|
||
+ sage: sage: sage: 2^10
|
||
+ 1024
|
||
+ sage: >>> 2^10
|
||
+ 1024
|
||
+
|
||
+Comandos de Tempo
|
||
+=================
|
||
+
|
||
+Se você colocar o comando ``%time`` no começo de uma linha de comando,
|
||
+o tempo que o comando leva para ser executado vai aparecer após a
|
||
+saída de dados. Por exemplo, nós podemos comparar o tempo de execução
|
||
+para certas operações de exponenciação de várias formas. Os tempos
|
||
+abaixo vão ser provavelmente muito diferentes para o seu computador,
|
||
+ou até mesmo para versões diferentes do Sage. Primeiro, usando o
|
||
+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
|
||
+
|
||
+Isso significa que levou 0.66 segundos no total, e o wall time, isto
|
||
+é, a quantidade de tempo que passou no seu relógio de parede, é também
|
||
+0.66 segundos. Se o seu computador está executado outros programas o
|
||
+wall time pode ser muito maior do que o tempo de CPU.
|
||
+
|
||
+A seguir verificamos o tempo de exponenciação usando o tipo Integer do
|
||
+Sage, o qual é implementado (em Cython) usando a biblioteca 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
|
||
+
|
||
+Usando a biblioteca C do PARI:
|
||
+
|
||
+.. 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
|
||
+
|
||
+A GMP é melhor, mas por pouco (como esperado, pois a versão do PARI
|
||
+contida no Sage usa a GMP para aritmética de inteiros).
|
||
+
|
||
+Você pode também contar o tempo de um bloco de comandos usado o
|
||
+comando ``cputime``, como ilustrado abaixo:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: t = cputime()
|
||
+ sage: a = int(1938)^int(99484)
|
||
+ sage: b = 1938^99484
|
||
+ sage: c = pari(1938)^pari(99484)
|
||
+ sage: cputime(t) # somewhat random output
|
||
+ 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
|
||
+
|
||
+O comando ``walltime`` se comporta como o comando ``cputime``, exceto
|
||
+que ele conta o tempo do relógio.
|
||
+
|
||
+Nós podemos também calcular a potência acima em alguns softwares de
|
||
+álgebra incluídos no Sage. Em cada caso executamos um comando trivial
|
||
+no sistema de modo a inicializar o servidor para aquele programa. O
|
||
+tempo mais relevante é o tempo do relógio. Todavia, se houver uma
|
||
+diferença significativa entre o wall time e o CPU time então isso pode
|
||
+indicar algum problema de performance que vale a pena investigar.
|
||
+
|
||
+.. 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: gap(0)
|
||
+ 0
|
||
+ sage: time g = gap.eval('1938^99484;;')
|
||
+ CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
|
||
+ Wall time: 1.02
|
||
+
|
||
+Note que o GAP e o Maxima são os mais lentos neste teste (isso foi
|
||
+executado no computador ``sage.math.washington.edu``). Devido ao
|
||
+"overhead" da interface pexpect, talvez não seja apropriado comparar
|
||
+esses resultados com o Sage, que é o mais rápido.
|
||
+
|
||
+Outras Dicas para o IPython
|
||
+===========================
|
||
+
|
||
+Como observado acima, o Sage usa o IPython como interface, logo você
|
||
+pode usar quaisquer comandos e recursos do IPython. Você pode ler a
|
||
+`Documentação completa do IPython
|
||
+<http://ipython.scipy.org/moin/Documentation>`_ (em inglês).
|
||
+
|
||
+- Você pode usar ``%bg`` para executar um comando no background, e
|
||
+ então usar ``jobs`` para acessar os resultados, da seguinte forma.
|
||
+ (Os comentários ``not tested`` estão aqui porque a sintaxe ``%bg``
|
||
+ não funciona bem com o sistema de testes automáticos do Sage. Se
|
||
+ você digitar esses comandos, eles devem funcionar. Isso é obviamente
|
||
+ mais útil com comandos que demoram para serem completados.)
|
||
+
|
||
+ ::
|
||
+
|
||
+ sage: def quick(m): return 2*m
|
||
+ sage: %bg quick(20) # not tested
|
||
+ Starting job # 0 in a separate thread.
|
||
+ sage: jobs.status() # not tested
|
||
+ Completed jobs:
|
||
+ 0 : quick(20)
|
||
+ sage: jobs[0].result # the actual answer, not tested
|
||
+ 40
|
||
+
|
||
+ Note que os comandos executados no background não usam o
|
||
+ pre-processador (preparser) do Sage -- veja :ref:`section-mathannoy`
|
||
+ para mais informações. Uma forma (estranha talvez) de contornar esse
|
||
+ problema seria executar ::
|
||
+
|
||
+ sage: %bg eval(preparse('quick(20)')) # not tested
|
||
+
|
||
+ É mais seguro e simples, todavia, usar ``%bg`` apenas em comandos
|
||
+ que não requerem o pre-processador (preparser).
|
||
+
|
||
+- Você pode usar ``%edit`` (ou ``%ed`` ou ``ed``) para abrir um
|
||
+ editor, se você desejar digitar algum código mais complexo. Antes de
|
||
+ iniciar o Sage, certifique-se de que a variável de environment
|
||
+ :envvar:`EDITOR` está definida com o seu editor favorito (colocando
|
||
+ ``export EDITOR=/usr/bin/emacs`` ou ``export EDITOR=/usr/bin/vim``
|
||
+ or algo similar no lugar apropriado, como um arquivo ``.profile``).
|
||
+ A partir do prompt do Sage, o comando ``%edit`` irá abrir o editor
|
||
+ escolhido. Então usando o editor você pode definir uma função::
|
||
+
|
||
+ def some_function(n):
|
||
+ return n**2 + 3*n + 2
|
||
+
|
||
+ Salve e feche o editor. No restante da sua sessão do Sage, você pode
|
||
+ usar então a função ``some_function``. Se você quiser modificá-la,
|
||
+ digite ``%edit some_function`` no prompt do Sage.
|
||
+
|
||
+- Se você for calcular algo e quiser modificar o resultado para outro
|
||
+ uso, execute o cálculo e então digite ``%rep``: isso irá colocar o
|
||
+ resultado do comando anterior no prompt do Sage, pronto para ser
|
||
+ editado.::
|
||
+
|
||
+ sage: f(x) = cos(x)
|
||
+ sage: f(x).derivative(x)
|
||
+ -sin(x)
|
||
+
|
||
+ A esta altura, se você digitar ``%rep`` no prompt do Sage, você irá
|
||
+ obter um novo prompt, seguido de ``-sin(x)``, com o cursor no final
|
||
+ da linha.
|
||
+
|
||
+Para mais informações, digite ``%quickref`` para ver um guia rápido de
|
||
+referência do IPython. Quando este tutorial foi escrito (April 2011),
|
||
+o Sage usa a versão 0.9.1 do IPython, e a `documentation for its magic
|
||
+commands <http://ipython.scipy.org/doc/rel-0.9.1/html/interactive/reference.html#magic-commands>`_
|
||
+está disponível na internet.
|
||
+
|
||
+
|
||
+Erros e Exceções
|
||
+================
|
||
+
|
||
+Quando algo errado ocorre, você usualmente verá uma "exceção" do
|
||
+Python. O Python até mesmo tenta sugerir o que ocasionou a exceção,
|
||
+por exemplo, ``NameError`` ou ``ValueError`` (veja o Manual de
|
||
+Referência do Python [Py]_ para uma lista completa de exceções). Por
|
||
+exemplo,
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: 3_2
|
||
+ ------------------------------------------------------------
|
||
+ File "<console>", line 1
|
||
+ ZZ(3)_2
|
||
+ ^
|
||
+ SyntaxError: invalid syntax
|
||
+
|
||
+ sage: EllipticCurve([0,infinity])
|
||
+ ------------------------------------------------------------
|
||
+ Traceback (most recent call last):
|
||
+ ...
|
||
+ TypeError: Unable to coerce Infinity (<class 'sage...Infinity'>) to Rational
|
||
+
|
||
+O debugador interativo é as vezes útil para entender o que houve de
|
||
+errado. Você pode ativá-lo e desativá-lo usando ``%pdb`` (o padrão é
|
||
+desativado). O prompt ``ipdb>`` aparece se uma exceção é levantada e o
|
||
+debugador está ativado. A partir do debugador, você pode imprimir o
|
||
+estado de qualquer variável local, e mover a pilha de execução para
|
||
+cima e para baixo. Por exemplo,
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: %pdb
|
||
+ Automatic pdb calling has been turned ON
|
||
+ sage: EllipticCurve([1,infinity])
|
||
+ ---------------------------------------------------------------------------
|
||
+ <type 'exceptions.TypeError'> Traceback (most recent call last)
|
||
+ ...
|
||
+
|
||
+ ipdb>
|
||
+
|
||
+Para uma lista de comandos do debugador, digite ``?`` no prompt
|
||
+``ipbd>``:
|
||
+
|
||
+::
|
||
+
|
||
+ 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
|
||
+
|
||
+Digite Ctrl-D ou ``quit`` para retornar ao Sage.
|
||
+
|
||
+.. _section-tabcompletion:
|
||
+
|
||
+Busca Reversa e Completamento Tab
|
||
+==================================
|
||
+
|
||
+Busca reversa: Digite o começo de um comando, e então ``Ctrl-p`` (ou
|
||
+tecle a seta para cima) para voltar para cada linha que você digitou
|
||
+que começa daquela forma. Isso funciona mesmo se você encerrou o Sage
|
||
+e iniciou novamente mais tarde. Você também pode fazer uma busca
|
||
+reversa ao longo da história usando ``Ctrl-r``. Todos esses recursos
|
||
+usam o pacote ``readline``, que está disponível no Linux.
|
||
+
|
||
+Para ilustrar a busca reversa, primeiro crie o e espaço vetorial
|
||
+tri-dimensional :math:`V=\QQ^3` da seguinte forma:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: V = VectorSpace(QQ,3)
|
||
+ sage: V
|
||
+ Vector space of dimension 3 over Rational Field
|
||
+
|
||
+Você pode usar a seguinte notação mais compacta:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: V = QQ^3
|
||
+
|
||
+Então é fácil listar todas as funções para :math:`V` usando
|
||
+completamento. Digite ``V``, e então pressione a tecla ``[tab]`` no
|
||
+seu teclado:
|
||
+
|
||
+.. 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
|
||
+
|
||
+Se você digitar as primeiras letras de uma função, e então a tecla
|
||
+``[tab]``, você obtém apenas funções que começam conforme indicado.
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: V.i[tab key]
|
||
+ V.is_ambient V.is_dense V.is_full V.is_sparse
|
||
+
|
||
+Se você gostaria de saber o que uma função faz, por exemplo, a função
|
||
+coordinates, digite ``V.coordinates?`` para ajuda ou
|
||
+``V.coordinates??`` para ver o código fonte, como explicado na próxima
|
||
+sessão.
|
||
+
|
||
+
|
||
+
|
||
+Sistema de Ajuda Integrado
|
||
+==========================
|
||
+
|
||
+O Sage possui um sistema de ajuda integrado. Digite o nome da função
|
||
+seguido de ? para ver informações sobre a função.
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: V = QQ^3
|
||
+ sage: V.coordinates?
|
||
+ Type: instancemethod
|
||
+ Base Class: <type '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]
|
||
+
|
||
+Como mostrado acima, o comando de ajuda mostra o tipo do objeto, o
|
||
+arquivo no qual ele é definido, e uma descrição útil da função com
|
||
+exemplos que você pode colar na sua sessão atual. Quase todos esses
|
||
+exemplos são regularmente testados automaticamente para certificar que
|
||
+eles se comportam exatamente como esperado.
|
||
+
|
||
+Outro recurso que vai muito na direção do espírito de código aberto do
|
||
+Sage é que se ``f`` é uma função do Python, então o comando ``f??``
|
||
+mostra o código fonte que define ``f``. Por exemplo,
|
||
+
|
||
+.. 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()
|
||
+
|
||
+Isso nos diz que tudo que a função ``coordinates`` faz é chamar a
|
||
+função ``coordinate_vector`` e converter o resultado para uma lista. O
|
||
+que a função ``coordinate_vector`` faz?
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: V = QQ^3
|
||
+ sage: V.coordinate_vector??
|
||
+ ...
|
||
+ def coordinate_vector(self, v):
|
||
+ ...
|
||
+ return self.ambient_vector_space()(v)
|
||
+
|
||
+A função ``coordinate_vector`` coage a sua entrada em um espaço
|
||
+ambiente, o que tem o efeito de calcular o vetor de coeficientes de
|
||
+:math:`v` em termos de :math:`V`. O espaço :math:`V` já é o espaço
|
||
+ambiente pois é simplesmente :math:`\QQ^3`. Existe também uma função
|
||
+``coordinate_vector`` para subespaços, que é diferente. Vamos criar um
|
||
+subespaço e ver:
|
||
+
|
||
+.. 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)
|
||
+
|
||
+(Se você acha que a implementação é ineficiente, por favor junte-se a
|
||
+nós para ajudar a optimizar as funções de álgebra linear.)
|
||
+
|
||
+Você também pode digitar ``help(command_name)`` ou ``help(class)``
|
||
+para ler um arquivo de ajuda sobre determinada classe.
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: help(VectorSpace)
|
||
+ Help on class VectorSpace ...
|
||
+
|
||
+ class VectorSpace(__builtin__.object)
|
||
+ | Create a Vector Space.
|
||
+ |
|
||
+ | To create an ambient space over a field with given dimension
|
||
+ | using the calling syntax ...
|
||
+ :
|
||
+ :
|
||
+
|
||
+Quando você digita ``q`` para sair do sistema de ajuda, a sua sessão
|
||
+aparece na tela da mesma forma que anteriormente. O texto de ajuda não
|
||
+fica permanentemente em sua tela, ao contrário da saída de
|
||
+``function_name?`` que as vezes fica. É partircularmente útil digitar
|
||
+``help(module_name)``. Por exemplo, espaços vetoriais são definidos em
|
||
+``sage.modules.free_module``, então digite
|
||
+``help(sage.modules.free_module)`` para obter documentação sobre esse
|
||
+módulo. Quando visualizando documentação usando a ajuda, você pode
|
||
+procurar no texto digitando ``/`` e na ordem reversa digitando ``?``.
|
||
+
|
||
+Salvando e Carregando Objetos Individuais
|
||
+=========================================
|
||
+
|
||
+Suponha que você calcule uma matriz, ou pior ainda, um espaço
|
||
+complicado de símbolos, e gostaria de salvá-los para uso posterior. O
|
||
+que você pode fazer? Existem várias estratégias que os sistemas
|
||
+computacionais de álgebra adotam para salvar objetos individuais.
|
||
+
|
||
+#. **Salve seus cálculos:** Suportam apenas salvar e carregar uma
|
||
+ sessão completa (por exemplo, GAP, Magma).
|
||
+
|
||
+#. **Entrada e Saída Unificadas:** Faz com que cada objeto seja
|
||
+ impresso de uma forma que possa ser lido novamente (GP/PARI).
|
||
+
|
||
+#. **Eval:** Torna fácil processar um código arbitrário no
|
||
+ interpretador (por exemplo, Singular, PARI).
|
||
+
|
||
+
|
||
+
|
||
+Como o Sage usa o Python, ele adota uma estratégia diferente, que se
|
||
+baseia no fato de que qualquer objeto pode ser "serializado", isto é,
|
||
+transformado em uma string a partir da qual o objeto pode ser
|
||
+recuperado. Isso segue o espírito da estratégia unificada de entrada e
|
||
+saída do PARI, exceto que não possue a desvantagem que os objetos são
|
||
+impressos na tela em uma forma muito complicada. Além disso, o suporte
|
||
+para salvar e recuperar é (na maior parte dos casos) completamente
|
||
+automática, não requerendo nenhuma programação extra; é simplesmente um
|
||
+recurso do Python que foi implementado na linguagem desde o início de
|
||
+seu desenvolvimento.
|
||
+
|
||
+Quase todos os objetos ``x`` podem ser armazenados em disco de forma
|
||
+comprimida usando ``save(x, filename)`` (ou em muitos casos
|
||
+``x.save(filename)``). Para carregar o objeto de volta no Sage use
|
||
+``load(filename)``.
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: A = MatrixSpace(QQ,3)(range(9))^2
|
||
+ sage: A
|
||
+ [ 15 18 21]
|
||
+ [ 42 54 66]
|
||
+ [ 69 90 111]
|
||
+ sage: save(A, 'A')
|
||
+
|
||
+Você deve agora sair do Sage e reiniciá-lo. Então você pode obter
|
||
+``A`` de volta:
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: A = load('A')
|
||
+ sage: A
|
||
+ [ 15 18 21]
|
||
+ [ 42 54 66]
|
||
+ [ 69 90 111]
|
||
+
|
||
+Você pode fazer o mesmo com objetos mais complicados, por exemplo,
|
||
+curvas elípticas. Todos os dados sobre o objeto são guardados e
|
||
+restaurados com o objeto. Por exemplo,
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: E = EllipticCurve('11a')
|
||
+ sage: v = E.anlist(100000) # takes a while
|
||
+ sage: save(E, 'E')
|
||
+ sage: quit
|
||
+
|
||
+A versão em disco de ``E`` ocupa 153 kilobytes, pois ela guarda os
|
||
+primeiros 1000000 :math:`a_n` com ela.
|
||
+
|
||
+.. 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) # instant!
|
||
+
|
||
+(Em Python, salvar e restaurar é feito usando o módulo ``cPickle``. Em
|
||
+particular, um objeto ``x`` do Sage pode ser salvado usando
|
||
+``cPickle.dumps(x, 2)``. Note o ``2``!)
|
||
+
|
||
+O sage não pode salvar e carregar objetos criados em algum outro
|
||
+sistema computacional de álgebra, por exemplo, GAP, Singular, Maxima,
|
||
+etc. Eles são carregados em um estado "inválido". Em GAP, embora
|
||
+muitos objetos podem ser impressos de uma forma que eles podem ser
|
||
+reconstruídos, muitos não, logo reconstrução a partir de suas
|
||
+representações impressas não é permitido.
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: a = gap(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.
|
||
+
|
||
+Objetos do GP/PARI também podem ser salvados e carregados pois suas
|
||
+representações em forma impressa são suficientes para reconstruí-los.
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: a = gp(2)
|
||
+ sage: a.save('a')
|
||
+ sage: load('a')
|
||
+ 2
|
||
+
|
||
+Objetos que foram salvados podem ser abertos posteriormente em
|
||
+computadores com arquiteturas e sistemas operacionais diferentes, por
|
||
+exemplo, você poderia salvar uma matriz muito grande em um OS X de
|
||
+32-bits e abri-lo em um Linux de 64-bits, encontrar a forma reduzida,
|
||
+e movê-lo de volta. Além disso, em muitos casos você pode até mesmo
|
||
+abrir objetos em versões do Sage diferentes daquela no qual o objeto
|
||
+foi salvo, desde que o código para aquele objeto não seja muito
|
||
+diferente. Todos os atributos do objetos são armazendos, assim como a
|
||
+classe (mas não o código fonte) que define o objeto. Se aquela classe
|
||
+não existir mais em uma nova versão do Sage, então o objeto não pode
|
||
+ser reaberto nessa versão. Mas você poderia abri-lo em uma versão mais
|
||
+antiga, obter o dicionário do objeto (com ``x.__dict__``), salvar o
|
||
+dicionário, e abri-lo em uma versão mais nova.
|
||
+
|
||
+Salvando como Texto
|
||
+-------------------
|
||
+
|
||
+Você também pode salvar a representação em texto (ASCII) de objetos em
|
||
+um arquivo, simplesmente abrindo um arquivo em modo de escrita, e
|
||
+escrevendo a string que representa o objeto no arquivo (você pode
|
||
+salvar mais de um objeto dessa forma). Quando você terminar de
|
||
+escrever os objetos, feche o arquivo.
|
||
+
|
||
+.. 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:
|
||
+
|
||
+Salvando e Abrindo Sessões Completas
|
||
+====================================
|
||
+
|
||
+O Sage é flexível para salvar e abrir sessões completas.
|
||
+
|
||
+O comando ``save_session(sessionname)`` salva todas as variáveis que
|
||
+você definiu na sessão atual como um dicionário com o nome
|
||
+``sessionname``. (No caso raro de uma variável não poder ser salva,
|
||
+ela simplesmente não aparece no dicionário.) O resultado é um arquivo
|
||
+``.sobj`` que pode ser aberto como qualquer outro objeto que foi
|
||
+salvado. Quando você abre os objetos que foram salvados em uma sessão,
|
||
+você obtém um dicionário cujas chaves (keys) são os nomes das
|
||
+variáveis e os valores são os objetos.
|
||
+
|
||
+Você pode usar o comando ``load_session(sessionname)`` para carregar
|
||
+na presente sessão as variáveis definidas em ``sessioname``. Note que
|
||
+isso não remove as variáveis já definidas na presente sessão; em vez
|
||
+disso, as duas sessões são combinadas.
|
||
+
|
||
+Primeiro iniciamos o Sage e definimos algumas variáveis.
|
||
+
|
||
+.. 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
|
||
+
|
||
+A seguir nós salvamos a nossa sessão, o que armazena cada uma das
|
||
+variáveis acima em um arquivo. Então visualizamos o arquivo, que tem
|
||
+por volta de 3K bytes.
|
||
+
|
||
+.. 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
|
||
+
|
||
+Por fim reiniciamos o Sage, definimos algumas variáveis extra, e
|
||
+carregamos a sessão que foi salva anteriormente.
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: b = 19
|
||
+ sage: load_session('misc')
|
||
+ Loading a
|
||
+ Loading M
|
||
+ Loading E
|
||
+ Loading t
|
||
+
|
||
+Cada variável que foi salva está de novo disponível. Além disso, a
|
||
+variável ``b`` não foi redefinida.
|
||
+
|
||
+.. 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
|
||
+
|
||
+
|
||
+
|
||
+.. _section-notebook:
|
||
+
|
||
+A Interface do Notebook
|
||
+=======================
|
||
+
|
||
+O Sage Notebook é iniciado digitando
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: notebook()
|
||
+
|
||
+na linha de comando do Sage. Isso inicia o Notebook e abre o seu
|
||
+browser padrão para visualizá-lo. Os arquivos de estado do servidor
|
||
+são armazenados em ``$HOME/.sage/sage\_notebook``.
|
||
+
|
||
+Outras opções incluem:
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: notebook("directory")
|
||
+
|
||
+a qual inicia um novo servidor para o Notebook usando arquivos em um
|
||
+dado diretório, em vez do diretório padrão
|
||
+``$HOME/.sage/sage_notebook``. Isso pode ser útil se você quiser ter
|
||
+uma coleção de folhas de trabalho (worksheets) associadas com um
|
||
+projeto específico, ou executar vários Notebooks separadamente ao
|
||
+mesmo tempo.
|
||
+
|
||
+Quando você inicia o Notebook, ele primeiro cria os seguintes arquivos
|
||
+em ``$HOME/.sage/sage_notebook``:
|
||
+
|
||
+::
|
||
+
|
||
+ nb.sobj (the notebook SAGE object file)
|
||
+ objects/ (a directory containing SAGE objects)
|
||
+ worksheets/ (a directory containing SAGE worksheets).
|
||
+
|
||
+Após criar os arquivos acima, o Notebook inicia o servidor web.
|
||
+
|
||
+Um "Notebook" é uma coleção de contas de usuário, cada qual pode ter
|
||
+várias folhas de trabalho (worksheets). Quando você cria uma nova
|
||
+folha de trabalho, os dados dela são armazenados no diretórios
|
||
+``worksheets/username/number``. Em cada diretório desse há um arquivo
|
||
+texto ``worksheet.txt`` - se algum problema ocorrer com as suas
|
||
+folhas de trabalho, ou com o Sage, esse arquivo texto contém toda
|
||
+informação necessária para reconstruir a folha de trabalho.
|
||
+
|
||
+A partir do Sage, digite ``notebook?`` para mais informações sobre
|
||
+como iniciar um servidor.
|
||
+
|
||
+O seguinte diagrama ilustra a arquitetura do Notebook Sage:
|
||
+
|
||
+::
|
||
+
|
||
+ ----------------------
|
||
+ | |
|
||
+ | |
|
||
+ | firefox/safari |
|
||
+ | |
|
||
+ | javascript |
|
||
+ | program |
|
||
+ | |
|
||
+ | |
|
||
+ ----------------------
|
||
+ | ^
|
||
+ | AJAX |
|
||
+ V |
|
||
+ ----------------------
|
||
+ | |
|
||
+ | sage | SAGE process 1
|
||
+ | web | ------------> SAGE process 2 (Python processes)
|
||
+ | server | pexpect SAGE process 3
|
||
+ | | .
|
||
+ | | .
|
||
+ ---------------------- .
|
||
+
|
||
+Para ajuda sobre as teclas de atalho disponíveis no Notebook, clique
|
||
+no link ``Help``.
|
||
diff --git a/doc/pt/tutorial/interfaces.rst b/doc/pt/tutorial/interfaces.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/interfaces.rst
|
||
@@ -0,0 +1,341 @@
|
||
+.. linkall
|
||
+
|
||
+**********
|
||
+Interfaces
|
||
+**********
|
||
+
|
||
+Uma característica central do Sage é que ele permite fazer cálculos
|
||
+com objetos em vários sistemas de álgebra computacional usando uma
|
||
+interface comum e uma linguagem de programação clara.
|
||
+
|
||
+Os métodos console e interact de uma interface executam tarefas bem
|
||
+diferentes. Por exemplo, usando GAP:
|
||
+
|
||
+#. ``gap.console()``: Isso abre um console do GAP - o controle é
|
||
+ transferido para o GAP. Aqui o Sage não é nada mais do que uma
|
||
+ forma conveniente de executar um programa, similar à shell Bash do
|
||
+ Linux.
|
||
+
|
||
+#. ``gap.interact()``: Essa é uma forma de interagir com uma instância
|
||
+ do GAP que pode estar cheia de objetos do Sage. Você pode
|
||
+ importar objetos nessa seção do GAP (até mesmo a partir da
|
||
+ interface interativa), etc.
|
||
+
|
||
+
|
||
+.. index: PARI; GP
|
||
+
|
||
+GP/PARI
|
||
+=======
|
||
+
|
||
+O PARI é um programa em C muito compacto, maduro, e extremamente
|
||
+otimizado cujo foco primário é teoria de números. Existem duas
|
||
+interfaces distintas que podem ser usadas no Sage:
|
||
+
|
||
+
|
||
+- ``gp`` - o "**G** do **P** ARI" interpretador, e
|
||
+
|
||
+- ``pari`` - a biblioteca C do PARI.
|
||
+
|
||
+Por exemplo, os seguintes comandos são duas formas de realizar a mesma
|
||
+coisa. Eles parecem idênticos, mas o resultado é na verdade
|
||
+diferente, e o que acontece por trás da cena é bastante diferente.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: gp('znprimroot(10007)')
|
||
+ Mod(5, 10007)
|
||
+ sage: pari('znprimroot(10007)')
|
||
+ Mod(5, 10007)
|
||
+
|
||
+No primeiro caso, uma cópia separada do interpretador GP é iniciada
|
||
+como um servidor, e a string ``´znprimroot(10007)'`` é enviada,
|
||
+calculada pelo GP, e o resultado é armazenado em uma variável no GP
|
||
+(que ocupa espaço na memória dos processos do GP que não serão
|
||
+liberados). Então o valor dessa variável é exibido. No segundo caso,
|
||
+nenhum programa separado é iniciado, e a string
|
||
+``´znprimroot(10007)'`` é calculada por uma certa função da biblioteca
|
||
+C do PARI. O resultado é armazenado na memória em uso pelo Python, que
|
||
+é liberada quando a variável não for mais referenciada. Os objetos
|
||
+possuem tipos diferentes:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: type(gp('znprimroot(10007)'))
|
||
+ <class 'sage.interfaces.gp.GpElement'>
|
||
+ sage: type(pari('znprimroot(10007)'))
|
||
+ <type 'sage.libs.pari.gen.gen'>
|
||
+
|
||
+Então qual eu devo usar? Depende do que você está fazendo. A interface
|
||
+GP pode fazer absolutamente tudo o que você poderia fazer na linha de
|
||
+comando do GP/PARI, pois está simplesmente executando esse programa.
|
||
+Em particular, você pode carregar programas complicados em PARI e
|
||
+executá-los. Por outro lado, a interface do PARI (via a biblioteca C)
|
||
+é muito mais restritiva. Primeiro, nem todas as funções foram
|
||
+implementadas. Segundo, bastante código, por exemplo, envolvendo
|
||
+integração numérica, não irá funcionar através da interface PARI.
|
||
+Todavia, a interface PARI pode ser significamente mais rápida e mais
|
||
+robusta do que a interface GP.
|
||
+
|
||
+(Se a interface GP ficar sem memória para calcular algum comando, ela
|
||
+irá silenciosamente e automaticamente duplicar a memória alocada e
|
||
+repetir o comando solicitado. Então os seus cálculos não irão ser
|
||
+interrompidos se você não antecipou corretamente a quantidade de
|
||
+memória que seria necessária. Esse é um truque útil que a interface
|
||
+usual do GP não parece fornecer. Com respeito à interface da
|
||
+biblioteca C do PARI, ela imediatamente copia cada objeto criado para
|
||
+fora da pilha de memória, logo essa pilha nunca irá crescer. Contudo,
|
||
+cada objeto não deve exceder 100MB de tamanho, ou a pilha irá estourar
|
||
+quando o objeto for criado. Essa procedimento de cópia impõe uma leve
|
||
+pena sobre a performace.)
|
||
+
|
||
+Em resumo, o Sage usa a biblioteca C do pari para fornecer
|
||
+funcionalidade similar à fornecida pelo interpretador GP/PARI, exceto
|
||
+que com um gerenciamento sofisticado de memória e a linguagem de
|
||
+programação Python.
|
||
+
|
||
+Primeiro criamos uma lista do PARI a partir de uma lista do Python.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: v = pari([1,2,3,4,5])
|
||
+ sage: v
|
||
+ [1, 2, 3, 4, 5]
|
||
+ sage: type(v)
|
||
+ <type 'sage.libs.pari.gen.gen'>
|
||
+
|
||
+Cada objeto do PARI é do tipo ``py_pari_gem``. O tipo PARI do objeto
|
||
+subjacente pode ser obtido usando a função ``type``.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: v.type()
|
||
+ 't_VEC'
|
||
+
|
||
+Em PARI, para criar uma curva elíptica digitamos
|
||
+``ellinit([1,2,3,4,5])``. Em Sage é similar, exceto que ``ellnint`` é
|
||
+um método que pode ser chamado em qualquer objeto do PARI, por
|
||
+exemplo, ``t\_VEC v``.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: e = v.ellinit()
|
||
+ sage: e.type()
|
||
+ 't_VEC'
|
||
+ sage: pari(e)[:13]
|
||
+ [1, 2, 3, 4, 5, 9, 11, 29, 35, -183, -3429, -10351, 6128487/10351]
|
||
+
|
||
+Agora que temos um objeto de curva elíptica, podemos calcular algumas
|
||
+coisas a respeito dele.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: e.elltors()
|
||
+ [1, [], []]
|
||
+ sage: e.ellglobalred()
|
||
+ [10351, [1, -1, 0, -1], 1]
|
||
+ sage: f = e.ellchangecurve([1,-1,0,-1])
|
||
+ sage: f[:5]
|
||
+ [1, -1, 0, 4, 3]
|
||
+
|
||
+.. index: GAP
|
||
+
|
||
+.. _section-gap:
|
||
+
|
||
+GAP
|
||
+===
|
||
+
|
||
+O Sage vem com o GAP 4.4.10 para matemática discreta computacional,
|
||
+especialmente teoria de grupos.
|
||
+
|
||
+Aqui está um exemplo com a função ``IdGroup`` do GAP, a qual usa a
|
||
+base de dados opcional sobre grupos que precisa ser instalada
|
||
+separadamente, como explicado abaixo.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: G = gap('Group((1,2,3)(4,5), (3,4))')
|
||
+ sage: G
|
||
+ Group( [ (1,2,3)(4,5), (3,4) ] )
|
||
+ sage: G.Center()
|
||
+ Group( () )
|
||
+ sage: G.IdGroup() # requires optional database_gap package
|
||
+ [ 120, 34 ]
|
||
+ sage: G.Order()
|
||
+ 120
|
||
+
|
||
+Podemos realizar os mesmos cálculos no Sage sem explicitamente evocar
|
||
+a interface do GAP da seguinte forma:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: G = PermutationGroup([[(1,2,3),(4,5)],[(3,4)]])
|
||
+ sage: G.center()
|
||
+ Subgroup of (Permutation Group with generators [(3,4), (1,2,3)(4,5)]) generated by [()]
|
||
+ sage: G.group_id() # requires optional database_gap package
|
||
+ [120, 34]
|
||
+ sage: n = G.order(); n
|
||
+ 120
|
||
+
|
||
+(Para alguns recursos adicionais do GAP, você deve instalar dois
|
||
+pacotes opcionais. Digite ``sage -optional`` para uma lista e escolha
|
||
+o pacote da forma ``gap\_packages-x.y.z``, então digite ``sage -i
|
||
+gap\_packages-x.y.z``. Faça o mesmo para ``database\_gap-x.y.z``.
|
||
+Alguns pacotes do GAP sem licensa GPL podem ser obtidos no site do GAP
|
||
+[GAPkg]_, e copiados em ``$SAGE_ROOT/local/lib/gap-4.4.10/pkg``.)
|
||
+
|
||
+Singular
|
||
+========
|
||
+
|
||
+O Singular fornece uma biblioteca massiva e madura para bases de
|
||
+Gröbner, máximo divisor comum para poliômios em várias variaveis,
|
||
+bases de espaços de Riemann-Roch de uma curva plana, e fatorização,
|
||
+entre outras coisas. Vamos ilustrar a fatorização de polinômios em
|
||
+várias variáveis usando a interface do Sage para o Singular (não
|
||
+digite ``...``):
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R1 = singular.ring(0, '(x,y)', 'dp')
|
||
+ sage: R1
|
||
+ // characteristic : 0
|
||
+ // number of vars : 2
|
||
+ // block 1 : ordering dp
|
||
+ // : names x y
|
||
+ // block 2 : ordering C
|
||
+ sage: f = singular('9*y^8 - 9*x^2*y^7 - 18*x^3*y^6 - 18*x^5*y^6 + \
|
||
+ ... 9*x^6*y^4 + 18*x^7*y^5 + 36*x^8*y^4 + 9*x^10*y^4 - 18*x^11*y^2 - \
|
||
+ ... 9*x^12*y^3 - 18*x^13*y^2 + 9*x^16')
|
||
+
|
||
+Agora que definimos :math:`f`, vamos imprimi-lo e fatorá-lo.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: f
|
||
+ 9*x^16-18*x^13*y^2-9*x^12*y^3+9*x^10*y^4-18*x^11*y^2+36*x^8*y^4+18*x^7*y^5-18*x^5*y^6+9*x^6*y^4-18*x^3*y^6-9*x^2*y^7+9*y^8
|
||
+ sage: f.parent()
|
||
+ Singular
|
||
+ sage: F = f.factorize(); F
|
||
+ [1]:
|
||
+ _[1]=9
|
||
+ _[2]=x^6-2*x^3*y^2-x^2*y^3+y^4
|
||
+ _[3]=-x^5+y^2
|
||
+ [2]:
|
||
+ 1,1,2
|
||
+ sage: F[1][2]
|
||
+ x^6-2*x^3*y^2-x^2*y^3+y^4
|
||
+
|
||
+Como com o exemplo para o GAP em :ref:`section-gap`, podemos calcular
|
||
+a fatorização acima sem explicitamente usar a inteface do Singular
|
||
+(todavia, implicitamente o Sage usa a interface do Singular para os
|
||
+cálculos). Não digite ``...``:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x, y = QQ['x, y'].gens()
|
||
+ sage: f = 9*y^8 - 9*x^2*y^7 - 18*x^3*y^6 - 18*x^5*y^6 + 9*x^6*y^4\
|
||
+ ... + 18*x^7*y^5 + 36*x^8*y^4 + 9*x^10*y^4 - 18*x^11*y^2 - 9*x^12*y^3\
|
||
+ ... - 18*x^13*y^2 + 9*x^16
|
||
+ sage: factor(f)
|
||
+ (9) * (-x^5 + y^2)^2 * (x^6 - 2*x^3*y^2 - x^2*y^3 + y^4)
|
||
+
|
||
+.. _section-maxima:
|
||
+
|
||
+Maxima
|
||
+======
|
||
+
|
||
+O Maxima está incluido no Sage, assim como uma implementação do Lisp.
|
||
+O pacote gnuplot (que o Maxima usa para criar gráficos) é distribuído
|
||
+como um pacote adicional do Sage. Entre outras coisas, o Maxima
|
||
+executa manipulações simbólicas. Ele pode integrar e diferenciar
|
||
+funções simbolicamente, resolver EDOs de primeira ordem, grande parte
|
||
+das EDOs lineares de segunda ordem, e tem implementado o método da
|
||
+transformada de Laplace para EDOs lineares de qualquer ordem. O Maxima
|
||
+também suporta uma série de funções especiais, é capaz de criar
|
||
+gráficos via gnuplot, e possui métodos para resolver equações
|
||
+polinômiais e manipular matrizes (por exemplo, escalonar e calcular
|
||
+autovalores e autovetores).
|
||
+
|
||
+Nós ilustramos a interface Sage/Maxima construíndo uma matriz cuja
|
||
+entrada :math:`i,j` é :math:`i/j`, para :math:`i,j=1,\ldots,4`.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: f = maxima.eval('ij_entry[i,j] := i/j')
|
||
+ sage: A = maxima('genmatrix(ij_entry,4,4)'); A
|
||
+ matrix([1,1/2,1/3,1/4],[2,1,2/3,1/2],[3,3/2,1,3/4],[4,2,4/3,1])
|
||
+ sage: A.determinant()
|
||
+ 0
|
||
+ sage: A.echelon()
|
||
+ matrix([1,1/2,1/3,1/4],[0,0,0,0],[0,0,0,0],[0,0,0,0])
|
||
+ sage: A.eigenvalues()
|
||
+ [[0,4],[3,1]]
|
||
+ sage: A.eigenvectors()
|
||
+ [[[0,4],[3,1]],[[[1,0,0,-4],[0,1,0,-2],[0,0,1,-4/3]],[[1,2,3,4]]]]
|
||
+
|
||
+Aqui vai outro exemplo:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: A = maxima("matrix ([1, 0, 0], [1, -1, 0], [1, 3, -2])")
|
||
+ sage: eigA = A.eigenvectors()
|
||
+ sage: V = VectorSpace(QQ,3)
|
||
+ sage: eigA
|
||
+ [[[-2,-1,1],[1,1,1]],[[[0,0,1]],[[0,1,3]],[[1,1/2,5/6]]]]
|
||
+ sage: v1 = V(sage_eval(repr(eigA[1][0][0]))); lambda1 = eigA[0][0][0]
|
||
+ sage: v2 = V(sage_eval(repr(eigA[1][1][0]))); lambda2 = eigA[0][0][1]
|
||
+ sage: v3 = V(sage_eval(repr(eigA[1][2][0]))); lambda3 = eigA[0][0][2]
|
||
+
|
||
+ sage: M = MatrixSpace(QQ,3,3)
|
||
+ sage: AA = M([[1,0,0],[1, - 1,0],[1,3, - 2]])
|
||
+ sage: b1 = v1.base_ring()
|
||
+ sage: AA*v1 == b1(lambda1)*v1
|
||
+ True
|
||
+ sage: b2 = v2.base_ring()
|
||
+ sage: AA*v2 == b2(lambda2)*v2
|
||
+ True
|
||
+ sage: b3 = v3.base_ring()
|
||
+ sage: AA*v3 == b3(lambda3)*v3
|
||
+ True
|
||
+
|
||
+Por fim, apresentamos um exemplo de como usar o Sage para criar
|
||
+gráficos usando ``openmath``. Alguns desses exemplos são modificações
|
||
+de exemplos do manual de referência do Maxima.
|
||
+
|
||
+Um gráfico em duas dimensões de diversas funções (não digite ``...``):
|
||
+
|
||
+::
|
||
+
|
||
+ sage: maxima.plot2d('[cos(7*x),cos(23*x)^4,sin(13*x)^3]','[x,0,1]',\
|
||
+ ... '[plot_format,openmath]') # not tested
|
||
+
|
||
+Um gráfico em 3D que você pode mover com o seu mouse:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: maxima.plot3d ("2^(-u^2 + v^2)", "[u, -3, 3]", "[v, -2, 2]",\
|
||
+ ... '[plot_format, openmath]') # not tested
|
||
+ sage: maxima.plot3d("atan(-x^2 + y^3/4)", "[x, -4, 4]", "[y, -4, 4]",\
|
||
+ ... "[grid, 50, 50]",'[plot_format, openmath]') # not tested
|
||
+
|
||
+O próximo gráfico é a famosa faixa de Möbious:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: maxima.plot3d("[cos(x)*(3 + y*cos(x/2)), sin(x)*(3 + y*cos(x/2)),\
|
||
+ ... y*sin(x/2)]", "[x, -4, 4]", "[y, -4, 4]",\
|
||
+ ... '[plot_format, openmath]') # not tested
|
||
+
|
||
+E agora a famosa garrafa de Klein:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: maxima("expr_1: 5*cos(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)\
|
||
+ ... - 10.0")
|
||
+ 5*cos(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)-10.0
|
||
+ sage: maxima("expr_2: -5*sin(x)*(cos(x/2)*cos(y) + sin(x/2)*sin(2*y)+ 3.0)")
|
||
+ -5*sin(x)*(sin(x/2)*sin(2*y)+cos(x/2)*cos(y)+3.0)
|
||
+ sage: maxima("expr_3: 5*(-sin(x/2)*cos(y) + cos(x/2)*sin(2*y))")
|
||
+ 5*(cos(x/2)*sin(2*y)-sin(x/2)*cos(y))
|
||
+ sage: maxima.plot3d ("[expr_1, expr_2, expr_3]", "[x, -%pi, %pi]",\
|
||
+ ... "[y, -%pi, %pi]", "['grid, 40, 40]",\
|
||
+ ... '[plot_format, openmath]') # not tested
|
||
diff --git a/doc/pt/tutorial/introduction.rst b/doc/pt/tutorial/introduction.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/introduction.rst
|
||
@@ -0,0 +1,165 @@
|
||
+**********
|
||
+Introdução
|
||
+**********
|
||
+
|
||
+Este tutorial leva no máximo de 3 a 4 horas para ser percorrido. Você
|
||
+pode lê-lo em versão HTML ou PDF, ou a partir do Notebook Sage (clique
|
||
+em ``Help``, então clique em ``Tutorial`` para percorrer o tutorial de
|
||
+forma interativa).
|
||
+
|
||
+Embora grande parte do Sage seja implementado em Python, nenhum
|
||
+conhecimento de Python é necessário para a leitura deste tutorial.
|
||
+Você vai querer aprender Python (uma linguagem muito divertida!) em
|
||
+algum momento, e existem diversas opções gratuitas disponíveis para
|
||
+isso, entre elas [PyT]_ e [Dive]_ (em inglês). Se você quiser
|
||
+experimentar o Sage rapidamente, este tutorial é o lugar certo para
|
||
+começar. Por exemplo:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: 2 + 2
|
||
+ 4
|
||
+ sage: factor(-2007)
|
||
+ -1 * 3^2 * 223
|
||
+
|
||
+ sage: A = matrix(4,4, range(16)); A
|
||
+ [ 0 1 2 3]
|
||
+ [ 4 5 6 7]
|
||
+ [ 8 9 10 11]
|
||
+ [12 13 14 15]
|
||
+
|
||
+ sage: factor(A.charpoly())
|
||
+ x^2 * (x^2 - 30*x - 80)
|
||
+
|
||
+ sage: m = matrix(ZZ,2, range(4))
|
||
+ sage: m[0,0] = m[0,0] - 3
|
||
+ sage: m
|
||
+ [-3 1]
|
||
+ [ 2 3]
|
||
+
|
||
+ sage: E = EllipticCurve([1,2,3,4,5]);
|
||
+ 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.anlist(10)
|
||
+ [0, 1, 1, 0, -1, -3, 0, -1, -3, -3, -3]
|
||
+ sage: E.rank()
|
||
+ 1
|
||
+
|
||
+ sage: k = 1/(sqrt(3)*I + 3/4 + sqrt(73)*5/9); k
|
||
+ 1/(I*sqrt(3) + 5/9*sqrt(73) + 3/4)
|
||
+ sage: N(k)
|
||
+ 0.165495678130644 - 0.0521492082074256*I
|
||
+ sage: N(k,30) # 30 "bits"
|
||
+ 0.16549568 - 0.052149208*I
|
||
+ sage: latex(k)
|
||
+ \frac{1}{i \, \sqrt{3} + \frac{5}{9} \, \sqrt{73} + \frac{3}{4}}
|
||
+
|
||
+.. _installation:
|
||
+
|
||
+Instalação
|
||
+==========
|
||
+
|
||
+Se você não tem o Sage instalado em um computador e quer apenas
|
||
+experimentar alguns comandos, use o Sage através do site
|
||
+http://www.sagenb.org.
|
||
+
|
||
+Veja o guia de instalação do Sage na seção de documentação na página
|
||
+principal do Sage [SA]_ para instruções de como instalar o Sage no seu
|
||
+computador. Aqui faremos apenas alguns comentários.
|
||
+
|
||
+#. O arquivo para download do Sage vem com "baterias incluídas". Em
|
||
+ outras palavras, embora o Sage use o Python, IPython, PARI, GAP,
|
||
+ Singular, Maxima, NTL, GMP, e uma série de outros programas, você
|
||
+ não precisa instalá-los separadamente pois eles estão incluídos no
|
||
+ Sage. Todavia, para usar alguns recursos, por exemplo, o Macaulay
|
||
+ ou o KASH, você precisa instalar pacotes de software adicionais ou
|
||
+ ter os programas necessários já instalados no seu computador. O
|
||
+ Macaulay e o KASH estão disponíveis como pacotes adicionais do Sage
|
||
+ (para uma lista de pacotes adicionais, digite ``sage -optional``,
|
||
+ ou visite a seção "Download" na página do Sage na internet).
|
||
+
|
||
+#. A versão pré-compilada do Sage (disponível na página do Sage na
|
||
+ internet) pode ser mais fácil e rápida para instalar do que a
|
||
+ versão obtida compilando o código fonte.
|
||
+
|
||
+#. Se você quiser usar o pacote SageTeX (que permite inserir
|
||
+ cálculos do Sage em um arquivo LaTeX), você deve tornar
|
||
+ o SageTex disponível para a sua distribuição TeX. Para fazer isso,
|
||
+ consulte a seção "Make SageTex known to TeX" no `Sage installation
|
||
+ guide <http://www.sagemath.org/doc/>`_. O procedimento é bem
|
||
+ simples; você precisa apenas definir algumas variáveis no seu
|
||
+ sistema ou copiar um arquivo para um diretório onde o TeX poderá
|
||
+ encontrá-lo.
|
||
+
|
||
+ A documentação para usar o SageTex está disponível em
|
||
+ ``$SAGE_ROOT/local/share/texmf/tex/generic/sagetex/``, onde
|
||
+ ``$SAGE_ROOT`` refere-se ao diretório onde você instalou o Sage
|
||
+ -- por exemplo, ``/opt/sage-4.2.1``.
|
||
+
|
||
+Formas de usar o Sage
|
||
+=====================
|
||
+
|
||
+Você pode usar o Sage de diversas formas.
|
||
+
|
||
+
|
||
+- **Interface gráfica Notebook:** veja a seção sobre o Notebook em
|
||
+ :ref:`section-notebook`,
|
||
+
|
||
+- **Linha de comando interativa:** veja
|
||
+ :ref:`chapter-interactive_shell`,
|
||
+
|
||
+- **Programas:** escrevendo programas interpretados e compilados em
|
||
+ Sage (veja :ref:`section-loadattach` e :ref:`section-compile`), e
|
||
+
|
||
+- **Scripts:** escrevendo scripts em Python que usam a biblioteca do
|
||
+ Sage (veja :ref:`section-standalone`).
|
||
+
|
||
+
|
||
+Objetivos do Sage a longo prazo
|
||
+===============================
|
||
+
|
||
+- **Útil**: O público alvo do Sage são estudantes de matemática
|
||
+ (desde o ensino médio até a pós-graduação), professores, e
|
||
+ pesquisadores em matemática. O objetivo é fornecer um software que
|
||
+ possa ser usado para explorar e experimentar construções matemáticas
|
||
+ em álgebra, geometria, teoria de números, cálculo, computação
|
||
+ numérica, etc. O Sage torna mais fácil a experimentação com objetos
|
||
+ matemáticos de forma interativa.
|
||
+
|
||
+- **Eficiente:** Ser rápido. O Sage usa software bastante otimizado
|
||
+ como o GMP, PARI, GAP, e NTL, e portanto é muito rápido em certas
|
||
+ operações.
|
||
+
|
||
+- **Gratuito e de código aberto:** O código fonte deve ser amplamente
|
||
+ disponível e legível, de modo que os usuários possam entender o que
|
||
+ o software realmente faz e possam facilmente estendê-lo. Da mesma
|
||
+ forma que matemáticos ganham entendimento sobre um teorema lendo
|
||
+ cuidadosamente a sua demonstração, as pessoas que fazem cálculos
|
||
+ deveriam poder entender como os cálculos são feitos lendo o código
|
||
+ fonte e seus comentários. Se você usar o Sage para fazer cálculos em
|
||
+ um artigo que seja publicado, você pode ter certeza que os leitores
|
||
+ sempre terão livre acesso ao Sage e seu código fonte, e você tem até
|
||
+ mesmo permissão para arquivar e redistribuir a versão do Sage que
|
||
+ você utilizou.
|
||
+
|
||
+- **Fácil de compilar:** O Sage deve ser fácil de compilar a partir
|
||
+ do código fonte para usuários de Linux, OS X e Windows. Isso
|
||
+ fornece mais flexibilidade para os usuários modificarem o sistema.
|
||
+
|
||
+- **Cooperação:** Fornecer uma interface robusta para outros sistemas
|
||
+ computacionais, incluindo PARI, GAP, Singular, Maxima, KASH, Magma,
|
||
+ Maple e Mathematica. O Sage foi concebido para unificar e estender
|
||
+ outros softwares de matemática existentes.
|
||
+
|
||
+- **Bem documentado:** Tutorial, guia de programação, manual de
|
||
+ referência, e how-to, com inúmeros exemplos e discussão sobre
|
||
+ conceitos matemáticos relacionados.
|
||
+
|
||
+- **Estensível:** Ser capaz de definir novos tipos de dados ou
|
||
+ derivá-los a partir dos tipos de dados existentes, e usar programas
|
||
+ escritos em diversas outras linguagens.
|
||
+
|
||
+- **Fácil de usar:** Deve ser fácil entender quais recursos estão
|
||
+ disponíveis para um determinado objeto e consultar a documentação e
|
||
+ o código fonte.
|
||
diff --git a/doc/pt/tutorial/latex.rst b/doc/pt/tutorial/latex.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/latex.rst
|
||
@@ -0,0 +1,515 @@
|
||
+*********************************
|
||
+Sage, LaTeX e Companheiros
|
||
+*********************************
|
||
+
|
||
+AUTOR: Rob Beezer (2010-05-23)
|
||
+
|
||
+O Sage e o dialeto LaTeX do TeX tem um relacionamento sinergético
|
||
+intenso. Esta seção tem como objetivo introduzir as diversas formas de
|
||
+interação entre eles, começado pelas mais básicas e indo até as menos
|
||
+usuais. (Logo você pode não querer ler esta seção inteira na sua
|
||
+primeira passagem por este tutorial.)
|
||
+
|
||
+Panorama Geral
|
||
+==============
|
||
+
|
||
+Pode ser mais fácil entender os vários usos do LaTeX com um panorama
|
||
+geral sobre os três principais métodos usados pelo Sage.
|
||
+
|
||
+#. Todo objeto no Sage possui uma representação em LaTeX. Você
|
||
+ pode acessar essa representação executando, no Notebook ou na
|
||
+ linha de comando do Sage, ``latex(foo)`` where ``foo`` é algum
|
||
+ objeto no Sage. O resultado é uma string que deve fornecer uma
|
||
+ representação razoável de ``foo`` no modo matemático em LaTeX
|
||
+ (por exemplo, quando cercado por um par de símbolos $). Alguns
|
||
+ exemplos disso seguem abaixo.
|
||
+
|
||
+ Dessa forma, o Sage pode ser usado efetivamente para construir
|
||
+ partes de um documento LaTeX: crie ou calcule um objeto no
|
||
+ Sage, imprima ``latex()`` do objeto e copie-e-cole o resultado
|
||
+ no seu documento.
|
||
+
|
||
+#. A interface Notebook é configurada para usar o `jsMath
|
||
+ <http://www.math.union.edu/~dpvc/jsMath/>`_ para representar
|
||
+ fórmulas matemáticas de forma clara em um web browser. O jsMath é
|
||
+ uma coleção de rotinas em JavaScript e fontes associadas.
|
||
+ Tipicamente esses fontes ficam armazenadas em um servidor e são
|
||
+ enviadas para o browser juntamente com a página onde elas estão
|
||
+ sendo usadas. No caso do Sage, o Notebook está sempre conectado a
|
||
+ um servidor usado para executar os comando do Sage, e esse servidor
|
||
+ também fornece as fontes do jsMath necessárias. Logo não é
|
||
+ necessário configurar nada mais para ter formulas matemáticas
|
||
+ representadas no seu browser quando você usa o Notebook do Sage.
|
||
+
|
||
+ O jsMath é implementado para representar um subconjunto grande,
|
||
+ mas não completo, do TeX. Ele não suporta objetos como, por
|
||
+ exemplo, tabelas complicadas e seções, e é focado para
|
||
+ representar acuradamente pequenas fórmulas em TeX. A
|
||
+ representação automática de fórmulas matemáticas no Notebook é
|
||
+ obtida convertendo a representação ``latex()`` de um objeto
|
||
+ (como descrito acima) em uma forma de HTML mais adequada ao
|
||
+ jsMath.
|
||
+
|
||
+ Como o jsMath usa as suas próprias fontes de tamanho variável,
|
||
+ ele é superior a outros métodos que convertem equações, ou
|
||
+ outros pequenos trechos de TeX, em imagens estáticas.
|
||
+
|
||
+ O jsMath muito provavelmente vai ser substituído pelo MathJAX,
|
||
+ uma tecnologia similar do mesmo autor, que possui suporte
|
||
+ extenso de editoras técnicas e sociedades profissionais.
|
||
+
|
||
+#. Na linha de comando do Sage, ou no Notebook quando o código em
|
||
+ LaTeX é complicado demais para o jsMath processar, uma
|
||
+ instalação local do LaTeX pode ser usada. O Sage inclui quase
|
||
+ tudo que você precisa para compilar e usar o Sage, mas uma
|
||
+ exceção significativa é o TeX. Então nessas situações você
|
||
+ precisa ter o TeX instalado, juntamente com algumas ferramentas
|
||
+ de conversão, para usar os recursos completos.
|
||
+
|
||
+Aqui nós demonstramos alguns usos básicos da função ``latex()``. ::
|
||
+
|
||
+ sage: var('z')
|
||
+ z
|
||
+ sage: latex(z^12)
|
||
+ z^{12}
|
||
+ sage: latex(integrate(z^4, z))
|
||
+ \frac{1}{5} \, z^{5}
|
||
+ sage: latex('a string')
|
||
+ \verb|a|\phantom{x}\verb|string|
|
||
+ sage: latex(QQ)
|
||
+ \Bold{Q}
|
||
+ sage: latex(matrix(QQ, 2, 3, [[2,4,6],[-1,-1,-1]]))
|
||
+ \left(\begin{array}{rrr}
|
||
+ 2 & 4 & 6 \\
|
||
+ -1 & -1 & -1
|
||
+ \end{array}\right)
|
||
+
|
||
+A funcionalidade básica do jsMath é em sua maior parte automática no
|
||
+Notebook, mas nós podemos demonstrar esse suporte parcialmente com a
|
||
+classe ``jsMath``. A função ``eval`` dessa classe converte um objeto
|
||
+do Sage em sua representação LaTeX e adiciona HTML que por sua vez
|
||
+evoca a classe "matemática" do CSS, a qual então emprega o jsMath. ::
|
||
+
|
||
+ sage: from sage.misc.latex import JSMath
|
||
+ sage: js = JSMath()
|
||
+ sage: var('z')
|
||
+ z
|
||
+ sage: js(z^12)
|
||
+ <html><div class="math">\newcommand{\Bold}[1]{\mathbf{#1}}z^{12}</div></html>
|
||
+ sage: js(QQ)
|
||
+ <html><div class="math">\newcommand{\Bold}[1]{\mathbf{#1}}\Bold{Q}</div></html>
|
||
+ sage: js(ZZ[x])
|
||
+ <html><div class="math">\newcommand{\Bold}[1]{\mathbf{#1}}\Bold{Z}[x]</div></html>
|
||
+ sage: js(integrate(z^4, z))
|
||
+ <html><div class="math">\newcommand{\Bold}[1]{\mathbf{#1}}\frac{1}{5} \, z^{5}</div></html>
|
||
+
|
||
+Uso Básico
|
||
+==========
|
||
+
|
||
+Como indicado acima, a forma mais simples de explorar o suporte do
|
||
+Sage para o LaTeX é usando a função ``latex()`` para criar código
|
||
+LaTeX para representar objetos matemáticos. Essas strings podem então
|
||
+ser incorporadas em documentos LaTeX. Isso funciona igualmente no
|
||
+Notebook ou na linha de comando do Sage.
|
||
+
|
||
+No outro extremo está o comando ``view()``. Na linha de comando do
|
||
+Sage o comando ``view(foo)`` irá criar a representação em LaTeX de
|
||
+``foo``, incorporar isso em um documento simples em LaTeX, e então
|
||
+processar o documento usando o LaTeX em seu sistema. Por fim, o
|
||
+visualizador apropriado será aberto para apresentar o documento
|
||
+gerado. Qual versão do TeX é usada, e portanto as opções para a saída
|
||
+e visualizador, podem ser personalizados (veja
|
||
+:ref:`sec-custom-processing`).
|
||
+
|
||
+No Notebook, o comando ``view(foo)`` cria uma combinação apropriada de
|
||
+HTML e CSS para que o jsMath mostre a representação em LaTeX na folha
|
||
+de trabalho. Para o usuário, ele simplesmente cria uma versão
|
||
+cuidadosamente formatada do resultado, distinta da saída padrão em
|
||
+modo texto do Sage. Nem todo objeto no Sage possui uma representação
|
||
+em LaTeX adequada às capacidades limitadas do jsMath. Nesses casos, a
|
||
+interpretação pelo jsMath pode ser deixada de lado, e com isso o LaTeX
|
||
+do sistema é chamado, e o resultado dessa chamada é convertido em uma
|
||
+imagem que é inserida na folha de trabalho. Como alterar e controlar
|
||
+esse processo é discutido abaixo na seção
|
||
+:ref:`sec-custom-generation`.
|
||
+
|
||
+O comando interno ``pretty_print()`` ilustra a conversão de objetos do
|
||
+Sage para HTML que emprega o jsMath no Notebook. ::
|
||
+
|
||
+ sage: from sage.misc.latex import pretty_print
|
||
+ sage: pretty_print(x^12)
|
||
+ <html><span class="math">\newcommand{\Bold}[1]{\mathbf{#1}}x^{12}</span></html>
|
||
+ sage: pretty_print(integrate(sin(x), x))
|
||
+ <html><span class="math">\newcommand{\Bold}[1]{\mathbf{#1}}-\cos\left(x\right)</span></html>
|
||
+
|
||
+O Notebook tem outros dois recursos para empregar o TeX. O primeiro é
|
||
+o botão "Typeset" bem acima da primeira célula da folha de trabalho, à
|
||
+direita dos quatro menus de opções. Quando selecionado, o resultado de
|
||
+qualquer cálculo vai ser interpretado pelo jsMath. Note que esse
|
||
+efeito não é retroativo -- células calculadas anteriormente precisam
|
||
+ser recalculadas para ter o resultado representado pelo jsMath.
|
||
+Essencialmente, selecionar o botão "Typeset" é equivalente a aplicar o
|
||
+comando ``view()`` ao resultado de cada célula.
|
||
+
|
||
+Um segundo recurso disponível no Notebook é possibilidade de inserir
|
||
+código TeX para fazer anotações na folha de trabalho. Quando o cursos
|
||
+esta posicionado entre células de modo que uma barra azul fica
|
||
+visível, então shift-click irá abrir um mini processador de texto,
|
||
+TinyMCE. Isso permite digitar texto, usando um editor WSISYG para
|
||
+criar HTML e CSS. Logo é possível inserir texto formatado para
|
||
+complementar a folha de trabalho. Todavia, texto entre símbolos $, ou
|
||
+$$, é interpretado pelo jsMath como "inline" ou "display math"
|
||
+espectivamente.
|
||
+
|
||
+.. _sec-custom-generation:
|
||
+
|
||
+Personalizando a Criação de Código LaTeX
|
||
+========================================
|
||
+
|
||
+Exitem várias formas de personalizar o código LaTeX gerado pelo
|
||
+comando ``latex()``. No Notebook e na linha de comando existe um
|
||
+objeto pré-definido chamado ``latex`` que possui diversos métodos, os
|
||
+quais você pode listar digitando ``latex.``, seguido da tecla tab
|
||
+(note a presença do ponto).
|
||
+
|
||
+Um bom exemplo é o método ``latex.matrix_delimiters``. Ele pode ser
|
||
+usado para alterar a notação de matrizes -- parênteses grandes,
|
||
+colchetes, barras verticais. Nenhuma noção de estilo é enfatizada,
|
||
+você pode configurar como desejado. Observe como as barras invertidas
|
||
+usadas em LaTeX requerem uma barra adicional de modo que elas possam
|
||
+ser interpretadas (escaped) corretamente em uma string do Python. ::
|
||
+
|
||
+ sage: A = matrix(ZZ, 2, 2, range(4))
|
||
+ sage: latex(A)
|
||
+ \left(\begin{array}{rr}
|
||
+ 0 & 1 \\
|
||
+ 2 & 3
|
||
+ \end{array}\right)
|
||
+ sage: latex.matrix_delimiters(left='[', right=']')
|
||
+ sage: latex(A)
|
||
+ \left[\begin{array}{rr}
|
||
+ 0 & 1 \\
|
||
+ 2 & 3
|
||
+ \end{array}\right]
|
||
+ sage: latex.matrix_delimiters(left='\\{', right='\\}')
|
||
+ sage: latex(A)
|
||
+ \left\{\begin{array}{rr}
|
||
+ 0 & 1 \\
|
||
+ 2 & 3
|
||
+ \end{array}\right\}
|
||
+
|
||
+O método ``latex.vector_delimiters`` funciona de forma similar.
|
||
+
|
||
+A forma como anéis e corpos comuns podem ser representados pode ser
|
||
+controlada pelo método ``latex.blackboard_bold``. Esses conjuntos são
|
||
+representados por padrão em negrito, mas podem opcionalmente ser
|
||
+escritos em letras duplas como é comum em trabalhos escritos. Isso é
|
||
+obtido redefinindo a macro ``\Bold{}`` que faz parte do Sage. ::
|
||
+
|
||
+ sage: latex(QQ)
|
||
+ \Bold{Q}
|
||
+ sage: from sage.misc.latex import JSMath
|
||
+ sage: js=JSMath()
|
||
+ sage: js(QQ)
|
||
+ <html><div class="math">\newcommand{\Bold}[1]{\mathbf{#1}}\Bold{Q}</div></html>
|
||
+ sage: latex.blackboard_bold(True)
|
||
+ sage: js(QQ)
|
||
+ <html><div class="math">\newcommand{\Bold}[1]{\mathbb{#1}}\Bold{Q}</div></html>
|
||
+ sage: latex.blackboard_bold(False)
|
||
+
|
||
+É possível aproveitar os recursos do TeX adicionando novas macros e
|
||
+novos pacotes. Primeiro, macros individuais podem ser adicionadas para
|
||
+serem usadas quando o jsMath interpreta pequenos trechos de códigos
|
||
+TeX no Notebook. ::
|
||
+
|
||
+ sage: latex.extra_macros()
|
||
+ ''
|
||
+ sage: latex.add_macro("\\newcommand{\\foo}{bar}")
|
||
+ sage: latex.extra_macros()
|
||
+ '\\newcommand{\\foo}{bar}'
|
||
+ sage: var('x y')
|
||
+ (x, y)
|
||
+ sage: latex(x+y)
|
||
+ x + y
|
||
+ sage: from sage.misc.latex import JSMath
|
||
+ sage: js=JSMath()
|
||
+ sage: js(x+y)
|
||
+ <html><div class="math">\newcommand{\Bold}[1]{\mathbf{#1}}\newcommand{\foo}{bar}x + y</div></html>
|
||
+
|
||
+Macros adicionais usadas dessa forma serão também usadas eventualmente
|
||
+se a versão do TeX no seu sistema for usada para lidar com algo muito
|
||
+complicado para o jsMath. O comando ``latex_extra_preamble`` é usado
|
||
+para construir o preambulo de um documento completo em LaTeX.
|
||
+Ilustramos a seguir como fazer isso. Novamente note a necessidade de
|
||
+barras invertidas duplas nas strings do Python. ::
|
||
+
|
||
+
|
||
+ sage: latex.extra_macros('')
|
||
+ sage: latex.extra_preamble('')
|
||
+ sage: from sage.misc.latex import latex_extra_preamble
|
||
+ sage: print latex_extra_preamble()
|
||
+ \newcommand{\ZZ}{\Bold{Z}}
|
||
+ ...
|
||
+ \newcommand{\Bold}[1]{\mathbf{#1}}
|
||
+ sage: latex.add_macro("\\newcommand{\\foo}{bar}")
|
||
+ sage: print latex_extra_preamble()
|
||
+ \newcommand{\ZZ}{\Bold{Z}}
|
||
+ ...
|
||
+ \newcommand{\Bold}[1]{\mathbf{#1}}
|
||
+ \newcommand{\foo}{bar}
|
||
+
|
||
+Novamente, para expressões grandes ou mais complicadas do LaTeX, é
|
||
+possível adicionar pacotes (ou qualquer outra coisa) ao preambulo do
|
||
+arquivo LaTeX. Qualquer coisa pode ser incorporada no preambulo com o
|
||
+comando ``latex.add_to_preamble``, e o comando mais especializado
|
||
+``latex.add_package_to_preamble_if_available`` irá primeiro verificar
|
||
+se certo pacote está realmente disponível antes de adicioná-lo ao
|
||
+preambulo
|
||
+
|
||
+Agora adicionamos o pacote geometry ao preambulo e usamos ele para
|
||
+definir o tamanho da região na página que o TeX vai usar
|
||
+(efetivamente definido as margens). Novamente, observe a necessidade
|
||
+de barras duplas nas strings do Python. ::
|
||
+
|
||
+
|
||
+ sage: from sage.misc.latex import latex_extra_preamble
|
||
+ sage: latex.extra_macros('')
|
||
+ sage: latex.extra_preamble('')
|
||
+ sage: latex.add_to_preamble('\\usepackage{geometry}')
|
||
+ sage: latex.add_to_preamble('\\geometry{letterpaper,total={8in,10in}}')
|
||
+ sage: latex.extra_preamble()
|
||
+ '\\usepackage{geometry}\\geometry{letterpaper,total={8in,10in}}'
|
||
+ sage: print latex_extra_preamble()
|
||
+ \usepackage{geometry}\geometry{letterpaper,total={8in,10in}}
|
||
+ \newcommand{\ZZ}{\Bold{Z}}
|
||
+ ...
|
||
+ \newcommand{\Bold}[1]{\mathbf{#1}}
|
||
+
|
||
+Um pacote pode ser adicionado juntamente com a verificação de sua
|
||
+existência, da seguinte forma. Como um exemplo, nós ilustramos uma
|
||
+tentativa de adicionar ao preambulo um pacote que supostamente não
|
||
+existe. ::
|
||
+
|
||
+ sage: latex.extra_preamble('')
|
||
+ sage: latex.extra_preamble()
|
||
+ ''
|
||
+ sage: latex.add_to_preamble('\\usepackage{foo-bar-unchecked}')
|
||
+ sage: latex.extra_preamble()
|
||
+ '\\usepackage{foo-bar-unchecked}'
|
||
+ sage: latex.add_package_to_preamble_if_available('foo-bar-checked')
|
||
+ sage: latex.extra_preamble()
|
||
+ '\\usepackage{foo-bar-unchecked}'
|
||
+
|
||
+.. _sec-custom-processing:
|
||
+
|
||
+Personalizando o Processamento em LaTeX
|
||
+=======================================
|
||
+
|
||
+É também possível controlar qual variação do TeX é usada quando a
|
||
+versão do sistema for evocada, logo influenciando também o resultado.
|
||
+De forma similar, é também possível controlar quando o Notebook irá
|
||
+usar o jsMath (trechos simples em TeX) ou a versão do TeX do sistema
|
||
+(expressões mais complicadas).
|
||
+
|
||
+O comando ``latex.engine()`` pode ser usado para controlar de os
|
||
+executáveis ``latex``, ``pdflatex`` ou ``xelatex`` do sistema são
|
||
+usados para processar expressões mais complicadas. Quando ``view()`` é
|
||
+chamado na linha de comando do Sage e o processador é definido como
|
||
+``latex``, um arquivo dvi é produzido e o Sage vai usar um
|
||
+visualizador de dvi (como o xdvi) para apresentar o resultado. Por
|
||
+outro lado, usando ``view()`` na linha de comando do Sage, quando o
|
||
+processador é definido como ``pdflatex``, irá produzir um PDF e o Sage vai
|
||
+executar o programa disponível no seu sistema para visualizar arquivos
|
||
+PDF (acrobat, okular, evince, etc.).
|
||
+
|
||
+No Notebook, é necessário interver na decisão de se o jsMath vai
|
||
+interpretar trechos em TeX, ou se o LaTeX do sistema deve fazer o
|
||
+trabalho se o código em LaTeX for complicado demais. O dispositivo é
|
||
+uma lista de strings, que se forem encontradas em um trecho de código
|
||
+LaTeX sinalizam para o Notebook usar o LaTeX (ou qualquer executável
|
||
+que for definido pelo comando ``latex.engine()``). Essa lista é
|
||
+gerenciada pelos comandos ``latex.add_to_jsmath_avoid_list`` e
|
||
+``latex.jsmath_avoid_list``. ::
|
||
+
|
||
+ sage: latex.jsmath_avoid_list([])
|
||
+ sage: latex.jsmath_avoid_list()
|
||
+ []
|
||
+ sage: latex.jsmath_avoid_list(['foo', 'bar'])
|
||
+ sage: latex.jsmath_avoid_list()
|
||
+ ['foo', 'bar']
|
||
+ sage: latex.add_to_jsmath_avoid_list('tikzpicture')
|
||
+ sage: latex.jsmath_avoid_list()
|
||
+ ['foo', 'bar', 'tikzpicture']
|
||
+ sage: latex.jsmath_avoid_list([])
|
||
+ sage: latex.jsmath_avoid_list()
|
||
+ []
|
||
+
|
||
+Suponha que uma expressão em LaTeX é produzida no Notebook com o
|
||
+comando ``view()`` ou enquanto o botão "Typeset" está selecionado, e
|
||
+então reconhecida, através da "lista de comandos a serem evitados no
|
||
+jsMath", como necessitando a versão do LaTeX no sistema. Então o
|
||
+executável selecionado (como especificado por ``latex.engine()``) irá
|
||
+processar o código em LaTeX. Todavia, em vez de então abrir um
|
||
+visualizador externo (o que é o comportamento na linha de comando), o
|
||
+Sage irá tentar converter o resultado em uma imagem, que então é
|
||
+inserida na folha de trabalho como o resultado da célula.
|
||
+
|
||
+Exatamente como essa conversão é feita depende de vários fatores --
|
||
+qual executável você especificou como processador e quais utilitários
|
||
+de conversão estão disponíveis no seu sistema. Quatro conversores
|
||
+usuais que irão cobrir todas as ocorrências são o ``dvips``,
|
||
+``ps2pdf``, e ``dvipng``, e do pacote ``ImageMagick``, o ``convert``.
|
||
+O objetivo é produzir um arquivo PNG para ser inserido de volta na
|
||
+folha de trabalho. Quando uma expressão em LaTeX pode ser convertida
|
||
+com sucesso em um arquivo dvi pelo processador LaTeX, então o dvipng
|
||
+deve dar conta da conversão. Se a expressão em LaTeX e o processador
|
||
+especificado criarem um arquivo dvi com conteúdo especial que o dvipng
|
||
+não pode converter, então o dvips vai criar um arquivo PostScript.
|
||
+Esse arquivo PostScript, ou um PDF criado por pelo processador
|
||
+``pdflatex``, é então convertido em um arquivo dvi pelo programa
|
||
+``convert``. A presença de dois desses conversores pode ser testado
|
||
+com as rotinas ``have_dvipng()`` e ``have_convert()``.
|
||
+
|
||
+Essas conversões são feitas automaticamente se você tiver os
|
||
+conversores necessários instalados; se não, então uma mensagem de erro
|
||
+é impressa dizendo o que está faltando e onde obter.
|
||
+
|
||
+Para um exemplo concreto de como expressões complicadas em LaTeX podem
|
||
+ser processadas, veja o exemplo na próxima seção
|
||
+(:ref:`sec-tkz-graph`) para usar o pacote ``tkz-graph`` para produzir
|
||
+ilustrações de grafos combinatoriais de alta qualidade. Para outros
|
||
+exemplos, existem alguns casos teste incluídos no Sage. Para usá-los,
|
||
+é necessário importar o objeto ``sage.misc.latex.latex_examples``, que
|
||
+é uma instância da classe ``sage.misc.latex.LatexExamples``, como
|
||
+mostrado abaixo. Essa classe possui exemplos de diagramas comutativos,
|
||
+grafos combinatoriais, teoria de nós e pstricks, os quais
|
||
+respectivamente testam os seguintes pacotes: xy, tkz-graph, xypic,
|
||
+pstricks. Após importar o objeto, use completamento tab em
|
||
+``latex_examples`` para ver os exemplos disponíveis. Ao carregar um
|
||
+exemplo você irá obter explicações sobre o que é necessário para fazer
|
||
+o conteúdo do exemplo ser exibido corretamente. Para de fato ver os
|
||
+exemplos, é necessário usar ``view()`` (uma vez que o preambulo,
|
||
+processador, etc. estão configurados corretamente).
|
||
+
|
||
+::
|
||
+
|
||
+ sage: from sage.misc.latex import latex_examples
|
||
+ sage: latex_examples.diagram()
|
||
+ LaTeX example for testing display of a commutative diagram produced
|
||
+ by xypic.
|
||
+ <BLANKLINE>
|
||
+ To use, try to view this object -- it won't work. Now try
|
||
+ 'latex.add_to_preamble("\\usepackage[matrix,arrow,curve,cmtip]{xy}")',
|
||
+ and try viewing again -- it should work in the command line but not
|
||
+ from the notebook. In the notebook, run
|
||
+ 'latex.add_to_jsmath_avoid_list("xymatrix")' and try again -- you
|
||
+ should get a picture (a part of the diagram arising from a filtered
|
||
+ chain complex).
|
||
+
|
||
+.. _sec-tkz-graph:
|
||
+
|
||
+Exemplo: Grafos Combinatoriais com tkz-graph
|
||
+============================================
|
||
+
|
||
+Ilustrações de alta qualidade de grafos combinatoriais (daqui por
|
||
+diante, simplesmente grafos) são possíveis com o pacote ``tkz-graph``.
|
||
+Esse pacote baseia-se no ``tikz`` front-end da biblioteca ``pgf``.
|
||
+Logo todos esses componentes precisam ser parte de uma instalação
|
||
+completa do LaTeX em seu sistema, e pode acontecer que alguns desses
|
||
+componentes não estejam em sua versão mais recente em algumas
|
||
+distribuições do TeX. Logo, para melhores resultados, seria necessário
|
||
+ou recomendável instalar esses pacotes como parte do seu diretório
|
||
+texmf pessoal. Criar, manter e personalizar uma instalação do TeX no
|
||
+sistema ou em um diretório pessoal vai além do escopo deste documento,
|
||
+mas deve ser fácil encontrar instruções para isso. Os arquivos
|
||
+necessários estão listados em :ref:`sec-system-wide-tex`.
|
||
+
|
||
+Portanto, para começar precisamos nos certificar que os pacotes
|
||
+relevantes estão incluídos adicionando-os ao preambulo do eventual
|
||
+documento LaTeX. As imagens dos grafos não são formadas corretamente
|
||
+quando um arquivo dvi é usando como formato intermediário, logo é
|
||
+melhor definir o processador do LaTeX como ``pdflatex``. A esta altura
|
||
+um comando como ``view(graphs.CompleteGraph(4))`` deve funcionar na
|
||
+linha de comando do Sage e produzir um PDF com a imagem completa do
|
||
+grafo `K_4`.
|
||
+
|
||
+Para uma experiência semelhante no Notebook, é necessário desabilitar
|
||
+o processador jsMath para o código LaTeX do grafo usando a "lista de
|
||
+comandos a serem evitados pelo jsMath". Grafos são criados usando o
|
||
+environment ``tikzpicture``, logo essa uma boa escolha para uma string
|
||
+a ser incluída na lista que acabamos de mencionar. Agora,
|
||
+``view(graphs.CompleteGraph(4))`` em uma folha de trabalho deve
|
||
+executar o pdflatex para criar um PDF e então o programa ``convert``
|
||
+para obter um gráfico PNG que vai ser inserido na folha de trabalho.
|
||
+Os seguintes comandos ilustram os passos para obter grafos processados
|
||
+pelo LaTeX no Notebook. ::
|
||
+
|
||
+ sage: from sage.graphs.graph_latex import setup_latex_preamble
|
||
+ sage: setup_latex_preamble()
|
||
+ sage: latex.extra_preamble() # random - depends on system's TeX installation
|
||
+ '\\usepackage{tikz}\n\\usepackage{tkz-graph}\n\\usepackage{tkz-berge}\n'
|
||
+ sage: latex.engine('pdflatex')
|
||
+ sage: latex.add_to_jsmath_avoid_list('tikzpicture')
|
||
+ sage: latex.jsmath_avoid_list()
|
||
+ ['tikzpicture']
|
||
+
|
||
+Agora, um comando como ``view(graphs.CompleteGraph(4))`` deve produzir
|
||
+um gráfico do grafo no Notebook, tendo usado ``pdflatex`` para
|
||
+processar os comandos do ``tkz-graph`` para construir o grafo. Note
|
||
+que há diversas opções que afetam o resultado do gráfico obtido usando
|
||
+o LaTeX via ``tkz-graph``, o que mais uma vez está além do escopo
|
||
+desta seção (veja a seção do Manual de Referência com título "Opções
|
||
+do LaTeX para Grafos" para instruções e detalhes).
|
||
+
|
||
+.. _sec-system-wide-tex:
|
||
+
|
||
+Uma Instalação Completa do TeX
|
||
+==============================
|
||
+Vários dos recursos avançados de integração do TeX com o Sage requerem
|
||
+uma instalação do TeX em seu sistema. Várias versões do Linux possuem
|
||
+pacotes do TeX baseados no TeX-live, para o OSX existe o TeXshop e
|
||
+para o windows existe o MikTex. O utilitário ``convert`` é parte do
|
||
+`ImageMagick <http://www.imagemagick.org/>`_ (que deve ser um pacote
|
||
+na sua versão do Linux ou ser fácil de instalar), e os três programas
|
||
+``dvipng``, ``ps2pdf``, e ``dvips`` podem estar incluídos na sua
|
||
+distribuição do TeX. Os dois primeiros podem também ser obtidos em,
|
||
+respectivamente, http://sourceforge.net/projects/dvipng/ e como parte
|
||
+do `Ghostscript <http://www.ghostscript.com/>`_.
|
||
+
|
||
+A criação de grafos combinatoriais requer uma versão recente da
|
||
+biblioteca PGF, e os arquivos ``tkz-graph.sty``, ``tkz-arith.sty`` e
|
||
+talvez ``tkz-berge.sty``, que estão disponíveis em `Altermundus site
|
||
+<http://altermundus.com/pages/graph.html>`_.
|
||
+
|
||
+Programas Externos
|
||
+==================
|
||
+
|
||
+Existem três programas disponíveis para integrar ainda mais o TeX e o
|
||
+Sage. O primeiro é o sagetex. Uma descrição concisa do sagetex é que
|
||
+ele é uma coleção de macros do TeX que permitem incluir em um
|
||
+documento LaTeX instruções para usar o Sage para calcular vários
|
||
+objetos, e/ou formatar objetos usando o comando ``latex()`` existente
|
||
+no Sage. Logo, como um passo intermediário para compilar um documento
|
||
+LaTeX, todos os recursos computacionais e de formatação do Sage podem
|
||
+ser executados automaticamente. Como um exemplo, um exame matemático
|
||
+pode manter uma correspondência entre questões e respostas usando o
|
||
+sagetex para fazer cálculos com o Sage. Veja :ref:`sec-sagetex` para
|
||
+mais informações.
|
||
+
|
||
+O tex2sws começa com um documento LaTeX, mas define environments
|
||
+adicionais para inserir código em Sage. Quando processado com as
|
||
+ferramentas adequadas, o resultado é uma folha de trabalho do Sage,
|
||
+com conteúdo apropriadamente formatado para o jsMath e com código em
|
||
+Sage incorporado como células de entrada. Então um livro texto ou
|
||
+artigo pode ser criado em LaTeX, ter blocos de código em Sage
|
||
+incluídos, e o documento todo pode ser transformado em uma folha de
|
||
+trabalho do Sage onde o texto matemático é bem formatado e os blocos
|
||
+de código em Sage podem ser facilmente executados. Atualmente em
|
||
+desenvolvimento, veja `tex2sws @ BitBucket
|
||
+<http://bitbucket.org/rbeezer/tex2sws/>`_ para mais informações.
|
||
+
|
||
+O sws2tex reverte o processo partindo de uma folha de trabalho do Sage
|
||
+e convertendo o conteúdo para LaTeX para ser posteriormente processado
|
||
+com as ferramentas disponíveis para documentos em LaTeX. Atualmente em
|
||
+desenvolvimento, veja `sws2tex @ BitBucket
|
||
+<http://bitbucket.org/whuss/sws2tex/>`_ para mais informações.
|
||
diff --git a/doc/pt/tutorial/programming.rst b/doc/pt/tutorial/programming.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/programming.rst
|
||
@@ -0,0 +1,850 @@
|
||
+***********
|
||
+Programação
|
||
+***********
|
||
+
|
||
+.. _section-loadattach:
|
||
+
|
||
+Carregando e Anexando Arquivos do Sage
|
||
+======================================
|
||
+
|
||
+A seguir ilustramos como carregar no Sage programas escritos em um
|
||
+arquivo separado. Crie um arquivo chamado ``example.sage`` com o
|
||
+seguinte conteúdo:
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ print "Hello World"
|
||
+ print 2^3
|
||
+
|
||
+Você pode ler e executar o arquivo ``example.sage`` usando o comando
|
||
+``load``.
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: load "example.sage"
|
||
+ Hello World
|
||
+ 8
|
||
+
|
||
+Você também pode anexar um arquivo em Sage à sessão em execução usando
|
||
+o comando ``attach``.
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: attach "example.sage"
|
||
+ Hello World
|
||
+ 8
|
||
+
|
||
+Agora se você alterar ``example.sage`` e adicionar uma linha em branco
|
||
+(por exemplo), então o conteúdo de ``example.sage`` será
|
||
+automaticamente recarregado no Sage.
|
||
+
|
||
+Em particular, ``attach`` automaticamente recarrega um arquivo toda
|
||
+vez que ele for modificado, o que é útil para desenvolver e testar um
|
||
+programa, enquanto ``load`` carrega o arquivo apenas uma vez.
|
||
+
|
||
+Quando o Sage carrega ``example.sage`` ele converte esse arquivo para
|
||
+o Python, o qual é então executado pelo interpretador do Python. Essa
|
||
+conversão é mínima; ela essencialmente consiste em encapsular inteiros
|
||
+em ``Integer()``, números float em ``RealNumber()``, substituir ``^``
|
||
+por ``**``, e substituir, por exemplo, ``R.2`` por ``R.gen(2)``. A
|
||
+versão convertida de ``example.sage`` é armazenada no mesmo diretório
|
||
+de ``example.sage`` e é chamada ``example.sage.py``. Esse arquivo
|
||
+contém o seguinte código:
|
||
+
|
||
+::
|
||
+
|
||
+ print "Hello World"
|
||
+ print Integer(2)**Integer(3)
|
||
+
|
||
+Inteiros literais são encapsulados e ``^`` é substituído por ``**``.
|
||
+(Em Python, ``^`` significa "ou exclusivo" e ``**`` significa
|
||
+"exponenciação".)
|
||
+
|
||
+Esse "preparsing" está implementado em ``sage/misc/interpreter.py``.)
|
||
+
|
||
+Você pode colar código tabulado com muitas linhas no Sage desde que
|
||
+existam linhas em branco separando blocos de código (isso não é
|
||
+necessário em arquivos). Todavia, a melhor forma de adicionar tal
|
||
+código a uma sessão do Sage é salvá-lo em um arquivo e usar
|
||
+``attach``, como descrito anteriormente.
|
||
+
|
||
+
|
||
+.. _section-compile:
|
||
+
|
||
+Criando Código Compilado
|
||
+========================
|
||
+
|
||
+Velocidade é crucial em cálculos matemáticos. Embora o Python seja uma
|
||
+linguagem conveniente de alto nível, certos cálculos podem ser várias
|
||
+vezes mais rápidos do que em Python se eles forem implementados usando
|
||
+tipos estáticos em uma linguagem compilada. Alguns aspectos do Sage
|
||
+seriam muito lentos se eles fossem escritos inteiramente em Python.
|
||
+Para lidar com isso, o Sage suporta uma "versão" compilada do Python
|
||
+chamada Cython ([Cyt]_ and [Pyr]_). O Cython é simultaneamente similar
|
||
+ao Python e ao C. A maior parte das construções em Python, incluindo
|
||
+"list comprehensions", expressões condicionais, código como ``+=`` são
|
||
+permitidos; você também pode importar código que você escreveu em
|
||
+outros módulos em Python. Além disso, você pode declarar variáveis em
|
||
+C arbitrárias, e qualquer chamada de bibliotecas em C pode ser feita
|
||
+diretamente. O código resultante é convertido para C e compilado
|
||
+usando um compilador para C.
|
||
+
|
||
+Para criar o seu próprio código compilado em Sage, nomeie o arquivo
|
||
+com uma extensão ``.spyx`` (em vez de ``.sage``). Se você está
|
||
+trabalhando na linha de comando, você pode anexar e carregar código
|
||
+compilado exatamente como se faz com código interpretado (no momento,
|
||
+anexar e carregar código em Cython não é suportado no Notebook). A
|
||
+compilação é realizada implicitamente sem que você tenha que fazer
|
||
+qualquer coisa explicitamente. Veja
|
||
+``$SAGE_ROOT/examples/programming/sagex/factorial.spyx`` para um
|
||
+exemplo de uma implementação compilada para a função fatorial que usa
|
||
+diretamente a biblioteca GMP em C. Experimente o seguinte, usando cd,
|
||
+vá para o diretório ``$SAGE_ROOT/examples/programming/sagex/``, e
|
||
+então faça o seguinte:
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: load "factorial.spyx"
|
||
+ ***************************************************
|
||
+ Recompiling factorial.spyx
|
||
+ ***************************************************
|
||
+ sage: factorial(50)
|
||
+ 30414093201713378043612608166064768844377641568960512000000000000L
|
||
+ sage: time n = factorial(10000)
|
||
+ CPU times: user 0.03 s, sys: 0.00 s, total: 0.03 s
|
||
+ Wall time: 0.03
|
||
+
|
||
+Aqui o sufixo L indica um "long integer" do Python (veja
|
||
+:ref:`section-mathannoy`).
|
||
+
|
||
+Note que o Sage vai recompilar ``factorial.spyx`` se você encerrar e
|
||
+reiniciar o Sage. A biblioteca compilada e compartilhada é armazenada
|
||
+em ``$HOME/.sage/temp/hostname/pid/spyx``. Esses arquivos são
|
||
+excluídos quando você encerra o Sage.
|
||
+
|
||
+Nenhum pré-processador (preparsing) é aplicado em arquivos spyx, por
|
||
+exemplo, ``1/3`` vai resultar em 0 em um arquivo spyx em vez do número
|
||
+racional :math:`1/3`. Se ``foo`` é uma função da biblioteca Sage, para
|
||
+usá-la em um arquivo spyx importe ``sage.all`` e use ``sage.all.foo``.
|
||
+
|
||
+::
|
||
+
|
||
+ import sage.all
|
||
+ def foo(n):
|
||
+ return sage.all.factorial(n)
|
||
+
|
||
+Acessando Funções em C em Arquivos Separados
|
||
+--------------------------------------------
|
||
+
|
||
+É fácil também acessar funções em C definidas em arquivos \*.c
|
||
+separados. Aqui vai um exemplo. Crie os arquivos ``test.c`` e
|
||
+``test.spyx`` no mesmo diretório contendo:
|
||
+
|
||
+Código C puro: ``test.c``
|
||
+
|
||
+::
|
||
+
|
||
+ int add_one(int n) {
|
||
+ return n + 1;
|
||
+ }
|
||
+
|
||
+Código Cython: ``test.spyx``:
|
||
+
|
||
+::
|
||
+
|
||
+ cdef extern from "test.c":
|
||
+ int add_one(int n)
|
||
+
|
||
+ def test(n):
|
||
+ return add_one(n)
|
||
+
|
||
+Então o seguinte funciona:
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: attach "test.spyx"
|
||
+ Compiling (...)/test.spyx...
|
||
+ sage: test(10)
|
||
+ 11
|
||
+
|
||
+Se uma biblioteca ``foo`` adicional é necessária para compilar código
|
||
+em C gerado a partir de um arquivo em Cython, adicione a linha ``clib
|
||
+foo`` no arquivo fonte em Cython. De forma similar, um arquivo em C
|
||
+adicional ``bar`` pode ser incluído na compilação declarando ``cfile
|
||
+bar``.
|
||
+
|
||
+.. _section-standalone:
|
||
+
|
||
+Scripts Independentes em Python/Sage
|
||
+====================================
|
||
+
|
||
+O seguinte script em Sage fatora inteiros, polinômios, etc:
|
||
+
|
||
+::
|
||
+
|
||
+ #!/usr/bin/env sage -python
|
||
+
|
||
+ import sys
|
||
+ from sage.all import *
|
||
+
|
||
+ if len(sys.argv) != 2:
|
||
+ print "Usage: %s <n>"%sys.argv[0]
|
||
+ print "Outputs the prime factorization of n."
|
||
+ sys.exit(1)
|
||
+
|
||
+ print factor(sage_eval(sys.argv[1]))
|
||
+
|
||
+Para usar esse script, sua ``SAGE_ROOT`` precisa estar na sua variável
|
||
+PATH. Se o script acima for chamado ``factor``, aqui está um exemplo
|
||
+de como usá-lo:
|
||
+
|
||
+::
|
||
+
|
||
+ bash $ ./factor 2006
|
||
+ 2 * 17 * 59
|
||
+ bash $ ./factor "32*x^5-1"
|
||
+ (2*x - 1) * (16*x^4 + 8*x^3 + 4*x^2 + 2*x + 1)
|
||
+
|
||
+Tipo de Dados
|
||
+=============
|
||
+
|
||
+Cada objeto em Sage possui um tipo bem definido. O Python possui
|
||
+diversos tipos de dados, e a biblioteca do Sage adiciona ainda mais.
|
||
+Os tipos de dados de Python incluem strings, listas, tuplas, inteiros
|
||
+e floats, como ilustrado:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: s = "sage"; type(s)
|
||
+ <type 'str'>
|
||
+ sage: s = 'sage'; type(s) # you can use either single or double quotes
|
||
+ <type 'str'>
|
||
+ sage: s = [1,2,3,4]; type(s)
|
||
+ <type 'list'>
|
||
+ sage: s = (1,2,3,4); type(s)
|
||
+ <type 'tuple'>
|
||
+ sage: s = int(2006); type(s)
|
||
+ <type 'int'>
|
||
+ sage: s = float(2006); type(s)
|
||
+ <type 'float'>
|
||
+
|
||
+Além disso, o Sage acrescenta vários outros tipos. Por exemplo,
|
||
+espaços vetoriais:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: V = VectorSpace(QQ, 1000000); V
|
||
+ Vector space of dimension 1000000 over Rational Field
|
||
+ sage: type(V)
|
||
+ <class 'sage.modules.free_module.FreeModule_ambient_field_with_category'>
|
||
+
|
||
+Apenas certas funções podem ser aplicadas sobre ``V``. Em outros
|
||
+softwares de matemática, essas seriam chamadas usando a notação
|
||
+"funcional" ``foo(V,...)``. Em Sage, algumas funções estão anexadas ao
|
||
+tipo (ou classe) de ``V``, e são chamadas usando uma sintaxe orientada
|
||
+a objetos como em Java ou C++, por exemplo, ``V.foo()``. Isso ajuda a
|
||
+manter o espaço de variáveis global sem milhares de funções, e permite
|
||
+que várias funções diferentes com comportamento diferente possam ser
|
||
+chamadas foo, sem a necessidade de usar um mecanismo de identificação
|
||
+de tipos (ou casos) para decidir qual chamar. Além disso, se você
|
||
+reutilizar o nome de uma função, essa função continua ainda disponível
|
||
+(por exemplo, se você chamar algo ``zeta``, e então quiser calcular o
|
||
+valor da função zeta de Riemann em 0.5, você continua podendo digitar
|
||
+``s=.5; s.zeta()``).
|
||
+
|
||
+::
|
||
+
|
||
+ sage: zeta = -1
|
||
+ sage: s=.5; s.zeta()
|
||
+ -1.46035450880959
|
||
+
|
||
+Em alguns casos muito comuns, a notação funcional usual é também
|
||
+suportada por conveniência e porque expressões matemáticas podem
|
||
+parecer confusas usando a notação orientada a objetos. Aqui vão alguns
|
||
+exemplos.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: n = 2; n.sqrt()
|
||
+ sqrt(2)
|
||
+ sage: sqrt(2)
|
||
+ sqrt(2)
|
||
+ sage: V = VectorSpace(QQ,2)
|
||
+ sage: V.basis()
|
||
+ [
|
||
+ (1, 0),
|
||
+ (0, 1)
|
||
+ ]
|
||
+ sage: basis(V)
|
||
+ [
|
||
+ (1, 0),
|
||
+ (0, 1)
|
||
+ ]
|
||
+ sage: M = MatrixSpace(GF(7), 2); M
|
||
+ Full MatrixSpace of 2 by 2 dense matrices over Finite Field of size 7
|
||
+ sage: A = M([1,2,3,4]); A
|
||
+ [1 2]
|
||
+ [3 4]
|
||
+ sage: A.charpoly('x')
|
||
+ x^2 + 2*x + 5
|
||
+ sage: charpoly(A, 'x')
|
||
+ x^2 + 2*x + 5
|
||
+
|
||
+Para listar todas as funções para :math:`A`, use completamento tab.
|
||
+Simplesmente digite ``A.``, então tecle ``[tab]`` no seu teclado, como
|
||
+descrito em :ref:`section-tabcompletion`.
|
||
+
|
||
+Listas, Tuplas e Sequências
|
||
+===========================
|
||
+
|
||
+O tipo de dados lista armazena elementos de um tipo arbitrário. Como
|
||
+em C, C++, etc. (mas diferentemente da maioria dos sistemas de álgebra
|
||
+computacional), os elementos da lista são indexados a partir do
|
||
+:math:`0`:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: v = [2, 3, 5, 'x', SymmetricGroup(3)]; v
|
||
+ [2, 3, 5, 'x', Symmetric group of order 3! as a permutation group]
|
||
+ sage: type(v)
|
||
+ <type 'list'>
|
||
+ sage: v[0]
|
||
+ 2
|
||
+ sage: v[2]
|
||
+ 5
|
||
+
|
||
+(Quando se indexa uma lista, é permitido que o índice não seja um int
|
||
+do Python!) Um Inteiro do Sage (ou Racional, ou qualquer objeto que
|
||
+possua um método ``__index__``) também ira funcionar.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: v = [1,2,3]
|
||
+ sage: v[2]
|
||
+ 3
|
||
+ sage: n = 2 # SAGE Integer
|
||
+ sage: v[n] # Perfectly OK!
|
||
+ 3
|
||
+ sage: v[int(n)] # Also OK.
|
||
+ 3
|
||
+
|
||
+A função ``range`` cria uma lista de int's do Python (não Inteiros do
|
||
+Sage):
|
||
+
|
||
+::
|
||
+
|
||
+ sage: range(1, 15)
|
||
+ [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
|
||
+
|
||
+Isso é útil quando se usa "list comprehensions" para construir listas:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: L = [factor(n) for n in range(1, 15)]
|
||
+ sage: print L
|
||
+ [1, 2, 3, 2^2, 5, 2 * 3, 7, 2^3, 3^2, 2 * 5, 11, 2^2 * 3, 13, 2 * 7]
|
||
+ sage: L[12]
|
||
+ 13
|
||
+ sage: type(L[12])
|
||
+ <class 'sage.structure.factorization_integer.IntegerFactorization'>
|
||
+ sage: [factor(n) for n in range(1, 15) if is_odd(n)]
|
||
+ [1, 3, 5, 7, 3^2, 11, 13]
|
||
+
|
||
+Para mais sobre como criar listas usando "list comprehensions", veja
|
||
+[PyT]_.
|
||
+
|
||
+Fatiamento de lista (list slicing) é um recurso fantástico. Se ``L`` é
|
||
+uma lista, então ``L[m:n]`` retorna uma sub-lista de ``L`` obtida
|
||
+começando do :math:`m`-ésimo elemento e terminando no
|
||
+:math:`(n-1)`-ésimo elemento, como ilustrado abaixo.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: L = [factor(n) for n in range(1, 20)]
|
||
+ sage: L[4:9]
|
||
+ [5, 2 * 3, 7, 2^3, 3^2]
|
||
+ sage: print L[:4]
|
||
+ [1, 2, 3, 2^2]
|
||
+ sage: L[14:4]
|
||
+ []
|
||
+ sage: L[14:]
|
||
+ [3 * 5, 2^4, 17, 2 * 3^2, 19]
|
||
+
|
||
+Tuplas são semelhantes à listas, exceto que elas são imutáveis: uma
|
||
+vez criadas elas não podem ser alteradas.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: v = (1,2,3,4); v
|
||
+ (1, 2, 3, 4)
|
||
+ sage: type(v)
|
||
+ <type 'tuple'>
|
||
+ sage: v[1] = 5
|
||
+ Traceback (most recent call last):
|
||
+ ...
|
||
+ TypeError: 'tuple' object does not support item assignment
|
||
+
|
||
+Sequências são um terceiro tipo de dados do Sage semelhante a listas.
|
||
+Diferentemente de listas e tuplas, Sequence não é um tipo de dados
|
||
+nativo do Python. Por definição, uma sequência é mutável, mas usando o
|
||
+método ``set_immutable`` da classe ``Sequence`` elas podem ser feitas
|
||
+imutáveis, como mostra o exemplo a seguir. Todos os elementos da
|
||
+sequência possuem um parente comum, chamado o universo da sequência.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: v = Sequence([1,2,3,4/5])
|
||
+ sage: v
|
||
+ [1, 2, 3, 4/5]
|
||
+ sage: type(v)
|
||
+ <class 'sage.structure.sequence.Sequence_generic'>
|
||
+ sage: type(v[1])
|
||
+ <type 'sage.rings.rational.Rational'>
|
||
+ sage: v.universe()
|
||
+ Rational Field
|
||
+ sage: v.is_immutable()
|
||
+ False
|
||
+ sage: v.set_immutable()
|
||
+ sage: v[0] = 3
|
||
+ Traceback (most recent call last):
|
||
+ ...
|
||
+ ValueError: object is immutable; please change a copy instead.
|
||
+
|
||
+Sequências são derivadas de listas e podem ser usadas em qualquer
|
||
+lugar que listas são usadas.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: v = Sequence([1,2,3,4/5])
|
||
+ sage: isinstance(v, list)
|
||
+ True
|
||
+ sage: list(v)
|
||
+ [1, 2, 3, 4/5]
|
||
+ sage: type(list(v))
|
||
+ <type 'list'>
|
||
+
|
||
+Como um outro exemplo, bases para espaços vetoriais são sequências
|
||
+imutáveis, pois é importante que elas não sejam modificadas.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: V = QQ^3; B = V.basis(); B
|
||
+ [
|
||
+ (1, 0, 0),
|
||
+ (0, 1, 0),
|
||
+ (0, 0, 1)
|
||
+ ]
|
||
+ sage: type(B)
|
||
+ <class 'sage.structure.sequence.Sequence_generic'>
|
||
+ sage: B[0] = B[1]
|
||
+ Traceback (most recent call last):
|
||
+ ...
|
||
+ ValueError: object is immutable; please change a copy instead.
|
||
+ sage: B.universe()
|
||
+ Vector space of dimension 3 over Rational Field
|
||
+
|
||
+Dicionários
|
||
+===========
|
||
+
|
||
+Um dicionário (também chamado as vezes de lista associativa) é um
|
||
+mapeamento de objetos "hashable" em objetos arbitrários. (Exemplos de
|
||
+objetos "hashable" são strings e números; veja a documentação Python
|
||
+em http://docs.python.org/tut/node7.html e
|
||
+http://docs.python.org/lib/typesmapping.html para detalhes).
|
||
+
|
||
+::
|
||
+
|
||
+ sage: d = {1:5, 'sage':17, ZZ:GF(7)}
|
||
+ sage: type(d)
|
||
+ <type 'dict'>
|
||
+ sage: d.keys()
|
||
+ [1, 'sage', Integer Ring]
|
||
+ sage: d['sage']
|
||
+ 17
|
||
+ sage: d[ZZ]
|
||
+ Finite Field of size 7
|
||
+ sage: d[1]
|
||
+ 5
|
||
+
|
||
+A terceira chave (key) ilustra como os índices de um dicionário podem
|
||
+ser complicados, por exemplo, um anel de inteiros.
|
||
+
|
||
+Você pode transformar o dicionário acima em uma lista com os mesmos
|
||
+dados:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: d.items()
|
||
+ [(1, 5), ('sage', 17), (Integer Ring, Finite Field of size 7)]
|
||
+
|
||
+É comum iterar sobre os pares em um dicionário:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: d = {2:4, 3:9, 4:16}
|
||
+ sage: [a*b for a, b in d.iteritems()]
|
||
+ [8, 27, 64]
|
||
+
|
||
+Um dicionário não possui ordem, como o exemplo acima mostra.
|
||
+
|
||
+Conjuntos
|
||
+=========
|
||
+
|
||
+O Python possui um tipo set (conjuntos) nativo. O principal recurso
|
||
+que ele oferece é a rápida verificação se um objeto está ou não em um
|
||
+conjunto, juntamente com as operações comuns em conjuntos.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: X = set([1,19,'a']); Y = set([1,1,1, 2/3])
|
||
+ sage: X
|
||
+ set(['a', 1, 19])
|
||
+ sage: Y
|
||
+ set([1, 2/3])
|
||
+ sage: 'a' in X
|
||
+ True
|
||
+ sage: 'a' in Y
|
||
+ False
|
||
+ sage: X.intersection(Y)
|
||
+ set([1])
|
||
+
|
||
+O Sage também possui o seu próprio tipo de dados para conjuntos que é
|
||
+(em alguns casos) implementado usando o tipo nativo do Python, mas
|
||
+possuir algumas funcionalidades adicionais. Crie um conjunto em Sage
|
||
+usando ``Set(...)``. Por exemplo,
|
||
+
|
||
+::
|
||
+
|
||
+ sage: X = Set([1,19,'a']); Y = Set([1,1,1, 2/3])
|
||
+ sage: X
|
||
+ {'a', 1, 19}
|
||
+ sage: Y
|
||
+ {1, 2/3}
|
||
+ sage: X.intersection(Y)
|
||
+ {1}
|
||
+ sage: print latex(Y)
|
||
+ \left\{1, \frac{2}{3}\right\}
|
||
+ sage: Set(ZZ)
|
||
+ Set of elements of Integer Ring
|
||
+
|
||
+Iteradores
|
||
+==========
|
||
+
|
||
+Iteradores foram adicionados recentemente ao Python e são
|
||
+particularmente úteis em aplicações matemáticas. Aqui estão vários
|
||
+exemplos; veja [PyT]_ para mais detalhes. Vamos criar um iterador
|
||
+sobre o quadrados dos números inteiros até :math:`10000000`.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: v = (n^2 for n in xrange(10000000))
|
||
+ sage: v.next()
|
||
+ 0
|
||
+ sage: v.next()
|
||
+ 1
|
||
+ sage: v.next()
|
||
+ 4
|
||
+
|
||
+Criamos agora um iterador sobre os primos da forma :math:`4p+1` com
|
||
+:math:`p` também primo, e observamos os primeiros valores.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: w = (4*p + 1 for p in Primes() if is_prime(4*p+1))
|
||
+ sage: w # in the next line, 0xb0853d6c is a random 0x number
|
||
+ <generator object at 0xb0853d6c>
|
||
+ sage: w.next()
|
||
+ 13
|
||
+ sage: w.next()
|
||
+ 29
|
||
+ sage: w.next()
|
||
+ 53
|
||
+
|
||
+Certos anéis, por exemplo, corpos finitos e os inteiros possuem
|
||
+iteradores associados a eles:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: [x for x in GF(7)]
|
||
+ [0, 1, 2, 3, 4, 5, 6]
|
||
+ sage: W = ((x,y) for x in ZZ for y in ZZ)
|
||
+ sage: W.next()
|
||
+ (0, 0)
|
||
+ sage: W.next()
|
||
+ (0, 1)
|
||
+ sage: W.next()
|
||
+ (0, -1)
|
||
+
|
||
+Laços, Funções, Enunciados de Controle e Comparações
|
||
+====================================================
|
||
+
|
||
+Nós já vimos alguns exemplos de alguns usos comuns de laços (loops)
|
||
+``for``. Em Python, um laço ``for`` possui uma estrutura tabulada, tal
|
||
+como
|
||
+
|
||
+::
|
||
+
|
||
+ >>> for i in range(5):
|
||
+ print(i)
|
||
+
|
||
+ 0
|
||
+ 1
|
||
+ 2
|
||
+ 3
|
||
+ 4
|
||
+
|
||
+Note que os dois pontos no final do enunciado (não existe "do" ou "od"
|
||
+como no GAP ou Maple), e a identação antes dos comandos dentro do
|
||
+laço, isto é, ``print(i)``. A tabulação é importante. No Sage, a
|
||
+tabulação é automaticamente adicionada quando você digita ``enter``
|
||
+após ":", como ilustrado abaixo.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: for i in range(5):
|
||
+ ... print(i) # now hit enter twice
|
||
+ 0
|
||
+ 1
|
||
+ 2
|
||
+ 3
|
||
+ 4
|
||
+
|
||
+O símbolo ``=`` é usado para atribuição.
|
||
+O símbolo ``==`` é usado para verificar igualdade:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: for i in range(15):
|
||
+ ... if gcd(i,15) == 1:
|
||
+ ... print(i)
|
||
+ 1
|
||
+ 2
|
||
+ 4
|
||
+ 7
|
||
+ 8
|
||
+ 11
|
||
+ 13
|
||
+ 14
|
||
+
|
||
+Tenha em mente como a tabulação determina a estrutura de blocos para
|
||
+enunciados ``if``, ``for``, e ``while``:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: def legendre(a,p):
|
||
+ ... is_sqr_modp=-1
|
||
+ ... for i in range(p):
|
||
+ ... if a % p == i^2 % p:
|
||
+ ... is_sqr_modp=1
|
||
+ ... return is_sqr_modp
|
||
+
|
||
+ sage: legendre(2,7)
|
||
+ 1
|
||
+ sage: legendre(3,7)
|
||
+ -1
|
||
+
|
||
+Obviamente essa não é uma implementação eficiente do símbolo de
|
||
+Legendre! O objetivo é ilustrar vários aspectos da programação em
|
||
+Python/Sage. A função {kronecker}, que já vem com o Sage, calcula o
|
||
+símbolo de Legendre eficientemente usando uma biblioteca em C do PARI.
|
||
+
|
||
+Finalmente, observamos que comparações, tais como ``==``, ``!=``,
|
||
+``<=``, ``>=``, ``>``, ``<``, entre números irão automaticamente
|
||
+converter ambos os números para o mesmo tipo, se possível:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: 2 < 3.1; 3.1 <= 1
|
||
+ True
|
||
+ False
|
||
+ sage: 2/3 < 3/2; 3/2 < 3/1
|
||
+ True
|
||
+ True
|
||
+
|
||
+Quase todos pares de objetos podem ser comparados; não se supõe que os
|
||
+objetos estejam equipados com uma ordem total.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: 2 < CC(3.1,1)
|
||
+ True
|
||
+ sage: 5 < VectorSpace(QQ,3) # output can be somewhat random
|
||
+ True
|
||
+
|
||
+Use bool para desigualdades simbólicas:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x < x + 1
|
||
+ x < x + 1
|
||
+ sage: bool(x < x + 1)
|
||
+ True
|
||
+
|
||
+Quando se compara objetos de tipos diferentes no Sage, na maior parte
|
||
+dos casos o Sage tenta encontrar uma coação canônica para ambos os
|
||
+objetos em um parente comum (veja :ref:`section-coercion` para mais
|
||
+detalhes). Se isso for bem sucedido, a comparação é realizada entre os
|
||
+objetos que foram coagidos; se não for bem sucedido, os objetos são
|
||
+considerados diferentes. Para testar se duas variáveis fazem
|
||
+referência ao mesmo objeto use ``is``. Como se vê no próximo exemplo,
|
||
+o int ``1`` do Python é único, mas o Inteiro ``1`` do Sage não é.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: 1 is 2/2
|
||
+ False
|
||
+ sage: int(1) is int(2)/int(2)
|
||
+ True
|
||
+ sage: 1 is 1
|
||
+ False
|
||
+ sage: 1 == 2/2
|
||
+ True
|
||
+
|
||
+Nas duas linhas seguintes, a primeira igualdade é falsa (``False``)
|
||
+porque não existe um morfismo canônico :math:`QQ\to \GF{5}`, logo
|
||
+não há uma forma de comparar o :math:`1` em :math:`\GF{5}` com o
|
||
+:math:`1 \in \QQ`. Em contraste, existe um mapa canônico entre
|
||
+:math:`\ZZ \to \GF{5}`, logo a segunda comparação é verdadeira
|
||
+(``True``)
|
||
+
|
||
+::
|
||
+
|
||
+ sage: GF(5)(1) == QQ(1); QQ(1) == GF(5)(1)
|
||
+ False
|
||
+ False
|
||
+ sage: GF(5)(1) == ZZ(1); ZZ(1) == GF(5)(1)
|
||
+ True
|
||
+ True
|
||
+ sage: ZZ(1) == QQ(1)
|
||
+ True
|
||
+
|
||
+ATENÇÃO: Comparação no Sage é mais restritiva do que no Magma, o qual
|
||
+declara :math:`1 \in \GF{5}` igual a :math:`1 \in \QQ`.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: magma('GF(5)!1 eq Rationals()!1') # optional magma required
|
||
+ true
|
||
+
|
||
+Otimização (Profiling)
|
||
+======================
|
||
+
|
||
+Autor desta seção: Martin Albrecht (malb@informatik.uni-bremen.de)
|
||
+
|
||
+ "Premature optimization is the root of all evil." - Donald Knuth
|
||
+
|
||
+As vezes é útil procurar por gargalos em programas para entender quais
|
||
+partes gastam maior tempo computacional; isso pode dar uma boa ideia
|
||
+sobre quais partes otimizar. Python e portanto Sage fornecem várias
|
||
+opções de "profiling" (esse é o nome que se dá ao processo de
|
||
+otimização).
|
||
+
|
||
+O mais simples de usar é o comando ``prun`` na linha de comando
|
||
+interativa. Ele retorna um sumário sobre o tempo computacional
|
||
+utilizado por cada função. Para analisar (a atualmente lenta! -- na
|
||
+versão 1.0) multiplicação de matrizes sobre corpos finitos, por
|
||
+exemplo, faça o seguinte:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: k,a = GF(2**8, 'a').objgen()
|
||
+ sage: A = Matrix(k,10,10,[k.random_element() for _ in range(10*10)])
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: %prun B = A*A
|
||
+ 32893 function calls in 1.100 CPU seconds
|
||
+
|
||
+ Ordered by: internal time
|
||
+
|
||
+ ncalls tottime percall cumtime percall filename:lineno(function)
|
||
+ 12127 0.160 0.000 0.160 0.000 :0(isinstance)
|
||
+ 2000 0.150 0.000 0.280 0.000 matrix.py:2235(__getitem__)
|
||
+ 1000 0.120 0.000 0.370 0.000 finite_field_element.py:392(__mul__)
|
||
+ 1903 0.120 0.000 0.200 0.000 finite_field_element.py:47(__init__)
|
||
+ 1900 0.090 0.000 0.220 0.000 finite_field_element.py:376(__compat)
|
||
+ 900 0.080 0.000 0.260 0.000 finite_field_element.py:380(__add__)
|
||
+ 1 0.070 0.070 1.100 1.100 matrix.py:864(__mul__)
|
||
+ 2105 0.070 0.000 0.070 0.000 matrix.py:282(ncols)
|
||
+ ...
|
||
+
|
||
+Aqui ``ncalls`` é o números de chamadas, ``tottime`` é o tempo total
|
||
+gasto por uma determinada função (excluíndo o tempo gasto em chamadas
|
||
+de subfunções), ``percall`` é o quociente de ``tottime`` dividido por
|
||
+``ncalls``. ``cumtime`` é o tempo total gasto nessa e em todas as
|
||
+subfunções (isto é, desde o início até o término da execução da
|
||
+função), ``percall`` é o quociente de ``cumtime`` dividido pelas
|
||
+chamadas primitivas, e ``filename:lineno(function)`` fornece os dados
|
||
+respectivos para cada função. A regra prática aqui é: Quanto mais no
|
||
+topo uma função aparece nessa lista, mais custo computacional ela
|
||
+acarreta. Logo é mais interessante para ser optimizada.
|
||
+
|
||
+Como usual, ``prun?`` fornece detalhes sobre como usar o "profiler" e
|
||
+como entender a saída de dados.
|
||
+
|
||
+A saída de dados pode ser escrita em um objeto para permitir uma
|
||
+análise mais detalhada:
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: %prun -r A*A
|
||
+ sage: stats = _
|
||
+ sage: stats?
|
||
+
|
||
+Note: digitando ``stats = prun -r A\*A`` obtém-se um erro de sintaxe
|
||
+porque prun é um comando do IPython, não uma função comum.
|
||
+
|
||
+Para uma representação gráfica dos dados do "profiling", você pode
|
||
+usar o "hotspot profiler", um pequeno script chamado
|
||
+``hotshot2cachetree`` e o programa ``kcachegrind`` (apenas no Unix). O
|
||
+mesmo exemplo agora com o "hotspot profiler":
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: k,a = GF(2**8, 'a').objgen()
|
||
+ sage: A = Matrix(k,10,10,[k.random_element() for _ in range(10*10)])
|
||
+ sage: import hotshot
|
||
+ sage: filename = "pythongrind.prof"
|
||
+ sage: prof = hotshot.Profile(filename, lineevents=1)
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: prof.run("A*A")
|
||
+ <hotshot.Profile instance at 0x414c11ec>
|
||
+ sage: prof.close()
|
||
+
|
||
+Isso resulta em um arquivo ``pythongrind.prof`` no diretório de
|
||
+trabalho atual. Ele pode ser convertido para o formato cachegrind para
|
||
+visualização.
|
||
+
|
||
+Em uma linha de comando do sistema, digite
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ hotshot2calltree -o cachegrind.out.42 pythongrind.prof
|
||
+
|
||
+O arquivo de saída ``cachegrind.out.42`` pode ser examinado com
|
||
+``kcachegrind``. Note que a convenção de nomes ``cachegrind.out.XX``
|
||
+precisa ser obedecida.
|
||
diff --git a/doc/pt/tutorial/sagetex.rst b/doc/pt/tutorial/sagetex.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/sagetex.rst
|
||
@@ -0,0 +1,112 @@
|
||
+.. _sec-sagetex:
|
||
+
|
||
+****************
|
||
+Usando o SageTeX
|
||
+****************
|
||
+
|
||
+O pacote SageTeX permite que você insira resultados de cálculos feitos
|
||
+com o Sage em um documento LaTeX. Esse pacote já vem com o Sage. Para
|
||
+usá-lo, você precisa "instalá-lo" em seu sistema LaTeX local; aqui
|
||
+instalar significa copiar um simples arquivo. Veja :ref:`installation`
|
||
+neste tutorial e a seção "Make SageTeX known to TeX" do `Guia de
|
||
+instalação do Sage <http://sagemath.org/doc/installation/index.html>`_
|
||
+(em inglês) (`este link <../installation/index.html>`_ deve levá-lo a
|
||
+uma cópia local do guia de instalação para mais informações de como
|
||
+proceder.
|
||
+
|
||
+Aqui vai um breve exemplo de como usar o SageTeX. A documentação
|
||
+completa pode ser encontrada em
|
||
+``SAGE_ROOT/local/share/texmf/tex/generic/sagetex``, onde
|
||
+``SAGE_ROOT`` é o diretório onde se encontra a sua instalação. Esse
|
||
+diretório contém a documentação, um arquivo de exemplo, e alguns
|
||
+scripts em Python possivelmente úteis.
|
||
+
|
||
+Para ver como o SageTeX funciona, siga as instruções para instalar o
|
||
+SageTeX (em :ref:`installation`) e copie o seguinte texto em um
|
||
+arquivo chamado ``st_example.tex``, por exemplo.
|
||
+
|
||
+.. warning::
|
||
+
|
||
+ O texto abaixo vai apresentar diversos erros sobre "unknown control
|
||
+ sequences" se você está visualizando isto na ajuda "live". Use a
|
||
+ versão estática para ver o texto corretamente.
|
||
+
|
||
+.. code-block:: latex
|
||
+
|
||
+ \documentclass{article}
|
||
+ \usepackage{sagetex}
|
||
+
|
||
+ \begin{document}
|
||
+
|
||
+ Using Sage\TeX, one can use Sage to compute things and put them into
|
||
+ your \LaTeX{} document. For example, there are
|
||
+ $\sage{number_of_partitions(1269)}$ integer partitions of $1269$.
|
||
+ You don't need to compute the number yourself, or even cut and paste
|
||
+ it from somewhere.
|
||
+
|
||
+ Here's some Sage code:
|
||
+
|
||
+ \begin{sageblock}
|
||
+ f(x) = exp(x) * sin(2*x)
|
||
+ \end{sageblock}
|
||
+
|
||
+ The second derivative of $f$ is
|
||
+
|
||
+ \[
|
||
+ \frac{\mathrm{d}^{2}}{\mathrm{d}x^{2}} \sage{f(x)} =
|
||
+ \sage{diff(f, x, 2)(x)}.
|
||
+ \]
|
||
+
|
||
+ Here's a plot of $f$ from $-1$ to $1$:
|
||
+
|
||
+ \sageplot{plot(f, -1, 1)}
|
||
+
|
||
+ \end{document}
|
||
+
|
||
+Execute o LaTeX em ``st_example.tex`` da forma usual. Note que o LaTeX
|
||
+vai reclamar sobre algumas coisas, entre elas::
|
||
+
|
||
+ Package sagetex Warning: Graphics file
|
||
+ sage-plots-for-st_example.tex/plot-0.eps on page 1 does not exist. Plot
|
||
+ command is on input line 25.
|
||
+
|
||
+ Package sagetex Warning: There were undefined Sage formulas and/or
|
||
+ plots. Run Sage on st_example.sage, and then run LaTeX on
|
||
+ st_example.tex again.
|
||
+
|
||
+Observe que, além dos arquivos usuais produzidos pelo LaTeX, existe um
|
||
+arquivo chamado ``st_example.sage``. Esse é um script em Sage
|
||
+produzido quando você executa o LaTeX em ``st_example.tex``. A
|
||
+mensagem de alerta pede para você executar o LaTeX em
|
||
+``st_example.sage``, então siga essa sugestão e faça isso. Você vai
|
||
+receber uma mensagem para executar o LaTeX em ``st_example.tex``
|
||
+novamente, mas antes que você faça isso, observe que um novo arquivo
|
||
+foi criado: ``st_example.sout``. Esse arquivo contém os resultados dos
|
||
+cálculos feitos pelo Sage, em um formato que o LaTeX pode usar para
|
||
+inserir em seu texto. Um novo diretório contendo um arquivo EPS do seu
|
||
+gráfico também foi criado. Execute o LaTeX novamente e você vai ver
|
||
+que tudo que foi calculado, incluindo os gráficos, foi incluído em seu
|
||
+documento.
|
||
+
|
||
+As macros utilizadas acima devem ser fáceis de entender. Um
|
||
+environment ``sageblock`` insere código "verbatim" (exatamente como é
|
||
+digitado) e também executa o código quando você executa o Sage. Quando
|
||
+você insere ``\sage{foo}``, é incluído em seu documento o resultado
|
||
+que você obteria executando ``latex(foo)`` no Sage. Comandos para
|
||
+fazer gráficos são um pouco mais complicados, mas em sua forma mais
|
||
+simples, ``\sageplot{foo}`` insere a imagem que você obtêm usando
|
||
+``foo.save('filename.eps')``.
|
||
+
|
||
+Em geral, a rotina é a seguinte:
|
||
+
|
||
+ - execute o LaTeX no seu arquivo .tex;
|
||
+ - execute o Sage no arquivo .sage que foi gerado;
|
||
+ - execute o LaTeX novamente.
|
||
+
|
||
+Você pode omitir a execução do Sage desde que você não tenha alterado
|
||
+os comandos em Sage em seu documento.
|
||
+
|
||
+Há muito mais sobre o SageTeX, e como tanto o Sage como o LaTeX são
|
||
+ferramentas complexas e poderosas, é uma boa idéia ler a documentação
|
||
+para o SageTeX que se encontra em
|
||
+``SAGE_ROOT/local/share/texmf/tex/generic/sagetex``.
|
||
diff --git a/doc/pt/tutorial/tour.rst b/doc/pt/tutorial/tour.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/tour.rst
|
||
@@ -0,0 +1,31 @@
|
||
+*****************
|
||
+Um passeio guiado
|
||
+*****************
|
||
+
|
||
+Esta seção é um passeio guiado pelo que está disponível no Sage. Para
|
||
+diversos outros exemplos, veja "Construções em Sage", que tem como
|
||
+objetivo responder à questão geral "Como eu construo ...?". Veja
|
||
+também o "Sage Reference Manual", que possui centenas de outros
|
||
+exemplos. Note que é também possível percorrer este tutorial no Sage
|
||
+Notebook clicando no link ``Help``.
|
||
+
|
||
+(Se você está acessando este tutorial no Sage Notebook, pressione
|
||
+``shift-enter`` para processar qualquer célula de entrada. Você pode
|
||
+até editar a célula antes de pressionar ``shift-enter``. Em alguns
|
||
+Macs pode ser necessário pressionar ``shift-return`` em vez de
|
||
+``shift-enter``.)
|
||
+
|
||
+.. toctree::
|
||
+
|
||
+ tour_assignment
|
||
+ tour_help
|
||
+ tour_algebra
|
||
+ tour_plotting
|
||
+ tour_functions
|
||
+ tour_rings
|
||
+ tour_linalg
|
||
+ tour_polynomial
|
||
+ tour_coercion
|
||
+ tour_groups
|
||
+ tour_numtheory
|
||
+ tour_advanced
|
||
diff --git a/doc/pt/tutorial/tour_advanced.rst b/doc/pt/tutorial/tour_advanced.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/tour_advanced.rst
|
||
@@ -0,0 +1,548 @@
|
||
+Um Pouco Mais de Matemática Avançada
|
||
+====================================
|
||
+
|
||
+Geometria Algébrica
|
||
+-------------------
|
||
+
|
||
+Você pode definir variedades algébricas arbitrárias no Sage, mas as
|
||
+vezes alguma funcionalidade não-trivial é limitada a anéis sobre
|
||
+:math:`\QQ` ou corpos finitos. Por exemplo, vamos calcular a união de
|
||
+duas curvas planas afim, e então recuperar as curvas como as
|
||
+componentes irredutíveis da união.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x, y = AffineSpace(2, QQ, 'xy').gens()
|
||
+ sage: C2 = Curve(x^2 + y^2 - 1)
|
||
+ sage: C3 = Curve(x^3 + y^3 - 1)
|
||
+ sage: D = C2 + C3
|
||
+ sage: D
|
||
+ Affine Curve over Rational Field defined by
|
||
+ x^5 + x^3*y^2 + x^2*y^3 + y^5 - x^3 - y^3 - x^2 - y^2 + 1
|
||
+ sage: D.irreducible_components()
|
||
+ [
|
||
+ Closed subscheme of Affine Space of dimension 2 over Rational Field defined by:
|
||
+ x^2 + y^2 - 1,
|
||
+ Closed subscheme of Affine Space of dimension 2 over Rational Field defined by:
|
||
+ x^3 + y^3 - 1
|
||
+ ]
|
||
+
|
||
+Você também pode encontrar todos os pontos de interseção das duas
|
||
+curvas, intersectando-as, e então calculando as componentes
|
||
+irredutíveis.
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: V = C2.intersection(C3)
|
||
+ sage: V.irreducible_components()
|
||
+ [
|
||
+ Closed subscheme of Affine Space of dimension 2 over Rational Field defined by:
|
||
+ y - 1,
|
||
+ x,
|
||
+ Closed subscheme of Affine Space of dimension 2 over Rational Field defined by:
|
||
+ y,
|
||
+ x - 1,
|
||
+ Closed subscheme of Affine Space of dimension 2 over Rational Field defined by:
|
||
+ x + y + 2,
|
||
+ 2*y^2 + 4*y + 3
|
||
+ ]
|
||
+
|
||
+Portanto, por exemplo, :math:`(1,0)` e :math:`(0,1)` estão em ambas as
|
||
+curvas (o que é claramente visível), como também estão certos pontos
|
||
+(quadráticos) cuja coordenada :math:`y` satisfaz :math:`2y^2 + 4y +
|
||
+3=0`.
|
||
+
|
||
+O Sage pode calcular o ideal toroidal da cúbica torcida no espaço-3
|
||
+projetivo:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R.<a,b,c,d> = PolynomialRing(QQ, 4)
|
||
+ sage: I = ideal(b^2-a*c, c^2-b*d, a*d-b*c)
|
||
+ sage: F = I.groebner_fan(); F
|
||
+ Groebner fan of the ideal:
|
||
+ Ideal (b^2 - a*c, c^2 - b*d, -b*c + a*d) of Multivariate Polynomial Ring
|
||
+ in a, b, c, d over Rational Field
|
||
+ sage: F.reduced_groebner_bases ()
|
||
+ [[-c^2 + b*d, -b*c + a*d, -b^2 + a*c],
|
||
+ [c^2 - b*d, -b*c + a*d, -b^2 + a*c],
|
||
+ [c^2 - b*d, b*c - a*d, -b^2 + a*c, -b^3 + a^2*d],
|
||
+ [c^2 - b*d, b*c - a*d, b^3 - a^2*d, -b^2 + a*c],
|
||
+ [c^2 - b*d, b*c - a*d, b^2 - a*c],
|
||
+ [-c^2 + b*d, b^2 - a*c, -b*c + a*d],
|
||
+ [-c^2 + b*d, b*c - a*d, b^2 - a*c, -c^3 + a*d^2],
|
||
+ [c^3 - a*d^2, -c^2 + b*d, b*c - a*d, b^2 - a*c]]
|
||
+ sage: F.polyhedralfan()
|
||
+ Polyhedral fan in 4 dimensions of dimension 4
|
||
+
|
||
+Curvas Elípticas
|
||
+----------------
|
||
+
|
||
+A funcionalidade para curvas elípticas inclui a maior parte da
|
||
+funcionalidade para curvas elípticas do PARI, acesso aos dados da base
|
||
+de dados Cremona (isso requer um pacote adicional), os recursos do
|
||
+mwrank, isto é, "2-descends" com cálculos do grupo de Mordell-Weil
|
||
+completo, o algoritmo SEA (singla em inglês), cálculo de todas as
|
||
+isogenias, bastante código novo para curvas sobre :math:`\QQ`, e parte
|
||
+do software "algebraic descent" de Denis Simons.
|
||
+
|
||
+O comando ``EllipticCurve`` para criar curvas elípticas possui várias
|
||
+formas:
|
||
+
|
||
+
|
||
+- EllipticCurve([:math:`a_1`, :math:`a_2`, :math:`a_3`, :math:`a_4`, :math:`a_6`]):
|
||
+ Fornece a curva elíptica
|
||
+
|
||
+ .. math:: y^2+a_1xy+a_3y=x^3+a_2x^2+a_4x+a_6,
|
||
+
|
||
+
|
||
+ onde os :math:`a_i`'s são coagidos para os parentes de :math:`a_1`.
|
||
+ Se todos os :math:`a_i` possuem parente :math:`\ZZ`, então eles são
|
||
+ coagidos para :math:`\QQ`.
|
||
+
|
||
+- EllipticCurve([:math:`a_4`, :math:`a_6`]): Conforme acima, mas
|
||
+ :math:`a_1=a_2=a_3=0`.
|
||
+
|
||
+- EllipticCurve(label): Fornece a curva elíptica da base de dados
|
||
+ Cremona com o "label" (novo) dado. O label é uma string, tal como
|
||
+ ``"11a"`` ou ``"37b2"``. As letras devem ser minúsculas (para
|
||
+ distinguir dos labels antigos).
|
||
+
|
||
+- EllipticCurve(j): Fornece uma curva elíptica com invariante
|
||
+ :math:`j`.
|
||
+
|
||
+- EllipticCurve(R,
|
||
+ [:math:`a_1`, :math:`a_2`, :math:`a_3`, :math:`a_4`, :math:`a_6`]):
|
||
+ Cria uma curva elíptica sobre um anel :math:`R` com os
|
||
+ :math:`a_i`'s.
|
||
+
|
||
+
|
||
+Agora ilustramos cada uma dessas construções:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: EllipticCurve([0,0,1,-1,0])
|
||
+ Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
|
||
+
|
||
+ sage: EllipticCurve([GF(5)(0),0,1,-1,0])
|
||
+ Elliptic Curve defined by y^2 + y = x^3 + 4*x over Finite Field of size 5
|
||
+
|
||
+ sage: EllipticCurve([1,2])
|
||
+ Elliptic Curve defined by y^2 = x^3 + x + 2 over Rational Field
|
||
+
|
||
+ sage: EllipticCurve('37a')
|
||
+ Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
|
||
+
|
||
+ sage: EllipticCurve_from_j(1)
|
||
+ Elliptic Curve defined by y^2 + x*y = x^3 + 36*x + 3455 over Rational Field
|
||
+
|
||
+ sage: EllipticCurve(GF(5), [0,0,1,-1,0])
|
||
+ Elliptic Curve defined by y^2 + y = x^3 + 4*x over Finite Field of size 5
|
||
+
|
||
+O par :math:`(0,0)` é um ponto na curva elíptica :math:`E` definida
|
||
+por :math:`y^2 + y = x^3 - x`. Para criar esse ponto digite
|
||
+``E([0,0])``. O Sage pode somar pontos em uma curva elíptica
|
||
+(lembre-se que é possível definir uma estrutura de grupo aditivo em
|
||
+curvas elípticas onde o ponto no infinito é o elemento nulo, e a some
|
||
+de três pontos colineares sobre a curva é zero):
|
||
+
|
||
+::
|
||
+
|
||
+ sage: E = EllipticCurve([0,0,1,-1,0])
|
||
+ sage: E
|
||
+ Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field
|
||
+ sage: P = E([0,0])
|
||
+ sage: P + P
|
||
+ (1 : 0 : 1)
|
||
+ sage: 10*P
|
||
+ (161/16 : -2065/64 : 1)
|
||
+ sage: 20*P
|
||
+ (683916417/264517696 : -18784454671297/4302115807744 : 1)
|
||
+ sage: E.conductor()
|
||
+ 37
|
||
+
|
||
+As curvas elípticas sobre os números complexos são parametrizadas
|
||
+pelo invariante :math:`j`. O Sage calcula o invariante :math:`j` da
|
||
+seguinte forma:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: E = EllipticCurve([0,0,0,-4,2]); E
|
||
+ Elliptic Curve defined by y^2 = x^3 - 4*x + 2 over Rational Field
|
||
+ sage: E.conductor()
|
||
+ 2368
|
||
+ sage: E.j_invariant()
|
||
+ 110592/37
|
||
+
|
||
+Se criarmos uma curva com o mesmo invariante :math:`j` que a curva
|
||
+:math:`E`, ela não precisa ser isomórfica a :math:`E`. No seguinte
|
||
+exemplo, as curvas não são isomórficas porque os seus condutores são
|
||
+diferentes.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: F = EllipticCurve_from_j(110592/37)
|
||
+ sage: F.conductor()
|
||
+ 37
|
||
+
|
||
+Todavia, uma torção de :math:`F` por um fator 2 resulta em uma curva
|
||
+isomórfica.
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: G = F.quadratic_twist(2); G
|
||
+ Elliptic Curve defined by y^2 = x^3 - 4*x + 2 over Rational Field
|
||
+ sage: G.conductor()
|
||
+ 2368
|
||
+ sage: G.j_invariant()
|
||
+ 110592/37
|
||
+
|
||
+Nós podemos calcular os coeficientes :math:`a_n` de uma
|
||
+série-:math:`L` ou forma modular :math:`\sum_{n=0}^\infty
|
||
+a_nq^n` associada à curva elíptica. Esse cálculo usa a biblioteca C do
|
||
+PARI.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: E = EllipticCurve([0,0,1,-1,0])
|
||
+ sage: print E.anlist(30)
|
||
+ [0, 1, -2, -3, 2, -2, 6, -1, 0, 6, 4, -5, -6, -2, 2, 6, -4, 0, -12, 0, -4,
|
||
+ 3, 10, 2, 0, -1, 4, -9, -2, 6, -12]
|
||
+ sage: v = E.anlist(10000)
|
||
+
|
||
+Leva apenas um segundo para calcular todos os :math:`a_n` para
|
||
+:math:`n\leq 10^5`:
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: %time v = E.anlist(100000)
|
||
+ CPU times: user 0.98 s, sys: 0.06 s, total: 1.04 s
|
||
+ Wall time: 1.06
|
||
+
|
||
+Curvas elípticas podem ser construídas usando o "label" da base de
|
||
+dados Cremona. Isso importa a curva elíptica com informações prévias
|
||
+sobre o seu posto, números de Tomagawa, regulador, etc.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: E = EllipticCurve("37b2")
|
||
+ sage: E
|
||
+ Elliptic Curve defined by y^2 + y = x^3 + x^2 - 1873*x - 31833 over Rational
|
||
+ Field
|
||
+ sage: E = EllipticCurve("389a")
|
||
+ sage: E
|
||
+ Elliptic Curve defined by y^2 + y = x^3 + x^2 - 2*x over Rational Field
|
||
+ sage: E.rank()
|
||
+ 2
|
||
+ sage: E = EllipticCurve("5077a")
|
||
+ sage: E.rank()
|
||
+ 3
|
||
+
|
||
+Nós também podemos acessar a base de dados Cremona diretamente.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: db = sage.databases.cremona.CremonaDatabase()
|
||
+ sage: db.curves(37)
|
||
+ {'a1': [[0, 0, 1, -1, 0], 1, 1], 'b1': [[0, 1, 1, -23, -50], 0, 3]}
|
||
+ sage: db.allcurves(37)
|
||
+ {'a1': [[0, 0, 1, -1, 0], 1, 1],
|
||
+ 'b1': [[0, 1, 1, -23, -50], 0, 3],
|
||
+ 'b2': [[0, 1, 1, -1873, -31833], 0, 1],
|
||
+ 'b3': [[0, 1, 1, -3, 1], 0, 3]}
|
||
+
|
||
+Os objetos obtidos pela base de dados não são do tipo
|
||
+``EllipticCurve``. Eles são elementos de uma base de dados e possuem
|
||
+alguns campos, e apenas isso. Existe uma versão básica da base de
|
||
+dados Cremona, que já é distribuída na versão padrão do Sage, e contém
|
||
+informações limitadas sobre curvas elípticas de condutor :math:`\leq
|
||
+10000`. Existe também uma versão estendida opcional, que contém
|
||
+informações extensas sobre curvas elípticas de condutor :math:`\leq
|
||
+120000` (em outubro de 2005). Por fim, existe ainda uma versão (2GB)
|
||
+opcional de uma base de dados para o Sage que contém centenas de
|
||
+milhares de curvas elípticas na base de dados Stein-Watkins.
|
||
+
|
||
+Caracteres de Dirichlet
|
||
+-----------------------
|
||
+
|
||
+Um *caractere de Dirichlet* é a extensão de um homomorfismo
|
||
+:math:`(\ZZ/N\ZZ)* \to R^*`, para algum anel :math:`R`, para o mapa
|
||
+:math:`\ZZ \to R` obtido mapeando os inteiros :math:`x` tais que
|
||
+:math:`\gcd(N,x)>1` em 0.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: G = DirichletGroup(12)
|
||
+ sage: G.list()
|
||
+ [Dirichlet character modulo 12 of conductor 1 mapping 7 |--> 1, 5 |--> 1,
|
||
+ Dirichlet character modulo 12 of conductor 4 mapping 7 |--> -1, 5 |--> 1,
|
||
+ Dirichlet character modulo 12 of conductor 3 mapping 7 |--> 1, 5 |--> -1,
|
||
+ Dirichlet character modulo 12 of conductor 12 mapping 7 |--> -1, 5 |--> -1]
|
||
+ sage: G.gens()
|
||
+ (Dirichlet character modulo 12 of conductor 4 mapping 7 |--> -1, 5 |--> 1,
|
||
+ Dirichlet character modulo 12 of conductor 3 mapping 7 |--> 1, 5 |--> -1)
|
||
+ sage: len(G)
|
||
+ 4
|
||
+
|
||
+Tendo criado o grupo, a seguir calculamos um elemento e fazemos
|
||
+cálculos com ele.
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: G = DirichletGroup(21)
|
||
+ sage: chi = G.1; chi
|
||
+ Dirichlet character modulo 21 of conductor 7 mapping 8 |--> 1, 10 |--> zeta6
|
||
+ sage: chi.values()
|
||
+ [0, 1, zeta6 - 1, 0, -zeta6, -zeta6 + 1, 0, 0, 1, 0, zeta6, -zeta6, 0, -1,
|
||
+ 0, 0, zeta6 - 1, zeta6, 0, -zeta6 + 1, -1]
|
||
+ sage: chi.conductor()
|
||
+ 7
|
||
+ sage: chi.modulus()
|
||
+ 21
|
||
+ sage: chi.order()
|
||
+ 6
|
||
+ sage: chi(19)
|
||
+ -zeta6 + 1
|
||
+ sage: chi(40)
|
||
+ -zeta6 + 1
|
||
+
|
||
+É também possível calcular a ação do grupo de Galois
|
||
+:math:`\text{Gal}(\QQ(\zeta_N)/\QQ)` sobre esses caracteres, bem como
|
||
+a decomposição em produto direto correspondente à fatorização do
|
||
+módulo.
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: chi.galois_orbit()
|
||
+ [Dirichlet character modulo 21 of conductor 7 mapping 8 |--> 1, 10 |--> zeta6,
|
||
+ Dirichlet character modulo 21 of conductor 7 mapping 8 |--> 1, 10 |--> -zeta6 + 1]
|
||
+
|
||
+ sage: go = G.galois_orbits()
|
||
+ sage: [len(orbit) for orbit in go]
|
||
+ [1, 2, 2, 1, 1, 2, 2, 1]
|
||
+
|
||
+ sage: G.decomposition()
|
||
+ [
|
||
+ Group of Dirichlet characters of modulus 3 over Cyclotomic Field of order
|
||
+ 6 and degree 2,
|
||
+ Group of Dirichlet characters of modulus 7 over Cyclotomic Field of order
|
||
+ 6 and degree 2
|
||
+ ]
|
||
+
|
||
+A seguir, construímos o grupo de caracteres de Dirichlet mod 20, mas
|
||
+com valores em :math:`\QQ(i)`:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: K.<i> = NumberField(x^2+1)
|
||
+ sage: G = DirichletGroup(20,K)
|
||
+ sage: G
|
||
+ Group of Dirichlet characters of modulus 20 over Number Field in i with defining polynomial x^2 + 1
|
||
+
|
||
+Agora calculamos diversos invariantes de ``G``:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: G.gens()
|
||
+ (Dirichlet character modulo 20 of conductor 4 mapping 11 |--> -1, 17 |--> 1,
|
||
+ Dirichlet character modulo 20 of conductor 5 mapping 11 |--> 1, 17 |--> i)
|
||
+
|
||
+ sage: G.unit_gens()
|
||
+ [11, 17]
|
||
+ sage: G.zeta()
|
||
+ i
|
||
+ sage: G.zeta_order()
|
||
+ 4
|
||
+
|
||
+No próximo exemplo criamos um caractere de Dirichlet com valores em um
|
||
+corpo numérico. Nós especificamos explicitamente a escolha da raiz da
|
||
+unidade no terceiro argumento do comando ``DirichletGroup`` abaixo.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x = polygen(QQ, 'x')
|
||
+ sage: K = NumberField(x^4 + 1, 'a'); a = K.0
|
||
+ sage: b = K.gen(); a == b
|
||
+ True
|
||
+ sage: K
|
||
+ Number Field in a with defining polynomial x^4 + 1
|
||
+ sage: G = DirichletGroup(5, K, a); G
|
||
+ Group of Dirichlet characters of modulus 5 over Number Field in a with
|
||
+ defining polynomial x^4 + 1
|
||
+ sage: chi = G.0; chi
|
||
+ Dirichlet character modulo 5 of conductor 5 mapping 2 |--> a^2
|
||
+ sage: [(chi^i)(2) for i in range(4)]
|
||
+ [1, a^2, -1, -a^2]
|
||
+
|
||
+Aqui ``NumberField(x^4 + 1, 'a')`` diz para o Sage usar o símbolo "a"
|
||
+quando imprimir o que é ``K`` (um corpo numérico definido pelo
|
||
+polinômio :math:`x^4 + 1`). O nome "a" não está declarado até então.
|
||
+Uma vez que ``a = K.0`` (ou equivalentemente ``a = K.gen()``) é
|
||
+calculado, o símbolo "a" representa a raiz do polinômio gerador
|
||
+:math:`x^4+1`.
|
||
+
|
||
+Formas Modulares
|
||
+----------------
|
||
+
|
||
+O Sage pode fazer alguns cálculos relacionados a formas modulares,
|
||
+incluindo dimensões, calcular espaços de símbolos modulares,
|
||
+operadores de Hecke, e decomposições.
|
||
+
|
||
+Existem várias funções disponíveis para calcular dimensões de espaços
|
||
+de formas modulares. Por exemplo,
|
||
+
|
||
+::
|
||
+
|
||
+ sage: dimension_cusp_forms(Gamma0(11),2)
|
||
+ 1
|
||
+ sage: dimension_cusp_forms(Gamma0(1),12)
|
||
+ 1
|
||
+ sage: dimension_cusp_forms(Gamma1(389),2)
|
||
+ 6112
|
||
+
|
||
+A seguir ilustramos o cálculo dos operadores de Hecke em um espaço de
|
||
+símbolos modulares de nível :math:`1` e peso :math:`12`.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: M = ModularSymbols(1,12)
|
||
+ sage: M.basis()
|
||
+ ([X^8*Y^2,(0,0)], [X^9*Y,(0,0)], [X^10,(0,0)])
|
||
+ sage: t2 = M.T(2)
|
||
+ sage: t2
|
||
+ Hecke operator T_2 on Modular Symbols space of dimension 3 for Gamma_0(1)
|
||
+ of weight 12 with sign 0 over Rational Field
|
||
+ sage: t2.matrix()
|
||
+ [ -24 0 0]
|
||
+ [ 0 -24 0]
|
||
+ [4860 0 2049]
|
||
+ sage: f = t2.charpoly('x'); f
|
||
+ x^3 - 2001*x^2 - 97776*x - 1180224
|
||
+ sage: factor(f)
|
||
+ (x - 2049) * (x + 24)^2
|
||
+ sage: M.T(11).charpoly('x').factor()
|
||
+ (x - 285311670612) * (x - 534612)^2
|
||
+
|
||
+Podemos também criar espaços para :math:`\Gamma_0(N)` e
|
||
+:math:`\Gamma_1(N)`.
|
||
+
|
||
+
|
||
+::
|
||
+
|
||
+ sage: ModularSymbols(11,2)
|
||
+ Modular Symbols space of dimension 3 for Gamma_0(11) of weight 2 with sign
|
||
+ 0 over Rational Field
|
||
+ sage: ModularSymbols(Gamma1(11),2)
|
||
+ Modular Symbols space of dimension 11 for Gamma_1(11) of weight 2 with
|
||
+ sign 0 and over Rational Field
|
||
+
|
||
+Vamos calcular alguns polinômios característicos e expansões
|
||
+:math:`q`.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: M = ModularSymbols(Gamma1(11),2)
|
||
+ sage: M.T(2).charpoly('x')
|
||
+ x^11 - 8*x^10 + 20*x^9 + 10*x^8 - 145*x^7 + 229*x^6 + 58*x^5 - 360*x^4
|
||
+ + 70*x^3 - 515*x^2 + 1804*x - 1452
|
||
+ sage: M.T(2).charpoly('x').factor()
|
||
+ (x - 3) * (x + 2)^2 * (x^4 - 7*x^3 + 19*x^2 - 23*x + 11)
|
||
+ * (x^4 - 2*x^3 + 4*x^2 + 2*x + 11)
|
||
+ sage: S = M.cuspidal_submodule()
|
||
+ sage: S.T(2).matrix()
|
||
+ [-2 0]
|
||
+ [ 0 -2]
|
||
+ sage: S.q_expansion_basis(10)
|
||
+ [
|
||
+ q - 2*q^2 - q^3 + 2*q^4 + q^5 + 2*q^6 - 2*q^7 - 2*q^9 + O(q^10)
|
||
+ ]
|
||
+
|
||
+Podemos até mesmo calcular espaços de símbolos modulares com carácter.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: G = DirichletGroup(13)
|
||
+ sage: e = G.0^2
|
||
+ sage: M = ModularSymbols(e,2); M
|
||
+ Modular Symbols space of dimension 4 and level 13, weight 2, character
|
||
+ [zeta6], sign 0, over Cyclotomic Field of order 6 and degree 2
|
||
+ sage: M.T(2).charpoly('x').factor()
|
||
+ (x - 2*zeta6 - 1) * (x - zeta6 - 2) * (x + zeta6 + 1)^2
|
||
+ sage: S = M.cuspidal_submodule(); S
|
||
+ Modular Symbols subspace of dimension 2 of Modular Symbols space of
|
||
+ dimension 4 and level 13, weight 2, character [zeta6], sign 0, over
|
||
+ Cyclotomic Field of order 6 and degree 2
|
||
+ sage: S.T(2).charpoly('x').factor()
|
||
+ (x + zeta6 + 1)^2
|
||
+ sage: S.q_expansion_basis(10)
|
||
+ [
|
||
+ q + (-zeta6 - 1)*q^2 + (2*zeta6 - 2)*q^3 + zeta6*q^4 + (-2*zeta6 + 1)*q^5
|
||
+ + (-2*zeta6 + 4)*q^6 + (2*zeta6 - 1)*q^8 - zeta6*q^9 + O(q^10)
|
||
+ ]
|
||
+
|
||
+Aqui está um outro exemplo de como o Sage pode calcular a ação de
|
||
+operadores de Hecke em um espaço de formas modulares.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: T = ModularForms(Gamma0(11),2)
|
||
+ sage: T
|
||
+ Modular Forms space of dimension 2 for Congruence Subgroup Gamma0(11) of
|
||
+ weight 2 over Rational Field
|
||
+ sage: T.degree()
|
||
+ 2
|
||
+ sage: T.level()
|
||
+ 11
|
||
+ sage: T.group()
|
||
+ Congruence Subgroup Gamma0(11)
|
||
+ sage: T.dimension()
|
||
+ 2
|
||
+ sage: T.cuspidal_subspace()
|
||
+ Cuspidal subspace of dimension 1 of Modular Forms space of dimension 2 for
|
||
+ Congruence Subgroup Gamma0(11) of weight 2 over Rational Field
|
||
+ sage: T.eisenstein_subspace()
|
||
+ Eisenstein subspace of dimension 1 of Modular Forms space of dimension 2
|
||
+ for Congruence Subgroup Gamma0(11) of weight 2 over Rational Field
|
||
+ sage: M = ModularSymbols(11); M
|
||
+ Modular Symbols space of dimension 3 for Gamma_0(11) of weight 2 with sign
|
||
+ 0 over Rational Field
|
||
+ sage: M.weight()
|
||
+ 2
|
||
+ sage: M.basis()
|
||
+ ((1,0), (1,8), (1,9))
|
||
+ sage: M.sign()
|
||
+ 0
|
||
+
|
||
+Denote por :math:`T_p` os operadores de Hecke usuais (:math:`p`
|
||
+primo). Como os operadores de Hecke :math:`T_2`, :math:`T_3`,
|
||
+e :math:`T_5` agem sobre o espaço de símbolos modulares?
|
||
+
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: M.T(2).matrix()
|
||
+ [ 3 0 -1]
|
||
+ [ 0 -2 0]
|
||
+ [ 0 0 -2]
|
||
+ sage: M.T(3).matrix()
|
||
+ [ 4 0 -1]
|
||
+ [ 0 -1 0]
|
||
+ [ 0 0 -1]
|
||
+ sage: M.T(5).matrix()
|
||
+ [ 6 0 -1]
|
||
+ [ 0 1 0]
|
||
+ [ 0 0 1]
|
||
diff --git a/doc/pt/tutorial/tour_algebra.rst b/doc/pt/tutorial/tour_algebra.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/tour_algebra.rst
|
||
@@ -0,0 +1,414 @@
|
||
+Álgebra Elementar e Cálculo
|
||
+===========================
|
||
+
|
||
+O Sage pode realizar diversos cálculos em álgebra elementar e cálculo
|
||
+diferencial e integral: por exemplo, encontrar soluções de equações,
|
||
+diferenciar, integrar, e calcular a transformada de Laplace. Veja a
|
||
+documentação em `Sage Constructions
|
||
+<http://www.sagemath.org/doc/constructions/>`_ para mais exemplos.
|
||
+
|
||
+Resolvendo equações
|
||
+-------------------
|
||
+
|
||
+Resolvendo equações exatamente
|
||
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
+
|
||
+A função ``solve`` resolve equações. Para usá-la, primeiro especifique
|
||
+algumas variáveis; então os argumentos de ``solve`` são uma equação
|
||
+(ou um sistema de equações), juntamente com as variáveis para as
|
||
+quais resolver:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x = var('x')
|
||
+ sage: solve(x^2 + 3*x + 2, x)
|
||
+ [x == -2, x == -1]
|
||
+
|
||
+Você pode resolver equações para uma variável em termos das outras:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x, b, c = var('x b c')
|
||
+ sage: solve([x^2 + b*x + c == 0],x)
|
||
+ [x == -1/2*b - 1/2*sqrt(b^2 - 4*c), x == -1/2*b + 1/2*sqrt(b^2 - 4*c)]
|
||
+
|
||
+Você pode resolver para diversas variáveis:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x, y = var('x, y')
|
||
+ sage: solve([x+y==6, x-y==4], x, y)
|
||
+ [[x == 5, y == 1]]
|
||
+
|
||
+O seguinte exemplo, que mostra como usar o Sage para resolver um
|
||
+sistema de equações não-lineares, foi sugerido por Jason Grout:
|
||
+primeiro, resolvemos o sistemas simbolicamente:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: var('x y p q')
|
||
+ (x, y, p, q)
|
||
+ sage: eq1 = p+q==9
|
||
+ sage: eq2 = q*y+p*x==-6
|
||
+ sage: eq3 = q*y^2+p*x^2==24
|
||
+ sage: solve([eq1,eq2,eq3,p==1],p,q,x,y)
|
||
+ [[p == 1, q == 8, x == -4/3*sqrt(10) - 2/3, y == 1/6*sqrt(2)*sqrt(5) - 2/3],
|
||
+ [p == 1, q == 8, x == 4/3*sqrt(10) - 2/3, y == -1/6*sqrt(2)*sqrt(5) - 2/3]]
|
||
+
|
||
+Para obter soluções numéricas aproximadas, podemos usar:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: solns = solve([eq1,eq2,eq3,p==1],p,q,x,y, solution_dict=True)
|
||
+ sage: [[s[p].n(30), s[q].n(30), s[x].n(30), s[y].n(30)] for s in solns]
|
||
+ [[1.0000000, 8.0000000, -4.8830369, -0.13962039],
|
||
+ [1.0000000, 8.0000000, 3.5497035, -1.1937129]]
|
||
+
|
||
+(A função ``n`` imprime uma aproximação numérica, e o argumento é o
|
||
+número de bits de precisão.)
|
||
+
|
||
+Resolvendo Equações Numericamente
|
||
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||
+
|
||
+Frequentemente, ``solve`` não será capaz de encontrar uma solução
|
||
+exata para uma equação ou sistema de equações. Nesse caso, você pode
|
||
+usar ``find_root`` para encontrar uma solução numérica. Por exemplo,
|
||
+``solve`` não encontra uma solução para a equação abaixo::
|
||
+
|
||
+ sage: theta = var('theta')
|
||
+ sage: solve(cos(theta)==sin(theta), theta)
|
||
+ [sin(theta) == cos(theta)]
|
||
+
|
||
+Por outro lado, podemos usar ``find_root`` para encontrar uma solução
|
||
+para a equação acima no intervalo :math:`0 < \phi < \pi/2`::
|
||
+
|
||
+ sage: phi = var('phi')
|
||
+ sage: find_root(cos(phi)==sin(phi),0,pi/2)
|
||
+ 0.785398163397448...
|
||
+
|
||
+Diferenciação, Integração, etc.
|
||
+-------------------------------
|
||
+
|
||
+O Sage é capaz de diferenciar e integrar diversas funções. Por
|
||
+exemplo, para diferenciar :math:`\sin(u)` com respeito a :math:`u`,
|
||
+faça o seguinte:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: u = var('u')
|
||
+ sage: diff(sin(u), u)
|
||
+ cos(u)
|
||
+
|
||
+Para calcular a quarta derivada de :math:`\sin(x^2)`:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: diff(sin(x^2), x, 4)
|
||
+ 16*x^4*sin(x^2) - 48*x^2*cos(x^2) - 12*sin(x^2)
|
||
+
|
||
+Para calcular as derivadas parciais de :math:`x^2+17y^2` com respeito
|
||
+a *x* e *y*, respectivamente:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x, y = var('x,y')
|
||
+ sage: f = x^2 + 17*y^2
|
||
+ sage: f.diff(x)
|
||
+ 2*x
|
||
+ sage: f.diff(y)
|
||
+ 34*y
|
||
+
|
||
+Passamos agora para integrais, tanto indefinidas como definidas. Para
|
||
+calcular :math:`\int x\sin(x^2)\, dx` e :math:`\int_0^1
|
||
+\frac{x}{x^2+1}\, dx`:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: integral(x*sin(x^2), x)
|
||
+ -1/2*cos(x^2)
|
||
+ sage: integral(x/(x^2+1), x, 0, 1)
|
||
+ 1/2*log(2)
|
||
+
|
||
+Para calcular a decomposição em frações parciais de
|
||
+:math:`\frac{1}{x^2-1}`:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: f = 1/((1+x)*(x-1))
|
||
+ sage: f.partial_fraction(x)
|
||
+ 1/2/(x - 1) - 1/2/(x + 1)
|
||
+
|
||
+.. _section-systems:
|
||
+
|
||
+Resolvendo Equações Diferenciais
|
||
+--------------------------------
|
||
+
|
||
+Você pode usar o Sage para investigar equações diferenciais
|
||
+ordinárias. Para resolver a equação :math:`x'+x-1=0`:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: t = var('t') # define a variable t
|
||
+ sage: x = function('x',t) # define x to be a function of that variable
|
||
+ sage: DE = diff(x, t) + x - 1
|
||
+ sage: desolve(DE, [x,t])
|
||
+ (c + e^t)*e^(-t)
|
||
+
|
||
+Esse método usa a interface do Sage para o Maxima [Max]_. Logo, o
|
||
+formato dos resultados é um pouco diferente de outros cálculos
|
||
+realizados no Sage. Nesse caso, o resultado diz que a solução geral da
|
||
+equação diferencial é :math:`x(t) = e^{-t}(e^{t}+c)`.
|
||
+
|
||
+Você pode calcular a transformada de Laplace também; a transformada de
|
||
+Laplace de :math:`t^2e^t -\sin(t)` é calculada da seguinte forma:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: s = var("s")
|
||
+ sage: t = var("t")
|
||
+ sage: f = t^2*exp(t) - sin(t)
|
||
+ sage: f.laplace(t,s)
|
||
+ 2/(s - 1)^3 - 1/(s^2 + 1)
|
||
+
|
||
+A seguir, um exemplo mais complicado. O deslocamento, com respeito à
|
||
+posição de equilíbrio, de duas massas presas a uma parede através de
|
||
+molas, conforme a figura abaixo,
|
||
+
|
||
+::
|
||
+
|
||
+ |------\/\/\/\/\---|massa1|----\/\/\/\/\/----|massa2|
|
||
+ mola1 mola2
|
||
+
|
||
+é modelado pelo sistema de equações diferenciais de segunda ordem
|
||
+
|
||
+.. math::
|
||
+
|
||
+ m_1 x_1'' + (k_1+k_2) x_1 - k_2 x_2 = 0
|
||
+
|
||
+ m_2 x_2''+ k_2 (x_2-x_1) = 0,
|
||
+
|
||
+
|
||
+
|
||
+onde, para :math:`i=1,2`, :math:`m_{i}` é a massa do objeto *i*,
|
||
+:math:`x_{i}` é o deslocamento com respeito à posição de equilíbrio da
|
||
+massa *i*, e :math:`k_{i}` é a constante de mola para a mola *i*.
|
||
+
|
||
+**Exemplo:** Use o Sage para resolver o problema acima com
|
||
+:math:`m_{1}=2`, :math:`m_{2}=1`, :math:`k_{1}=4`,
|
||
+:math:`k_{2}=2`, :math:`x_{1}(0)=3`, :math:`x_{1}'(0)=0`,
|
||
+:math:`x_{2}(0)=3`, :math:`x_{2}'(0)=0`.
|
||
+
|
||
+Solução: Primeiramente, calcule a transformada de Laplace da primeira
|
||
+equação (usando a notação :math:`x=x_{1}`, :math:`y=x_{2}`):
|
||
+
|
||
+::
|
||
+
|
||
+ sage: de1 = maxima("2*diff(x(t),t, 2) + 6*x(t) - 2*y(t)")
|
||
+ sage: lde1 = de1.laplace("t","s"); lde1
|
||
+ 2*(-?%at('diff(x(t),t,1),t=0)+s^2*'laplace(x(t),t,s)-x(0)*s)-2*'laplace(y(t),t,s)+6*'laplace(x(t),t,s)
|
||
+
|
||
+O resultado é um pouco difícil de ler, mas diz que
|
||
+
|
||
+.. math:: -2x'(0) + 2s^2*X(s) - 2sx(0) - 2Y(s) + 6X(s) = 0
|
||
+
|
||
+
|
||
+(onde a transformada de Laplace de uma função em letra minúscula
|
||
+:math:`x(t)` é a função em letra maiúscula :math:`X(s)`). Agora,
|
||
+calcule a transformada de Laplace da segunda equação:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: de2 = maxima("diff(y(t),t, 2) + 2*y(t) - 2*x(t)")
|
||
+ sage: lde2 = de2.laplace("t","s"); lde2
|
||
+ -?%at('diff(y(t),t,1),t=0)+s^2*'laplace(y(t),t,s)+2*'laplace(y(t),t,s)-2*'laplace(x(t),t,s)-y(0)*s
|
||
+
|
||
+O resultado significa que
|
||
+
|
||
+.. math:: -Y'(0) + s^2Y(s) + 2Y(s) - 2X(s) - sy(0) = 0.
|
||
+
|
||
+
|
||
+Em seguida, substitua a condição inicial para :math:`x(0)`,
|
||
+:math:`x'(0)`, :math:`y(0)`, e :math:`y'(0)`, e resolva as equações
|
||
+resultantes:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: var('s X Y')
|
||
+ (s, X, Y)
|
||
+ sage: eqns = [(2*s^2+6)*X-2*Y == 6*s, -2*X +(s^2+2)*Y == 3*s]
|
||
+ sage: solve(eqns, X,Y)
|
||
+ [[X == 3*(s^3 + 3*s)/(s^4 + 5*s^2 + 4),
|
||
+ Y == 3*(s^3 + 5*s)/(s^4 + 5*s^2 + 4)]]
|
||
+
|
||
+Agora calcule a transformada de Laplace inversa para obter a resposta:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: var('s t')
|
||
+ (s, t)
|
||
+ sage: inverse_laplace((3*s^3 + 9*s)/(s^4 + 5*s^2 + 4),s,t)
|
||
+ cos(2*t) + 2*cos(t)
|
||
+ sage: inverse_laplace((3*s^3 + 15*s)/(s^4 + 5*s^2 + 4),s,t)
|
||
+ -cos(2*t) + 4*cos(t)
|
||
+
|
||
+Portanto, a solução é
|
||
+
|
||
+.. math:: x_1(t) = \cos(2t) + 2\cos(t), \quad x_2(t) = 4\cos(t) - \cos(2t).
|
||
+
|
||
+
|
||
+Ela pode ser representada em um gráfico parametricamente usando os
|
||
+comandos
|
||
+
|
||
+::
|
||
+
|
||
+ sage: t = var('t')
|
||
+ sage: P = parametric_plot((cos(2*t) + 2*cos(t), 4*cos(t) - cos(2*t) ),\
|
||
+ ... (t, 0, 2*pi), rgbcolor=hue(0.9))
|
||
+ sage: show(P)
|
||
+
|
||
+As componentes individuais podem ser representadas em gráfico usando
|
||
+
|
||
+::
|
||
+
|
||
+ sage: t = var('t')
|
||
+ sage: p1 = plot(cos(2*t) + 2*cos(t), (t,0, 2*pi), rgbcolor=hue(0.3))
|
||
+ sage: p2 = plot(4*cos(t) - cos(2*t), (t,0, 2*pi), rgbcolor=hue(0.6))
|
||
+ sage: show(p1 + p2)
|
||
+
|
||
+Leia mais sobre gráficos em :ref:`section-plot`. Veja a seção 5.5 de
|
||
+[NagleEtAl2004]_ (em inglês) para mais informações sobre equações
|
||
+diferenciais.
|
||
+
|
||
+
|
||
+Método de Euler para Sistemas de Equações Diferenciais
|
||
+------------------------------------------------------
|
||
+
|
||
+No próximo exemplo, vamos ilustrar o método de Euler para EDOs de
|
||
+primeira e segunda ordem. Primeiro, relembramos a ideia básica para
|
||
+equações de primeira ordem. Dado um problema de valor inicial da forma
|
||
+
|
||
+.. math::
|
||
+
|
||
+ y'=f(x,y), \quad y(a)=c,
|
||
+
|
||
+queremos encontrar o valor aproximado da solução em :math:`x=b` com
|
||
+:math:`b>a`.
|
||
+
|
||
+Da definição de derivada segue que
|
||
+
|
||
+.. math:: y'(x) \approx \frac{y(x+h)-y(x)}{h},
|
||
+
|
||
+
|
||
+onde :math:`h>0` é um número pequeno. Isso, juntamente com a equação
|
||
+diferencial, implica que :math:`f(x,y(x))\approx
|
||
+\frac{y(x+h)-y(x)}{h}`. Agora resolvemos para :math:`y(x+h)`:
|
||
+
|
||
+.. math:: y(x+h) \approx y(x) + h*f(x,y(x)).
|
||
+
|
||
+
|
||
+Se chamarmos :math:`h f(x,y(x))` de "termo de correção", :math:`y(x)`
|
||
+de "valor antigo de *y*", e :math:`y(x+h)` de "novo valor de *y*",
|
||
+então essa aproximação pode ser reescrita como
|
||
+
|
||
+.. math:: y_{novo} \approx y_{antigo} + h*f(x,y_{antigo}).
|
||
+
|
||
+
|
||
+Se dividirmos o intervalo de *a* até *b* em *n* partes, de modo que
|
||
+:math:`h=\frac{b-a}{n}`, então podemos construir a seguinte tabela.
|
||
+
|
||
+============== ================== ================
|
||
+:math:`x` :math:`y` :math:`hf(x,y)`
|
||
+============== ================== ================
|
||
+:math:`a` :math:`c` :math:`hf(a,c)`
|
||
+:math:`a+h` :math:`c+hf(a,c)` ...
|
||
+:math:`a+2h` ...
|
||
+...
|
||
+:math:`b=a+nh` ??? ...
|
||
+============== ================== ================
|
||
+
|
||
+
|
||
+O objetivo é completar os espaços em branco na tabela, em uma linha
|
||
+por vez, até atingirmos ???, que é a aproximação para :math:`y(b)`
|
||
+usando o método de Euler.
|
||
+
|
||
+A ideia para sistemas de EDOs é semelhante.
|
||
+
|
||
+**Exemplo:** Aproxime numericamente :math:`z(t)` em :math:`t=1` usando
|
||
+4 passos do método de Euler, onde :math:`z''+tz'+z=0`, :math:`z(0)=1`,
|
||
+:math:`z'(0)=0`.
|
||
+
|
||
+Devemos reduzir a EDO de segunda ordem a um sistema de duas EDOs de
|
||
+primeira ordem (usando :math:`x=z`, :math:`y=z'`) e aplicar o método
|
||
+de Euler:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: t,x,y = PolynomialRing(RealField(10),3,"txy").gens()
|
||
+ sage: f = y; g = -x - y * t
|
||
+ sage: eulers_method_2x2(f,g, 0, 1, 0, 1/4, 1)
|
||
+ t x h*f(t,x,y) y h*g(t,x,y)
|
||
+ 0 1 0.00 0 -0.25
|
||
+ 1/4 1.0 -0.062 -0.25 -0.23
|
||
+ 1/2 0.94 -0.12 -0.48 -0.17
|
||
+ 3/4 0.82 -0.16 -0.66 -0.081
|
||
+ 1 0.65 -0.18 -0.74 0.022
|
||
+
|
||
+Portanto, :math:`z(1)\approx 0.65`.
|
||
+
|
||
+Podemos também representar em um gráfico os pontos :math:`(x,y)` para
|
||
+obter uma figura da solução aproximada. A função
|
||
+``eulers_method_2x2_plot`` fará isso; para usá-la, precisamos definir
|
||
+funções *f* e *g* que recebam um argumento com três coordenadas (*t*,
|
||
+*x*, *y*).
|
||
+
|
||
+::
|
||
+
|
||
+ sage: f = lambda z: z[2] # f(t,x,y) = y
|
||
+ sage: g = lambda z: -sin(z[1]) # g(t,x,y) = -sin(x)
|
||
+ sage: P = eulers_method_2x2_plot(f,g, 0.0, 0.75, 0.0, 0.1, 1.0)
|
||
+
|
||
+A esta altura, ``P`` armazena dois gráficos: ``P[0]``, o gráfico de
|
||
+*x* versus *t*, e ``P[1]``, o gráfico de *y* versus *t*. Podemos
|
||
+visualizar os dois gráficos da seguinte forma:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: show(P[0] + P[1])
|
||
+
|
||
+(Para mais sobre gráficos, veja :ref:`section-plot`.)
|
||
+
|
||
+Funções Especiais
|
||
+-----------------
|
||
+
|
||
+Diversos polinômios ortogonais e funções especiais estão
|
||
+implementadas, usando tanto o PARI [GP]_ como o Maxima [Max]_. Isso
|
||
+está documentado nas seções apropriadas ("Orthogonal polynomials" and
|
||
+"Special functions", respectivamente) do manual de referência do Sage
|
||
+(em inglês).
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x = polygen(QQ, 'x')
|
||
+ sage: chebyshev_U(2,x)
|
||
+ 4*x^2 - 1
|
||
+ sage: bessel_I(1,1,"pari",250)
|
||
+ 0.56515910399248502720769602760986330732889962162109200948029448947925564096
|
||
+ sage: bessel_I(1,1)
|
||
+ 0.565159103992485
|
||
+ sage: bessel_I(2,1.1,"maxima") # last few digits are random
|
||
+ 0.16708949925104899
|
||
+
|
||
+No momento, essas funções estão disponíveis na interface do Sage
|
||
+apenas para uso numérico. Para uso simbólico, use a interface do
|
||
+Maxima diretamente, como no seguinte exemplo:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: maxima.eval("f:bessel_y(v, w)")
|
||
+ 'bessel_y(v,w)'
|
||
+ sage: maxima.eval("diff(f,w)")
|
||
+ '(bessel_y(v-1,w)-bessel_y(v+1,w))/2'
|
||
diff --git a/doc/pt/tutorial/tour_assignment.rst b/doc/pt/tutorial/tour_assignment.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/tour_assignment.rst
|
||
@@ -0,0 +1,119 @@
|
||
+Atribuição, Igualdade, e Aritmética
|
||
+===================================
|
||
+
|
||
+Com pequenas exceções, o Sage utiliza a linguagem de programação
|
||
+Python, logo a maioria dos livros de introdução ao Python vão ajudá-lo
|
||
+a aprender Sage.
|
||
+
|
||
+O Sage usa ``=`` para atribuição, e usa ``==``, ``<=``, ``>=``, ``<``
|
||
+e ``>`` para comparação:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: a = 5
|
||
+ sage: a
|
||
+ 5
|
||
+ sage: 2 == 2
|
||
+ True
|
||
+ sage: 2 == 3
|
||
+ False
|
||
+ sage: 2 < 3
|
||
+ True
|
||
+ sage: a == 5
|
||
+ True
|
||
+
|
||
+O Sage fornece todas as operações matemáticas básicas:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: 2**3 # ** means exponent
|
||
+ 8
|
||
+ sage: 2^3 # ^ is a synonym for ** (unlike in Python)
|
||
+ 8
|
||
+ sage: 10 % 3 # for integer arguments, % means mod, i.e., remainder
|
||
+ 1
|
||
+ sage: 10/4
|
||
+ 5/2
|
||
+ sage: 10//4 # for integer arguments, // returns the integer quotient
|
||
+ 2
|
||
+ sage: 4 * (10 // 4) + 10 % 4 == 10
|
||
+ True
|
||
+ sage: 3^2*4 + 2%5
|
||
+ 38
|
||
+
|
||
+O cálculo de uma expressão como ``3^2*4 + 2%5`` depende da ordem em
|
||
+que as operações são aplicadas; isso é especificado na "tabela de
|
||
+precedência" em :ref:`section-precedence`.
|
||
+
|
||
+O Sage também fornece várias funções matemáticas básicas; aqui estão
|
||
+apenas alguns exemplos:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: sqrt(3.4)
|
||
+ 1.84390889145858
|
||
+ sage: sin(5.135)
|
||
+ -0.912021158525540
|
||
+ sage: sin(pi/3)
|
||
+ 1/2*sqrt(3)
|
||
+
|
||
+Como o último exemplo mostra, algumas expressões matemáticas retornam
|
||
+valores 'exatos' em vez de aproximações numéricas. Para obter uma
|
||
+aproximação numérica, use a função ``n`` ou o método ``n`` (ambos
|
||
+possuem um nome longo, ``numerical_approx``, e a função ``N`` é o
|
||
+mesma que ``n``). Essas funções aceitam o argumento opcional
|
||
+``prec``, que é o número de bits de precisão requisitado, e
|
||
+``digits``, que é o número de dígitos decimais de precisão
|
||
+requisitado; o padrão é 53 bits de precisão.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: exp(2)
|
||
+ e^2
|
||
+ sage: n(exp(2))
|
||
+ 7.38905609893065
|
||
+ sage: sqrt(pi).numerical_approx()
|
||
+ 1.77245385090552
|
||
+ sage: sin(10).n(digits=5)
|
||
+ -0.54402
|
||
+ sage: N(sin(10),digits=10)
|
||
+ -0.5440211109
|
||
+ sage: numerical_approx(pi, prec=200)
|
||
+ 3.1415926535897932384626433832795028841971693993751058209749
|
||
+
|
||
+O Python é uma linguagem "dinâmicamente digitada" (dynamically typed),
|
||
+portanto o valor referido por cada variável possui um tipo associado a
|
||
+ele, mas uma variável pode possuir valores de qualquer tipo em
|
||
+determinado escopo:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: a = 5 # a is an integer
|
||
+ sage: type(a)
|
||
+ <type 'sage.rings.integer.Integer'>
|
||
+ sage: a = 5/3 # now a is a rational number
|
||
+ sage: type(a)
|
||
+ <type 'sage.rings.rational.Rational'>
|
||
+ sage: a = 'hello' # now a is a string
|
||
+ sage: type(a)
|
||
+ <type 'str'>
|
||
+
|
||
+A linguagem de programação C, que é "estaticamente digitada"
|
||
+(statically typed), é muito diferente; uma variável que foi declarada
|
||
+como int pode apenas armazenar um int em seu escopo.
|
||
+
|
||
+Uma potencial fonte de confusão em Python é que um inteiro literal que
|
||
+começa com zero é tratado como um número octal, isto é, um número na
|
||
+base 8.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: 011
|
||
+ 9
|
||
+ sage: 8 + 1
|
||
+ 9
|
||
+ sage: n = 011
|
||
+ sage: n.str(8) # string representation of n in base 8
|
||
+ '11'
|
||
+
|
||
+Isso é consistente com a linguagem de programação C.
|
||
diff --git a/doc/pt/tutorial/tour_coercion.rst b/doc/pt/tutorial/tour_coercion.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/tour_coercion.rst
|
||
@@ -0,0 +1,405 @@
|
||
+.. -*- coding: utf-8 -*-
|
||
+
|
||
+.. _section-coercion:
|
||
+
|
||
+============================
|
||
+Parentes, Conversão e Coação
|
||
+============================
|
||
+
|
||
+Esta seção pode parecer mais técnica do que as anteriores, mas
|
||
+acreditamos que é importante entender o significado de parentes e
|
||
+coação de modo a usar anéis e outras estruturas algébricas no Sage de
|
||
+forma efetiva e eficiente.
|
||
+
|
||
+Note que vamos explicar algumas noções, mas não vamos mostrar aqui
|
||
+como implementá-las. Um tutorial voltado à implementação está
|
||
+disponível (em inglês) como um
|
||
+`arquivo Sage <http://flask.sagenb.org/home/pub/82/>`_.
|
||
+
|
||
+Elementos
|
||
+---------
|
||
+
|
||
+Caso se queira implementar um anel em Python, uma primeira aproximação
|
||
+seria criar uma classe para os elementos ``X`` do anel e adicionar os
|
||
+requeridos métodos (com underscores duplos) ``__add__``, ``__sub``,
|
||
+``__mul__``, obviamente garantindo que os axiomas de anel são
|
||
+verificados.
|
||
+
|
||
+Como o Python é uma linguagem "strongly typed" (ainda que "dynamically
|
||
+typed"), poderia-se, pelo menos a princípio, esperar-se que fosse
|
||
+implementado em Python uma classe para cada anel. No final das contas,
|
||
+o Python contém um tipo ``<int>`` para os inteiros, um tipo
|
||
+``<float>`` para os reais, e assim por diante. Mas essa estratégia
|
||
+logo encontra uma limitação: Existe um número infinito de anéis, e não
|
||
+se pode implementar um número infinito de classes.
|
||
+
|
||
+Em vez disso, poderia-se criar uma hierarquia de classes projetada
|
||
+para implementar elementos de estruturas algébricas ubíquas, tais como
|
||
+grupos, anéis, anéis comutativos, corpos, álgebras, e assim por
|
||
+diante.
|
||
+
|
||
+Mas isso significa que elementos de anéis bastante diferentes podem
|
||
+ter o mesmo tipo.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: P.<x,y> = GF(3)[]
|
||
+ sage: Q.<a,b> = GF(4,'z')[]
|
||
+ sage: type(x)==type(a)
|
||
+ True
|
||
+
|
||
+Por outro lado, poderia-se ter também classes diferentes em Python
|
||
+fornecendo implementações diferentes da mesma estrutura matemática
|
||
+(por exemplo, matrizes densas versus matrizes esparsas).
|
||
+
|
||
+::
|
||
+
|
||
+ sage: P.<a> = PolynomialRing(ZZ)
|
||
+ sage: Q.<b> = PolynomialRing(ZZ, sparse=True)
|
||
+ sage: R.<c> = PolynomialRing(ZZ, implementation='NTL')
|
||
+ sage: type(a); type(b); type(c)
|
||
+ <type 'sage.rings.polynomial.polynomial_integer_dense_flint.Polynomial_integer_dense_flint'>
|
||
+ <class 'sage.rings.polynomial.polynomial_element_generic.Polynomial_generic_sparse'>
|
||
+ <type 'sage.rings.polynomial.polynomial_integer_dense_ntl.Polynomial_integer_dense_ntl'>
|
||
+
|
||
+Isso apresenta dois problemas: Por um lado, se tivéssemos elementos
|
||
+que são duas instancias da mesma classe, então poderia-se esperar que
|
||
+o método ``__add__`` dessas classes permitisse somá-los; mas não
|
||
+se deseja isso, se os elementos pertencem a anéis bastante diferentes.
|
||
+Por outro lado, se possui-se elementos que pertencem a implementações
|
||
+diferentes do mesmo anel, então gostaria-se de somá-los, mas isso não
|
||
+pode ser feito diretamente se eles pertencem a classes diferentes em
|
||
+Python.
|
||
+
|
||
+A solução para esses problemas é chamada coação e será explicada a
|
||
+seguir.
|
||
+
|
||
+Todavia, é essencial que cada elemento saiba a qual pertence. Isso
|
||
+está disponível através método ``parent()``:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: a.parent(); b.parent(); c.parent()
|
||
+ Univariate Polynomial Ring in a over Integer Ring
|
||
+ Sparse Univariate Polynomial Ring in b over Integer Ring
|
||
+ Univariate Polynomial Ring in c over Integer Ring (using NTL)
|
||
+
|
||
+
|
||
+Parentes e Categorias
|
||
+---------------------
|
||
+
|
||
+De forma similar à hierarquia de classes em Python voltada para
|
||
+elementos de estruturas algébricas, o Sage também fornece classes para
|
||
+as estruturas algébricas que contém esses elementos. Estruturas
|
||
+contendo elementos são chamadas "estruturas parente" no Sage, e existe
|
||
+uma classe básica para elas. Paralelamente à hierarquia de noções
|
||
+matemáticas, tem-se uma hierarquia de classes, a saber, para
|
||
+conjuntos, anéis, corpos e assim por diante:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: isinstance(QQ,Field)
|
||
+ True
|
||
+ sage: isinstance(QQ, Ring)
|
||
+ True
|
||
+ sage: isinstance(ZZ,Field)
|
||
+ False
|
||
+ sage: isinstance(ZZ, Ring)
|
||
+ True
|
||
+
|
||
+Em álgebra, objetos que compartilham o mesmo tipo de estruturas
|
||
+algébricas são agrupados nas assim chamadas "categorias". Logo, existe
|
||
+uma analogia aproximada entre a hierarquia de classes em Sage e a
|
||
+hierarquia de categorias. Todavia, essa analogia de classes em Python
|
||
+e categorias não deve ser enfatizada demais. No final das contas,
|
||
+categorias matemáticas também são implementadas no Sage:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: Rings()
|
||
+ Category of rings
|
||
+ sage: ZZ.category()
|
||
+ Category of euclidean domains
|
||
+ sage: ZZ.category().is_subcategory(Rings())
|
||
+ True
|
||
+ sage: ZZ in Rings()
|
||
+ True
|
||
+ sage: ZZ in Fields()
|
||
+ False
|
||
+ sage: QQ in Fields()
|
||
+ True
|
||
+
|
||
+Enquanto a hierarquia de classes no Sage é centrada nos detalhes de
|
||
+implementação, a construção de categorias em Sage é mais centrada
|
||
+na estrutura matemática. É possível implementar métodos e testes
|
||
+gerais independentemente de uma implementação específica nas
|
||
+categorias.
|
||
+
|
||
+Estruturas parentes em Sage são supostamente objetos únicos em Python.
|
||
+Por exemplo, uma vez que um anel de polinômios sobre um certo anel
|
||
+base e com uma certa lista de geradores é criada, o resultado é
|
||
+arquivado:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: RR['x','y'] is RR['x','y']
|
||
+ True
|
||
+
|
||
+
|
||
+Tipos versus Parentes
|
||
+---------------------
|
||
+
|
||
+O tipo ``RingElement`` não deve ser confundido com a noção matemática
|
||
+de elemento de anel; por razões práticas, as vezes um objeto é uma
|
||
+instancia de ``RingElement`` embora ele não pertence a um anel:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: M = Matrix(ZZ,2,3); M
|
||
+ [0 0 0]
|
||
+ [0 0 0]
|
||
+ sage: isinstance(M, RingElement)
|
||
+ True
|
||
+
|
||
+Enquanto *parentes* são únicos, elementos iguais de um parente em Sage
|
||
+não são necessariamente idênticos. Isso contrasta com o comportamento
|
||
+do Python para alguns (embora não todos) inteiros:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: int(1) is int(1) # Python int
|
||
+ True
|
||
+ sage: int(-15) is int(-15)
|
||
+ False
|
||
+ sage: 1 is 1 # Sage Integer
|
||
+ False
|
||
+
|
||
+É importante observar que elementos de anéis diferentes em geral não
|
||
+podem ser distinguidos pelos seus tipos, mas sim por seus parentes:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: a = GF(2)(1)
|
||
+ sage: b = GF(5)(1)
|
||
+ sage: type(a) is type(b)
|
||
+ True
|
||
+ sage: parent(a)
|
||
+ Finite Field of size 2
|
||
+ sage: parent(b)
|
||
+ Finite Field of size 5
|
||
+
|
||
+Logo, de um ponto de vista algébrico, **o parente de um elemento é
|
||
+mais importante do que seu tipo.**
|
||
+
|
||
+Conversão versus Coação
|
||
+-----------------------
|
||
+
|
||
+Em alguns casos é possível converter um elemento de uma estrutura
|
||
+parente em um elemento de uma outra estrutura parente. Tal conversão
|
||
+pode ser tanto explícita como implícita (essa é chamada *coação*).
|
||
+
|
||
+O leitor pode conhecer as noções de *conversão de tipo* e *coação de
|
||
+tipo* como na linguagem C, por exemplo. Existem noções de *conversão*
|
||
+e *coação* em Sage também. Mas as noções em Sage são centradas em
|
||
+*parentes*, não em tipos. Então, por favor não confunda conversão de
|
||
+tipo em C com conversão em Sage!
|
||
+
|
||
+Aqui se encontra uma breve apresentação. Para uma descrição detalhada
|
||
+e informações sobre a implementação, referimos à seção sobre coação no
|
||
+manual de referência e para o `arquivo tutorial
|
||
+<http://flask.sagenb.org/home/pub/82/>`_.
|
||
+
|
||
+Existem duas possibilidades extremas com respeito à possibilidade de
|
||
+fazer aritmética com elementos de *anéis diferentes*:
|
||
+
|
||
+* Anéis diferentes são mundos diferentes, e não faz nenhum sentido
|
||
+ somar ou multiplicar elementos de anéis diferentes; mesmo ``1 +
|
||
+ 1/2`` não faz sentido, pois o primeiro somando é um inteiro e o
|
||
+ segundo um racional.
|
||
+
|
||
+Ou
|
||
+
|
||
+* Se um elemento ``r1`` de uma aner ``R1`` pode de alguma forma ser
|
||
+ interpretado em um outro anel ``R2``, então todas as operações
|
||
+ aritméticas envolvendo ``r1`` e qualquer elemento de ``R2`` são
|
||
+ permitidas. O elemento neutro da multiplicação existe em todos os
|
||
+ corpos e em vários anéis, e eles devem ser todos iguais.
|
||
+
|
||
+O Sage faz uma concessão. Se ``P1`` e ``P2`` são estruturas parentes e
|
||
+``p1`` é um elemento de ``P1``, então o usuário pode explicitamente
|
||
+perguntar por uma interpretação de ``p1`` em ``P2``. Isso pode não
|
||
+fazer sentido em todos os casos ou não estar definido para todos os
|
||
+elementos de ``P1``, e fica a cargo do usuário assegurar que isso faz
|
||
+sentido. Nos referimos a isso como **conversão**:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: a = GF(2)(1)
|
||
+ sage: b = GF(5)(1)
|
||
+ sage: GF(5)(a) == b
|
||
+ True
|
||
+ sage: GF(2)(b) == a
|
||
+ True
|
||
+
|
||
+Todavia, uma conversão *implícita* (ou automática) ocorrerá apenas se
|
||
+puder ser feita *completamente* e *consistentemente*. Rigor matemático
|
||
+é essencial nesse ponto.
|
||
+
|
||
+Uma tal conversão implícita é chamada **coação**. Se coação for
|
||
+definida, então deve coincidir com conversão. Duas condições devem ser
|
||
+satisfeitas para uma coação ser definida:
|
||
+
|
||
+#. Uma coação de ``P1`` para ``P2`` deve ser dada por uma estrutura
|
||
+ que preserva mapeamentos (por exemplo, um homomorfismo de anéis).
|
||
+ Não é suficiente que *alguns* elementos de ``P1`` possam ser
|
||
+ mapeados em ``P2``, e o mapa deve respeitar a estrutura algébrica
|
||
+ de ``P1``.
|
||
+#. A escolha desses mapas de coação deve ser consistente: Se ``P3`` é
|
||
+ uma terceira estrutura parente, então a composição da coação
|
||
+ adotada de ``P1`` para ``P2`` com a coação de ``P2`` para ``P3``
|
||
+ deve coincidir com a coação adotada de ``P1`` para ``P3``. Em
|
||
+ particular, se existir uma coação de ``P1`` para ``P2`` e ``P2``
|
||
+ para ``P1``, a composição deve ser o mapa identidade em ``P1``.
|
||
+
|
||
+Logo, embora é possível converter cada elemento de ``GF(2)`` para
|
||
+``GF(5)``, não há coação, pois não existe homomorfismo de anel entre
|
||
+``GF(2)`` e ``GF(5)``.
|
||
+
|
||
+O segundo aspecto - consistência - é um pouco mais difícil de
|
||
+explicar. Vamos ilustrá-lo usando anéis de polinômios em mais de uma
|
||
+variável. Em aplicações, certamente faz mais sentido ter coações que
|
||
+preservam nomes. Então temos:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R1.<x,y> = ZZ[]
|
||
+ sage: R2 = ZZ['y','x']
|
||
+ sage: R2.has_coerce_map_from(R1)
|
||
+ True
|
||
+ sage: R2(x)
|
||
+ x
|
||
+ sage: R2(y)
|
||
+ y
|
||
+
|
||
+Se não existir homomorfismo de anel que preserve nomes, coerção não é
|
||
+definida. Todavia, conversão pode ainda ser possível, a saber,
|
||
+mapeando geradores de anel de acordo com sua posição da lista de
|
||
+geradores:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R3 = ZZ['z','x']
|
||
+ sage: R3.has_coerce_map_from(R1)
|
||
+ False
|
||
+ sage: R3(x)
|
||
+ z
|
||
+ sage: R3(y)
|
||
+ x
|
||
+
|
||
+Mas essas conversões que preservam a posição não se qualificam como
|
||
+coação: Compondo um mapa que preserva nomes de ``ZZ['x','y']`` para
|
||
+``ZZ['y','x']``, com um mapa que preserva nomes de ``ZZ['y','x']``
|
||
+para ``ZZ['a','b']``, resultaria em um mapa que não preserva nomes nem
|
||
+posição, violando a consistência.
|
||
+
|
||
+Se houver coação, ela será usada para comparar elementos de anéis
|
||
+diferentes ou fazer aritmética. Isso é frequentemente conveniente, mas
|
||
+o usuário deve estar ciente que estender a relação ``==`` além das
|
||
+fronteiras de parentes diferentes pode facilmente resultar em
|
||
+problemas. Por exemplo, enquanto ``==`` é supostamente uma relação de
|
||
+equivalência sobre os elementos de *um* anel, isso não é
|
||
+necessariamente o caso se anéis *diferentes* estão envolvidos. Por
|
||
+exemplo, ``1`` em ``ZZ`` e em um corpo finito são considerados iguais,
|
||
+pois existe uma coação canônica dos inteiros em qualquer corpo finito.
|
||
+Todavia, em geral não existe coação entre dois corpos finitos
|
||
+diferentes. Portanto temos
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: GF(5)(1) == 1
|
||
+ True
|
||
+ sage: 1 == GF(2)(1)
|
||
+ True
|
||
+ sage: GF(5)(1) == GF(2)(1)
|
||
+ False
|
||
+ sage: GF(5)(1) != GF(2)(1)
|
||
+ True
|
||
+
|
||
+Similarmente,
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R3(R1.1) == R3.1
|
||
+ True
|
||
+ sage: R1.1 == R3.1
|
||
+ False
|
||
+ sage: R1.1 != R3.1
|
||
+ True
|
||
+
|
||
+Uma outra consequência da condição de consistência é que coação pode
|
||
+apenas ir de anéis exatos (por exemplo, os racionais ``QQ``) para
|
||
+anéis não-exatos (por exemplo, os números reais com uma precisão fixa
|
||
+``RR``), mas não na outra direção. A razão é que a composição da
|
||
+coação de ``QQ`` em ``RR`` com a conversão de ``RR`` para ``QQ``
|
||
+deveria ser a identidade em ``QQ``. Mas isso é impossível, pois alguns
|
||
+números racionais distintos podem ser tratados como iguais em ``RR``,
|
||
+como no seguinte exemplo:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: RR(1/10^200+1/10^100) == RR(1/10^100)
|
||
+ True
|
||
+ sage: 1/10^200+1/10^100 == 1/10^100
|
||
+ False
|
||
+
|
||
+Quando se compara elementos de dois parentes ``P1`` e ``P2``, é
|
||
+possível que não haja coação entre os dois anéis, mas existe uma
|
||
+escolha canônica de um parente ``P3`` de modo que tanto ``P1`` como
|
||
+``P2`` são coagidos em ``P3``. Nesse caso, coação vai ocorrer também.
|
||
+Um caso de uso típico é na soma de um número racional com um polinômio
|
||
+com coeficientes inteiros, resultando em um polinômio com coeficientes
|
||
+racionais:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: P1.<x> = ZZ[]
|
||
+ sage: p = 2*x+3
|
||
+ sage: q = 1/2
|
||
+ sage: parent(p)
|
||
+ Univariate Polynomial Ring in x over Integer Ring
|
||
+ sage: parent(p+q)
|
||
+ Univariate Polynomial Ring in x over Rational Field
|
||
+
|
||
+Note que a princípio o resultado deveria também fazer sentido no
|
||
+corpo de frações de ``ZZ['x']``. Todavia, o Sage tenta escolher um
|
||
+parente *canônico* comum que parece ser o mais natural (``QQ['x']`` no
|
||
+nosso exemplo). Se vários potenciais parentes comuns parecem
|
||
+igualmente naturais, o Sage *não* vai escolher um deles
|
||
+aleatoriamente. Os mecanismos sobre os quais essa escolha se baseia é
|
||
+explicado em um `arquivo tutorial
|
||
+<http://flask.sagenb.org/home/pub/82/>`_
|
||
+
|
||
+Nenhuma coação para um parente comum vai ocorrer no seguinte exemplo:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R.<x> = QQ[]
|
||
+ sage: S.<y> = QQ[]
|
||
+ sage: x+y
|
||
+ Traceback (most recent call last):
|
||
+ ...
|
||
+ TypeError: unsupported operand parent(s) for '+': 'Univariate Polynomial Ring in x over Rational Field' and 'Univariate Polynomial Ring in y over Rational Field'
|
||
+
|
||
+A razão é que o Sage não escolhe um dos potenciais candidatos
|
||
+``QQ['x']['y']``, ``QQ['y']['x']``, ``QQ['x','y']`` ou
|
||
+``QQ['y','x']``, porque todas essas estruturas combinadas em pares
|
||
+diferentes parecem ser parentes comuns naturais, e não existe escolha
|
||
+canônica aparente.
|
||
diff --git a/doc/pt/tutorial/tour_functions.rst b/doc/pt/tutorial/tour_functions.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/tour_functions.rst
|
||
@@ -0,0 +1,236 @@
|
||
+.. _section-functions-issues:
|
||
+
|
||
+Algumas Questões Frequentes sobre Funções
|
||
+=========================================
|
||
+
|
||
+Alguns aspectos sobre definição de funções (por exemplo, para
|
||
+diferenciação, ou para criar gráficos) podem se tornar confusos. Nesta
|
||
+seção, procuramos tratar algumas questões relevantes.
|
||
+
|
||
+Aqui estão várias formas de definir objetos que merecem ser chamamos
|
||
+de "funções":
|
||
+
|
||
+1. Defina uma função em Python, como descrito em
|
||
+:ref:`section-functions`. Essas funções podem ser usadas para criar
|
||
+gráficos, mas não podem ser diferenciadas ou integradas.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: def f(z): return z^2
|
||
+ sage: type(f)
|
||
+ <type 'function'>
|
||
+ sage: f(3)
|
||
+ 9
|
||
+ sage: plot(f, 0, 2)
|
||
+
|
||
+Na última linha, observe a sintaxe. Se fosse usado ``plot(f(z), 0,
|
||
+2)`` ocorreria um erro, porque ``z`` é uma variável muda na definição
|
||
+de ``f`` e não está definida fora do contexto da função. De fato,
|
||
+somente ``f(z)`` já provoca um erro. Os seguintes comandos vão
|
||
+funcionar neste caso, embora em geral eles devam ser evitados pois
|
||
+podem ocasionar erros (veja o item 4 abaixo).
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: var('z') # define z to be a variable
|
||
+ z
|
||
+ sage: f(z)
|
||
+ z^2
|
||
+ sage: plot(f(z), 0, 2)
|
||
+
|
||
+Acima, ``f(z)`` é uma expressão simbólica, o próximo item na nossa
|
||
+lista.
|
||
+
|
||
+2. Defina um "expressão simbólica que pode ser evocada". Essas podem
|
||
+ser usadas para criar gráficos, e podem ser diferenciadas ou
|
||
+integradas.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: g(x) = x^2
|
||
+ sage: g # g sends x to x^2
|
||
+ x |--> x^2
|
||
+ sage: g(3)
|
||
+ 9
|
||
+ sage: Dg = g.derivative(); Dg
|
||
+ x |--> 2*x
|
||
+ sage: Dg(3)
|
||
+ 6
|
||
+ sage: type(g)
|
||
+ <type 'sage.symbolic.expression.Expression'>
|
||
+ sage: plot(g, 0, 2)
|
||
+
|
||
+Note que enquanto ``g`` é uma expressão simbólica que pode ser
|
||
+evocada, ``g(x)`` é um objeto diferente, embora relacionado, que pode
|
||
+ser usado para criar gráficos, ou ser diferenciado, integrado, etc.,
|
||
+embora com algumas ressalvas: veja o item 5 abaixo.
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: g(x)
|
||
+ x^2
|
||
+ sage: type(g(x))
|
||
+ <type 'sage.symbolic.expression.Expression'>
|
||
+ sage: g(x).derivative()
|
||
+ 2*x
|
||
+ sage: plot(g(x), 0, 2)
|
||
+
|
||
+3. Use uma função pré-definida. Essas podem ser representadas em
|
||
+gráfico, e com uma pequena ajuda, diferenciadas e integradas.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: type(sin)
|
||
+ <class 'sage.functions.trig.Function_sin'>
|
||
+ sage: plot(sin, 0, 2)
|
||
+ sage: type(sin(x))
|
||
+ <type 'sage.symbolic.expression.Expression'>
|
||
+ sage: plot(sin(x), 0, 2)
|
||
+
|
||
+Por si só, ``sin`` não pode ser diferenciado, pelo menos não para
|
||
+produzir ``cos``.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: f = sin
|
||
+ sage: f.derivative()
|
||
+ Traceback (most recent call last):
|
||
+ ...
|
||
+ AttributeError: ...
|
||
+
|
||
+Usando ``f = sin(x)`` no lugar de ``sin`` funciona, mas é ainda melhor
|
||
+usar ``f(x) = sin(x)`` para definir uma expressão simbólica que pode
|
||
+ser evocada.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: S(x) = sin(x)
|
||
+ sage: S.derivative()
|
||
+ x |--> cos(x)
|
||
+
|
||
+Aqui estão alguns problemas comuns, com explicações:
|
||
+
|
||
+\4. Cálculo acidental.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: def h(x):
|
||
+ ... if x<2:
|
||
+ ... return 0
|
||
+ ... else:
|
||
+ ... return x-2
|
||
+
|
||
+O problema: ``plot(h(x), 0, 4)`` cria o gráfico da reta `y=x-2`, não
|
||
+da função definida por ``h``. O motivo? No comando ``plot(h(x), 0,
|
||
+4)``, primeiro ``h(x)`` é calculada: isso significa substituir ``x``
|
||
+na função ``h``, o que significa que ``x<2`` é calculado.
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: type(x<2)
|
||
+ <type 'sage.symbolic.expression.Expression'>
|
||
+
|
||
+Quando uma equação simbólica é calculada, como na definição de ``h``,
|
||
+se ela não é obviamente verdadeira, então ela retorna False. Logo
|
||
+``h(x)`` é calculada como ``x-2``, e essa é a função que será
|
||
+representada no gráfico.
|
||
+
|
||
+A solução: não use ``plot(h(x), 0, 4)``; em vez disso, use
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: plot(h, 0, 4)
|
||
+
|
||
+\5. Acidentalmente produzindo uma constante em vez de uma função.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: f = x
|
||
+ sage: g = f.derivative()
|
||
+ sage: g
|
||
+ 1
|
||
+
|
||
+O problema: ``g(3)``, por exemplo, retorna o erro "ValueError: the
|
||
+number of arguments must be less than or equal to 0."
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: type(f)
|
||
+ <type 'sage.symbolic.expression.Expression'>
|
||
+ sage: type(g)
|
||
+ <type 'sage.symbolic.expression.Expression'>
|
||
+
|
||
+``g`` não é uma função, é uma constante, logo não possui variáveis
|
||
+associadas, e você não pode substituir nenhum valor em ``g``.
|
||
+
|
||
+Solução: existem vária opções.
|
||
+
|
||
+- Defina ``f`` inicialmente como uma expressão simbólica.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: f(x) = x # instead of 'f = x'
|
||
+ sage: g = f.derivative()
|
||
+ sage: g
|
||
+ x |--> 1
|
||
+ sage: g(3)
|
||
+ 1
|
||
+ sage: type(g)
|
||
+ <type 'sage.symbolic.expression.Expression'>
|
||
+
|
||
+- Ou com ``f`` como definida originalmente, defina ``g`` como uma
|
||
+ expressão simbólica.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: f = x
|
||
+ sage: g(x) = f.derivative() # instead of 'g = f.derivative()'
|
||
+ sage: g
|
||
+ x |--> 1
|
||
+ sage: g(3)
|
||
+ 1
|
||
+ sage: type(g)
|
||
+ <type 'sage.symbolic.expression.Expression'>
|
||
+
|
||
+- Ou com ``f`` e ``g`` como definidas originalmente, especifique a
|
||
+ variável para a qual você está substituindo.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: f = x
|
||
+ sage: g = f.derivative()
|
||
+ sage: g
|
||
+ 1
|
||
+ sage: g(x=3) # instead of 'g(3)'
|
||
+ 1
|
||
+
|
||
+Finalmente, aqui vai mais uma forma de saber a diferença entre as
|
||
+derivadas de ``f = x`` e ``f(x) = x``.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: f(x) = x
|
||
+ sage: g = f.derivative()
|
||
+ sage: g.variables() # the variables present in g
|
||
+ ()
|
||
+ sage: g.arguments() # the arguments which can be plugged into g
|
||
+ (x,)
|
||
+ sage: f = x
|
||
+ sage: h = f.derivative()
|
||
+ sage: h.variables()
|
||
+ ()
|
||
+ sage: h.arguments()
|
||
+ ()
|
||
+
|
||
+Como esse exemplo procura ilustrar, ``h`` não aceita argumentos, e é
|
||
+por isso que ``h(3)`` retorna um erro.
|
||
diff --git a/doc/pt/tutorial/tour_groups.rst b/doc/pt/tutorial/tour_groups.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/tour_groups.rst
|
||
@@ -0,0 +1,92 @@
|
||
+Grupos Finitos, Grupos Abelianos
|
||
+================================
|
||
+
|
||
+O Sage possui suporte para fazer cálculos com grupos de permutação,
|
||
+grupos finitos clássicos (tais como :math:`SU(n,q)`), grupos
|
||
+matriciais finitos (com os seus próprios geradores), e grupos
|
||
+abelianos (até mesmo infinitos). A maior parte disso é implementada
|
||
+usando a interface com o GAP.
|
||
+
|
||
+Por exemplo, para criar um grupo de permutação, forneça uma lista de
|
||
+geradores, como no seguinte exemplo.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: G = PermutationGroup(['(1,2,3)(4,5)', '(3,4)'])
|
||
+ sage: G
|
||
+ Permutation Group with generators [(3,4), (1,2,3)(4,5)]
|
||
+ sage: G.order()
|
||
+ 120
|
||
+ sage: G.is_abelian()
|
||
+ False
|
||
+ sage: G.derived_series() # random-ish output
|
||
+ [Permutation Group with generators [(1,2,3)(4,5), (3,4)],
|
||
+ Permutation Group with generators [(1,5)(3,4), (1,5)(2,4), (1,3,5)]]
|
||
+ sage: G.center()
|
||
+ Subgroup of (Permutation Group with generators [(3,4), (1,2,3)(4,5)]) generated by [()]
|
||
+ sage: G.random_element() # random output
|
||
+ (1,5,3)(2,4)
|
||
+ sage: print latex(G)
|
||
+ \langle (3,4), (1,2,3)(4,5) \rangle
|
||
+
|
||
+Você pode também obter a tabela de caracteres (em formato LaTeX) no
|
||
+Sage:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: G = PermutationGroup([[(1,2),(3,4)], [(1,2,3)]])
|
||
+ sage: latex(G.character_table())
|
||
+ \left(\begin{array}{rrrr}
|
||
+ 1 & 1 & 1 & 1 \\
|
||
+ 1 & 1 & -\zeta_{3} - 1 & \zeta_{3} \\
|
||
+ 1 & 1 & \zeta_{3} & -\zeta_{3} - 1 \\
|
||
+ 3 & -1 & 0 & 0
|
||
+ \end{array}\right)
|
||
+
|
||
+O Sage também inclui grupos clássicos matriciais sobre corpos finitos:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: MS = MatrixSpace(GF(7), 2)
|
||
+ sage: gens = [MS([[1,0],[-1,1]]),MS([[1,1],[0,1]])]
|
||
+ sage: G = MatrixGroup(gens)
|
||
+ sage: G.conjugacy_class_representatives()
|
||
+ [
|
||
+ [1 0]
|
||
+ [0 1],
|
||
+ [0 1]
|
||
+ [6 1],
|
||
+ ...
|
||
+ [6 0]
|
||
+ [0 6]
|
||
+ ]
|
||
+ sage: G = Sp(4,GF(7))
|
||
+ sage: G._gap_init_()
|
||
+ 'Sp(4, 7)'
|
||
+ sage: G
|
||
+ Symplectic Group of rank 2 over Finite Field of size 7
|
||
+ sage: G.random_element() # random output
|
||
+ [5 5 5 1]
|
||
+ [0 2 6 3]
|
||
+ [5 0 1 0]
|
||
+ [4 6 3 4]
|
||
+ sage: G.order()
|
||
+ 276595200
|
||
+
|
||
+Você também pode fazer cálculos usando grupos abelianos (finitos ou
|
||
+infinitos):
|
||
+
|
||
+::
|
||
+
|
||
+ sage: F = AbelianGroup(5, [5,5,7,8,9], names='abcde')
|
||
+ sage: (a, b, c, d, e) = F.gens()
|
||
+ sage: d * b**2 * c**3
|
||
+ b^2*c^3*d
|
||
+ sage: F = AbelianGroup(3,[2]*3); F
|
||
+ Multiplicative Abelian Group isomorphic to C2 x C2 x C2
|
||
+ sage: H = AbelianGroup([2,3], names="xy"); H
|
||
+ Multiplicative Abelian Group isomorphic to C2 x C3
|
||
+ sage: AbelianGroup(5)
|
||
+ Multiplicative Abelian Group isomorphic to Z x Z x Z x Z x Z
|
||
+ sage: AbelianGroup(5).order()
|
||
+ +Infinity
|
||
diff --git a/doc/pt/tutorial/tour_help.rst b/doc/pt/tutorial/tour_help.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/tour_help.rst
|
||
@@ -0,0 +1,363 @@
|
||
+.. _chapter-help:
|
||
+
|
||
+Obtendo ajuda
|
||
+=============
|
||
+
|
||
+O Sage possui vasta documentação, acessível digitando o nome de uma
|
||
+função ou constante (por exemplo), seguido pelo ponto de interrogação:
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: tan?
|
||
+ Type: <class 'sage.calculus.calculus.Function_tan'>
|
||
+ Definition: tan( [noargspec] )
|
||
+ Docstring:
|
||
+
|
||
+ The tangent function
|
||
+
|
||
+ EXAMPLES:
|
||
+ sage: tan(pi)
|
||
+ 0
|
||
+ sage: tan(3.1415)
|
||
+ -0.0000926535900581913
|
||
+ sage: tan(3.1415/4)
|
||
+ 0.999953674278156
|
||
+ sage: tan(pi/4)
|
||
+ 1
|
||
+ sage: tan(1/2)
|
||
+ tan(1/2)
|
||
+ sage: RR(tan(1/2))
|
||
+ 0.546302489843790
|
||
+ sage: log2?
|
||
+ Type: <class 'sage.functions.constants.Log2'>
|
||
+ Definition: log2( [noargspec] )
|
||
+ Docstring:
|
||
+
|
||
+ The natural logarithm of the real number 2.
|
||
+
|
||
+ EXAMPLES:
|
||
+ sage: log2
|
||
+ log2
|
||
+ sage: float(log2)
|
||
+ 0.69314718055994529
|
||
+ sage: RR(log2)
|
||
+ 0.693147180559945
|
||
+ sage: R = RealField(200); R
|
||
+ Real Field with 200 bits of precision
|
||
+ sage: R(log2)
|
||
+ 0.69314718055994530941723212145817656807550013436025525412068
|
||
+ sage: l = (1-log2)/(1+log2); l
|
||
+ (1 - log(2))/(log(2) + 1)
|
||
+ sage: R(l)
|
||
+ 0.18123221829928249948761381864650311423330609774776013488056
|
||
+ sage: maxima(log2)
|
||
+ log(2)
|
||
+ sage: maxima(log2).float()
|
||
+ .6931471805599453
|
||
+ sage: gp(log2)
|
||
+ 0.6931471805599453094172321215 # 32-bit
|
||
+ 0.69314718055994530941723212145817656807 # 64-bit
|
||
+ sage: sudoku?
|
||
+ File: sage/local/lib/python2.5/site-packages/sage/games/sudoku.py
|
||
+ Type: <type 'function'>
|
||
+ Definition: sudoku(A)
|
||
+ Docstring:
|
||
+
|
||
+ Solve the 9x9 Sudoku puzzle defined by the matrix A.
|
||
+
|
||
+ EXAMPLE:
|
||
+ sage: A = matrix(ZZ,9,[5,0,0, 0,8,0, 0,4,9, 0,0,0, 5,0,0,
|
||
+ 0,3,0, 0,6,7, 3,0,0, 0,0,1, 1,5,0, 0,0,0, 0,0,0, 0,0,0, 2,0,8, 0,0,0,
|
||
+ 0,0,0, 0,0,0, 0,1,8, 7,0,0, 0,0,4, 1,5,0, 0,3,0, 0,0,2,
|
||
+ 0,0,0, 4,9,0, 0,5,0, 0,0,3])
|
||
+ sage: A
|
||
+ [5 0 0 0 8 0 0 4 9]
|
||
+ [0 0 0 5 0 0 0 3 0]
|
||
+ [0 6 7 3 0 0 0 0 1]
|
||
+ [1 5 0 0 0 0 0 0 0]
|
||
+ [0 0 0 2 0 8 0 0 0]
|
||
+ [0 0 0 0 0 0 0 1 8]
|
||
+ [7 0 0 0 0 4 1 5 0]
|
||
+ [0 3 0 0 0 2 0 0 0]
|
||
+ [4 9 0 0 5 0 0 0 3]
|
||
+ sage: sudoku(A)
|
||
+ [5 1 3 6 8 7 2 4 9]
|
||
+ [8 4 9 5 2 1 6 3 7]
|
||
+ [2 6 7 3 4 9 5 8 1]
|
||
+ [1 5 8 4 6 3 9 7 2]
|
||
+ [9 7 4 2 1 8 3 6 5]
|
||
+ [3 2 6 7 9 5 4 1 8]
|
||
+ [7 8 2 9 3 4 1 5 6]
|
||
+ [6 3 5 1 7 2 8 9 4]
|
||
+ [4 9 1 8 5 6 7 2 3]
|
||
+
|
||
+O Sage também fornece completamento tab: digite as primeiras letras de
|
||
+uma função e então pressione a tecla tab. Por exemplo, se você digitar
|
||
+``ta`` seguido de ``TAB``, o Sage vai imprimir ``tachyon, tan, tanh,
|
||
+taylor``. Essa é uma boa forma de encontrar nomes de funções e outras
|
||
+estruturas no Sage.
|
||
+
|
||
+
|
||
+.. _section-functions:
|
||
+
|
||
+Funções, Tabulação, e Contagem
|
||
+===============================
|
||
+
|
||
+Para definir uma nova função no Sage, use o comando ``def`` e dois
|
||
+pontos após a lista de nomes das variáveis. Por exemplo:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: def is_even(n):
|
||
+ ... return n%2 == 0
|
||
+ ...
|
||
+ sage: is_even(2)
|
||
+ True
|
||
+ sage: is_even(3)
|
||
+ False
|
||
+
|
||
+Observação: Dependendo da versão do tutorial que você está lendo,
|
||
+você pode ver três pontos ``...`` na segunda linha desse exemplo. Não
|
||
+digite esses pontos; eles são apenas para enfatizar que o código está
|
||
+tabulado. Se for esse o caso, pressione [Enter] uma vez após o fim do
|
||
+bloco de código para inserir uma linha em branco e concluir a
|
||
+definição da função.
|
||
+
|
||
+Você não especifica o tipo de dado de nenhum dos argumentos da função.
|
||
+É possível especificar argumentos múltiplos, cada um dos quais pode
|
||
+ter um valor opcional padrão. Por exemplo, a função abaixo usa o valor
|
||
+padrão ``divisor=2`` se ``divisor`` não é especificado.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: def is_divisible_by(number, divisor=2):
|
||
+ ... return number%divisor == 0
|
||
+ sage: is_divisible_by(6,2)
|
||
+ True
|
||
+ sage: is_divisible_by(6)
|
||
+ True
|
||
+ sage: is_divisible_by(6, 5)
|
||
+ False
|
||
+
|
||
+Você também pode especificar explicitamente um ou mais argumentos
|
||
+quando evocar uma função; se você especificar os argumentos
|
||
+explicitamente, você pode fazê-lo em qualquer ordem:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: is_divisible_by(6, divisor=5)
|
||
+ False
|
||
+ sage: is_divisible_by(divisor=2, number=6)
|
||
+ True
|
||
+
|
||
+Em Python, blocos de código não são indicados por colchetes ou blocos
|
||
+de início e fim, como em outras linguagens. Em vez disso, blocos de
|
||
+código são indicados por tabulação, que devem estar alinhadas
|
||
+exatamente. Por exemplo, o seguinte código possui um erro de sintaxe
|
||
+porque o comando ``return`` não possui a mesma tabulação da linha que
|
||
+inicia o seu bloco de código.
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: def even(n):
|
||
+ ... v = []
|
||
+ ... for i in range(3,n):
|
||
+ ... if i % 2 == 0:
|
||
+ ... v.append(i)
|
||
+ ... return v
|
||
+ Syntax Error:
|
||
+ return v
|
||
+
|
||
+Se você corrigir a tabulação, a função fica correta:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: def even(n):
|
||
+ ... v = []
|
||
+ ... for i in range(3,n):
|
||
+ ... if i % 2 == 0:
|
||
+ ... v.append(i)
|
||
+ ... return v
|
||
+ sage: even(10)
|
||
+ [4, 6, 8]
|
||
+
|
||
+Não é necessário inserir ponto-e-vírgula no final da linha. Todavia,
|
||
+você pode inserir múltiplos comandos em uma mesma linha separados por
|
||
+ponto-e-vírgula:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: a = 5; b = a + 3; c = b^2; c
|
||
+ 64
|
||
+
|
||
+Se você quiser que uma única linha de comando seja escrita em mais de
|
||
+uma linha, use a barra invertida para quebrar a linha:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: 2 + \
|
||
+ ... 3
|
||
+ 5
|
||
+
|
||
+Em Sage, a contagem é feita iterando sobre um intervalo de inteiros.
|
||
+Por exemplo, a primeira linha abaixo é equivalente a ``for(i=0; i<3;
|
||
+i++)`` em C++ ou Java:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: for i in range(3):
|
||
+ ... print i
|
||
+ 0
|
||
+ 1
|
||
+ 2
|
||
+
|
||
+A primeira linha abaixo é equivalente a ``for(i=2; i<5; i++)``.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: for i in range(2,5):
|
||
+ ... print i
|
||
+ 2
|
||
+ 3
|
||
+ 4
|
||
+
|
||
+O Terceiro argumento controla o passo. O comando abaixo é equivalente
|
||
+a ``for(i=1; i<6; i+=2)``.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: for i in range(1,6,2):
|
||
+ ... print i
|
||
+ 1
|
||
+ 3
|
||
+ 5
|
||
+
|
||
+Frequentemente deseja-se criar uma tabela para visualizar resultados
|
||
+calculados com o Sage. Uma forma fácil de fazer isso é utilizando
|
||
+formatação de strings. Abaixo, criamos três colunas cada uma com
|
||
+largura exatamente 6, e fazemos uma tabela com quadrados e cubos de
|
||
+alguns números.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: for i in range(5):
|
||
+ ... print '%6s %6s %6s'%(i, i^2, i^3)
|
||
+ 0 0 0
|
||
+ 1 1 1
|
||
+ 2 4 8
|
||
+ 3 9 27
|
||
+ 4 16 64
|
||
+
|
||
+A estrutura de dados mais básica em Sage é a lista, que é -- como o
|
||
+nome sugere -- simplesmente uma lista de objetos arbitrários. Por
|
||
+exemplo, o comando ``range`` que usamos acima cria uma lista:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: range(2,10)
|
||
+ [2, 3, 4, 5, 6, 7, 8, 9]
|
||
+
|
||
+Abaixo segue uma lista mais complicada:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: v = [1, "hello", 2/3, sin(x^3)]
|
||
+ sage: v
|
||
+ [1, 'hello', 2/3, sin(x^3)]
|
||
+
|
||
+Listas são indexadas começando do 0, como em várias linguagens de
|
||
+programação.
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: v[0]
|
||
+ 1
|
||
+ sage: v[3]
|
||
+ sin(x^3)
|
||
+
|
||
+Use ``len(v)`` para obter o comprimento de ``v``, use
|
||
+``v.append(obj)`` para inserir um novo objeto no final de ``v``, e use
|
||
+``del v[i]`` para remover o :math:`i`-ésimo elemento de ``v``:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: len(v)
|
||
+ 4
|
||
+ sage: v.append(1.5)
|
||
+ sage: v
|
||
+ [1, 'hello', 2/3, sin(x^3), 1.50000000000000]
|
||
+ sage: del v[1]
|
||
+ sage: v
|
||
+ [1, 2/3, sin(x^3), 1.50000000000000]
|
||
+
|
||
+Outra importante estrutura de dados é o dicionário (ou lista
|
||
+associativa). Ele funciona como uma lista, exceto que pode ser
|
||
+indexado por vários tipos de objeto (os índices devem ser imutáveis):
|
||
+
|
||
+::
|
||
+
|
||
+ sage: d = {'hi':-2, 3/8:pi, e:pi}
|
||
+ sage: d['hi']
|
||
+ -2
|
||
+ sage: d[e]
|
||
+ pi
|
||
+
|
||
+Você pode também definir novos tipos de dados usando classes.
|
||
+Encapsular objetos matemáticos usando classes é uma técnica poderosa
|
||
+que pode ajudar a simplificar e organizar os seus programas em Sage.
|
||
+Abaixo, definimos uma nova classe que representa a lista de inteiros
|
||
+pares positivos até *n*; essa classe é derivada do tipo ``list``.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: class Evens(list):
|
||
+ ... def __init__(self, n):
|
||
+ ... self.n = n
|
||
+ ... list.__init__(self, range(2, n+1, 2))
|
||
+ ... def __repr__(self):
|
||
+ ... return "Even positive numbers up to n."
|
||
+
|
||
+O método ``__init__`` é evocado para inicializar o objeto quando ele é
|
||
+criado; o método ``__repr__`` imprime o objeto. Nós evocamos o
|
||
+construtor ``__init__`` do tipo ``list`` na segunda linha do método
|
||
+``__init__``. Criamos um objeto da classe ``Evens`` da seguinte forma:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: e = Evens(10)
|
||
+ sage: e
|
||
+ Even positive numbers up to n.
|
||
+
|
||
+Note que ``e`` imprime usando o método ``__repr__`` que nós
|
||
+definimos. Para ver a lista de números, use a função ``list``:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: list(e)
|
||
+ [2, 4, 6, 8, 10]
|
||
+
|
||
+Podemos também acessar o atributo ``n`` ou tratar ``e`` como uma
|
||
+lista.
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: e.n
|
||
+ 10
|
||
+ sage: e[2]
|
||
+ 6
|
||
diff --git a/doc/pt/tutorial/tour_linalg.rst b/doc/pt/tutorial/tour_linalg.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/tour_linalg.rst
|
||
@@ -0,0 +1,233 @@
|
||
+.. _section-linalg:
|
||
+
|
||
+Álgebra Linear
|
||
+==============
|
||
+
|
||
+O Sage fornece os objetos usuais em álgebra linear, por exemplo, o
|
||
+polinômio característico, matriz escalonada, traço, decomposição,
|
||
+etc., de uma matriz.
|
||
+
|
||
+Criar e multiplicar matrizes é fácil e natural:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: A = Matrix([[1,2,3],[3,2,1],[1,1,1]])
|
||
+ sage: w = vector([1,1,-4])
|
||
+ sage: w*A
|
||
+ (0, 0, 0)
|
||
+ sage: A*w
|
||
+ (-9, 1, -2)
|
||
+ sage: kernel(A)
|
||
+ Free module of degree 3 and rank 1 over Integer Ring
|
||
+ Echelon basis matrix:
|
||
+ [ 1 1 -4]
|
||
+
|
||
+Note que no Sage, o núcleo de uma matriz :math:`A` é o núcleo à
|
||
+esquerda, i.e., o conjunto de vetores :math:`w` tal que :math:`wA=0`.
|
||
+
|
||
+Resolver equações matriciais é fácil usando o método ``solve_right``.
|
||
+Calculando ``A.solve_right(Y)`` obtém-se uma matrix (ou vetor)
|
||
+:math:`X` tal que :math:`AX=Y`:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: Y = vector([0, -4, -1])
|
||
+ sage: X = A.solve_right(Y)
|
||
+ sage: X
|
||
+ (-2, 1, 0)
|
||
+ sage: A * X # checking our answer...
|
||
+ (0, -4, -1)
|
||
+
|
||
+Uma barra invertida ``\`` pode ser usada no lugar de ``solve_right``;
|
||
+use ``A \ Y`` no lugar de ``A.solve_right(Y)``.
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: A \ Y
|
||
+ (-2, 1, 0)
|
||
+
|
||
+Se não existir solução, o Sage retorna um erro:
|
||
+
|
||
+.. skip
|
||
+
|
||
+::
|
||
+
|
||
+ sage: A.solve_right(w)
|
||
+ Traceback (most recent call last):
|
||
+ ...
|
||
+ ValueError: matrix equation has no solutions
|
||
+
|
||
+Similarmente, use ``A.solve_left(Y)`` para resolver para :math:`X` em
|
||
+:math:`XA=Y`.
|
||
+
|
||
+O Sage também pode calcular autovalores e autovetores::
|
||
+
|
||
+ sage: A = matrix([[0, 4], [-1, 0]])
|
||
+ sage: A.eigenvalues ()
|
||
+ [-2*I, 2*I]
|
||
+ sage: B = matrix([[1, 3], [3, 1]])
|
||
+ sage: B.eigenvectors_left()
|
||
+ [(4, [
|
||
+ (1, 1)
|
||
+ ], 1), (-2, [
|
||
+ (1, -1)
|
||
+ ], 1)]
|
||
+
|
||
+(A sintaxe para a resposta de ``eigenvectors_left`` é uma lista com
|
||
+três componentes: (autovalor, autovetor, multiplicidade).) Autovalores
|
||
+e autovetores sobre ``QQ`` ou ``RR`` também podem ser calculados
|
||
+usando o Maxima (veja :ref:`section-maxima`).
|
||
+
|
||
+Como observado em :ref:`section-rings`, o anel sobre o qual a matriz
|
||
+esta definida afeta alguma de suas propriedades. A seguir, o primeiro
|
||
+argumento do comando ``matrix`` diz para o Sage considerar a matriz
|
||
+como uma matriz de inteiros (o caso ``ZZ``), uma matriz de números
|
||
+racionais (``QQ``), ou uma matriz de números reais (``RR``)::
|
||
+
|
||
+ sage: AZ = matrix(ZZ, [[2,0], [0,1]])
|
||
+ sage: AQ = matrix(QQ, [[2,0], [0,1]])
|
||
+ sage: AR = matrix(RR, [[2,0], [0,1]])
|
||
+ sage: AZ.echelon_form()
|
||
+ [2 0]
|
||
+ [0 1]
|
||
+ sage: AQ.echelon_form()
|
||
+ [1 0]
|
||
+ [0 1]
|
||
+ sage: AR.echelon_form()
|
||
+ [ 1.00000000000000 0.000000000000000]
|
||
+ [0.000000000000000 1.00000000000000]
|
||
+
|
||
+Espaços de Matrizes
|
||
+-------------------
|
||
+
|
||
+Agora criamos o espaço :math:`\text{Mat}_{3\times 3}(\QQ)` de matrizes
|
||
+`3 \times 3` com entradas racionais::
|
||
+
|
||
+ sage: M = MatrixSpace(QQ,3)
|
||
+ sage: M
|
||
+ Full MatrixSpace of 3 by 3 dense matrices over Rational Field
|
||
+
|
||
+(Para especificar o espaço de matrizes 3 por 4, você usaria
|
||
+``MatrixSpace(QQ,3,4)``. Se o número de colunas é omitido, ele é
|
||
+considerado como igual ao número de linhas, portanto,
|
||
+``MatrixSpace(QQ,3)`` é sinônimo de ``MatrixSpace(QQ,3,3)``.) O espaço
|
||
+de matrizes possui uma base que o Sage armazena como uma lista:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: B = M.basis()
|
||
+ sage: len(B)
|
||
+ 9
|
||
+ sage: B[1]
|
||
+ [0 1 0]
|
||
+ [0 0 0]
|
||
+ [0 0 0]
|
||
+
|
||
+Vamos criar uma matriz como um elemento de ``M``.
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: A = M(range(9)); A
|
||
+ [0 1 2]
|
||
+ [3 4 5]
|
||
+ [6 7 8]
|
||
+
|
||
+A seguir calculamos a sua forma escalonada e o núcleo.
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: A.echelon_form()
|
||
+ [ 1 0 -1]
|
||
+ [ 0 1 2]
|
||
+ [ 0 0 0]
|
||
+ sage: A.kernel()
|
||
+ Vector space of degree 3 and dimension 1 over Rational Field
|
||
+ Basis matrix:
|
||
+ [ 1 -2 1]
|
||
+
|
||
+Agora ilustramos o cálculo com matrizes definidas sobre um corpo
|
||
+finito:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: M = MatrixSpace(GF(2),4,8)
|
||
+ sage: A = M([1,1,0,0, 1,1,1,1, 0,1,0,0, 1,0,1,1,
|
||
+ ... 0,0,1,0, 1,1,0,1, 0,0,1,1, 1,1,1,0])
|
||
+ sage: A
|
||
+ [1 1 0 0 1 1 1 1]
|
||
+ [0 1 0 0 1 0 1 1]
|
||
+ [0 0 1 0 1 1 0 1]
|
||
+ [0 0 1 1 1 1 1 0]
|
||
+ sage: rows = A.rows()
|
||
+ sage: A.columns()
|
||
+ [(1, 0, 0, 0), (1, 1, 0, 0), (0, 0, 1, 1), (0, 0, 0, 1),
|
||
+ (1, 1, 1, 1), (1, 0, 1, 1), (1, 1, 0, 1), (1, 1, 1, 0)]
|
||
+ sage: rows
|
||
+ [(1, 1, 0, 0, 1, 1, 1, 1), (0, 1, 0, 0, 1, 0, 1, 1),
|
||
+ (0, 0, 1, 0, 1, 1, 0, 1), (0, 0, 1, 1, 1, 1, 1, 0)]
|
||
+
|
||
+Criamos o subespaço sobre `\GF{2}` gerado pelas linhas acima.
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: V = VectorSpace(GF(2),8)
|
||
+ sage: S = V.subspace(rows)
|
||
+ sage: S
|
||
+ Vector space of degree 8 and dimension 4 over Finite Field of size 2
|
||
+ Basis matrix:
|
||
+ [1 0 0 0 0 1 0 0]
|
||
+ [0 1 0 0 1 0 1 1]
|
||
+ [0 0 1 0 1 1 0 1]
|
||
+ [0 0 0 1 0 0 1 1]
|
||
+ sage: A.echelon_form()
|
||
+ [1 0 0 0 0 1 0 0]
|
||
+ [0 1 0 0 1 0 1 1]
|
||
+ [0 0 1 0 1 1 0 1]
|
||
+ [0 0 0 1 0 0 1 1]
|
||
+
|
||
+A base de `S` usada pelo Sage é obtida a partir das linhas não-nulas
|
||
+da forma escalonada da matriz de geradores de `S`.
|
||
+
|
||
+Álgebra Linear Esparsa
|
||
+----------------------
|
||
+
|
||
+O Sage fornece suporte para álgebra linear esparsa.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: M = MatrixSpace(QQ, 100, sparse=True)
|
||
+ sage: A = M.random_element(density = 0.05)
|
||
+ sage: E = A.echelon_form()
|
||
+
|
||
+O algoritmo multi-modular no Sage é bom para matrizes quadradas (mas
|
||
+não muito bom para matrizes que não são quadradas):
|
||
+
|
||
+::
|
||
+
|
||
+ sage: M = MatrixSpace(QQ, 50, 100, sparse=True)
|
||
+ sage: A = M.random_element(density = 0.05)
|
||
+ sage: E = A.echelon_form()
|
||
+ sage: M = MatrixSpace(GF(2), 20, 40, sparse=True)
|
||
+ sage: A = M.random_element()
|
||
+ sage: E = A.echelon_form()
|
||
+
|
||
+Note que o Python é sensível a maiúsculas e minúsculas:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: M = MatrixSpace(QQ, 10,10, Sparse=True)
|
||
+ Traceback (most recent call last):
|
||
+ ...
|
||
+ TypeError: MatrixSpace() got an unexpected keyword argument 'Sparse'
|
||
diff --git a/doc/pt/tutorial/tour_numtheory.rst b/doc/pt/tutorial/tour_numtheory.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/tour_numtheory.rst
|
||
@@ -0,0 +1,168 @@
|
||
+Teoria de Números
|
||
+=================
|
||
+
|
||
+O Sage possui extensa funcionalidade para teoria de números. Por
|
||
+exemplo, podemos fazer aritmética em :math:`\ZZ/N\ZZ` da seguinte
|
||
+forma:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R = IntegerModRing(97)
|
||
+ sage: a = R(2) / R(3)
|
||
+ sage: a
|
||
+ 33
|
||
+ sage: a.rational_reconstruction()
|
||
+ 2/3
|
||
+ sage: b = R(47)
|
||
+ sage: b^20052005
|
||
+ 50
|
||
+ sage: b.modulus()
|
||
+ 97
|
||
+ sage: b.is_square()
|
||
+ True
|
||
+
|
||
+O Sage contém funções comuns em teoria de números. Por exemplo,
|
||
+
|
||
+::
|
||
+
|
||
+ sage: gcd(515,2005)
|
||
+ 5
|
||
+ sage: factor(2005)
|
||
+ 5 * 401
|
||
+ sage: c = factorial(25); c
|
||
+ 15511210043330985984000000
|
||
+ sage: [valuation(c,p) for p in prime_range(2,23)]
|
||
+ [22, 10, 6, 3, 2, 1, 1, 1]
|
||
+ sage: next_prime(2005)
|
||
+ 2011
|
||
+ sage: previous_prime(2005)
|
||
+ 2003
|
||
+ sage: divisors(28); sum(divisors(28)); 2*28
|
||
+ [1, 2, 4, 7, 14, 28]
|
||
+ 56
|
||
+ 56
|
||
+
|
||
+Perfeito!
|
||
+
|
||
+A função ``sigma(n,k)`` do Sage soma as :math:`k`-ésimas potências dos
|
||
+divisores de ``n``:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: sigma(28,0); sigma(28,1); sigma(28,2)
|
||
+ 6
|
||
+ 56
|
||
+ 1050
|
||
+
|
||
+A seguir ilustramos o algoritmo de Euclides estendido, a função
|
||
+:math:`\phi` de Euler, e o teorema do resto Chinês:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: d,u,v = xgcd(12,15)
|
||
+ sage: d == u*12 + v*15
|
||
+ True
|
||
+ sage: n = 2005
|
||
+ sage: inverse_mod(3,n)
|
||
+ 1337
|
||
+ sage: 3 * 1337
|
||
+ 4011
|
||
+ sage: prime_divisors(n)
|
||
+ [5, 401]
|
||
+ sage: phi = n*prod([1 - 1/p for p in prime_divisors(n)]); phi
|
||
+ 1600
|
||
+ sage: euler_phi(n)
|
||
+ 1600
|
||
+ sage: prime_to_m_part(n, 5)
|
||
+ 401
|
||
+
|
||
+Agora verificamos algo sobre o problema :math:`3n+1`.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: n = 2005
|
||
+ sage: for i in range(1000):
|
||
+ ... n = 3*odd_part(n) + 1
|
||
+ ... if odd_part(n)==1:
|
||
+ ... print i
|
||
+ ... break
|
||
+ 38
|
||
+
|
||
+Por fim, ilustramos o teorema do resto Chinês.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x = crt(2, 1, 3, 5); x
|
||
+ 11
|
||
+ sage: x % 3 # x mod 3 = 2
|
||
+ 2
|
||
+ sage: x % 5 # x mod 5 = 1
|
||
+ 1
|
||
+ sage: [binomial(13,m) for m in range(14)]
|
||
+ [1, 13, 78, 286, 715, 1287, 1716, 1716, 1287, 715, 286, 78, 13, 1]
|
||
+ sage: [binomial(13,m)%2 for m in range(14)]
|
||
+ [1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1]
|
||
+ sage: [kronecker(m,13) for m in range(1,13)]
|
||
+ [1, -1, 1, 1, -1, -1, -1, -1, 1, 1, -1, 1]
|
||
+ sage: n = 10000; sum([moebius(m) for m in range(1,n)])
|
||
+ -23
|
||
+ sage: list(partitions(4))
|
||
+ [(1, 1, 1, 1), (1, 1, 2), (2, 2), (1, 3), (4,)]
|
||
+
|
||
+Números :math:`p`-ádicos
|
||
+------------------------
|
||
+
|
||
+O corpo dos números :math:`p`-ádicos está implementado em Sage. Note
|
||
+que uma vez que um corpo :math:`p`-ádico é criado, você não pode
|
||
+alterar a sua precisão.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: K = Qp(11); K
|
||
+ 11-adic Field with capped relative precision 20
|
||
+ sage: a = K(211/17); a
|
||
+ 4 + 4*11 + 11^2 + 7*11^3 + 9*11^5 + 5*11^6 + 4*11^7 + 8*11^8 + 7*11^9
|
||
+ + 9*11^10 + 3*11^11 + 10*11^12 + 11^13 + 5*11^14 + 6*11^15 + 2*11^16
|
||
+ + 3*11^17 + 11^18 + 7*11^19 + O(11^20)
|
||
+ sage: b = K(3211/11^2); b
|
||
+ 10*11^-2 + 5*11^-1 + 4 + 2*11 + O(11^18)
|
||
+
|
||
+Muito trabalho foi feito implementando anéis de inteiros em corpos
|
||
+:math:`p`-ádicos ou corpos numéricos além de `Z`. O leitor
|
||
+interessado é convidado a perguntar mais detalhes aos especialistas na
|
||
+lista ``sage-support`` no Google Groups.
|
||
+
|
||
+Diversos métodos relacionados já estão implementados na classe
|
||
+NumberField.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R.<x> = PolynomialRing(QQ)
|
||
+ sage: K = NumberField(x^3 + x^2 - 2*x + 8, 'a')
|
||
+ sage: K.integral_basis()
|
||
+ [1, 1/2*a^2 + 1/2*a, a^2]
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: K.galois_group(type="pari")
|
||
+ Galois group PARI group [6, -1, 2, "S3"] of degree 3 of the Number Field
|
||
+ in a with defining polynomial x^3 + x^2 - 2*x + 8
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: K.polynomial_quotient_ring()
|
||
+ Univariate Quotient Polynomial Ring in a over Rational Field with modulus
|
||
+ x^3 + x^2 - 2*x + 8
|
||
+ sage: K.units()
|
||
+ [3*a^2 + 13*a + 13]
|
||
+ sage: K.discriminant()
|
||
+ -503
|
||
+ sage: K.class_group()
|
||
+ Class group of order 1 of Number Field in a with
|
||
+ defining polynomial x^3 + x^2 - 2*x + 8
|
||
+ sage: K.class_number()
|
||
+ 1
|
||
diff --git a/doc/pt/tutorial/tour_plotting.rst b/doc/pt/tutorial/tour_plotting.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/tour_plotting.rst
|
||
@@ -0,0 +1,231 @@
|
||
+.. _section-plot:
|
||
+
|
||
+Gráficos
|
||
+========
|
||
+
|
||
+O Sage pode produzir gráficos bidimensionais e tridimensionais.
|
||
+
|
||
+Gráficos Bidimensionais
|
||
+-----------------------
|
||
+
|
||
+Em duas dimensões, o Sage pode desenhar círculos, linhas, e polígonos;
|
||
+gráficos de funções em coordenadas retangulares, e também coordenadas
|
||
+polares; gráficos de contorno e gráficos de campos vetoriais.
|
||
+Apresentamos alguns exemplos desses gráficos aqui. Para mais exemplos
|
||
+de gráficos com o Sage, veja :ref:`section-systems` e
|
||
+:ref:`section-maxima`, e também a documentação `Sage Constructions
|
||
+<http://www.sagemath.org/doc/constructions/>`_.
|
||
+
|
||
+Este comando produz um círculo amarelo de raio 1, centrado na origem.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: circle((0,0), 1, rgbcolor=(1,1,0))
|
||
+
|
||
+Você pode também produzir um círculo preenchido:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: circle((0,0), 1, rgbcolor=(1,1,0), fill=True)
|
||
+
|
||
+Outra possibilidade é criar um círculo atribuindo-o a uma variável;
|
||
+isso não cria um gráfico:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: c = circle((0,0), 1, rgbcolor=(1,1,0))
|
||
+
|
||
+Para criar o gráfico, use ``c.show()`` ou ``show(c)``, da seguinte
|
||
+forma:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: c.show()
|
||
+
|
||
+Alternativamente, o comando ``c.save('filename.png')`` salva o gráfico
|
||
+no arquivo citado.
|
||
+
|
||
+Agora, esses 'círculos' parecem mais elipses porque os eixos estão em
|
||
+escalas diferentes. Você pode alterar isso:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: c.show(aspect_ratio=1)
|
||
+
|
||
+O comando ``show(c, aspect_ratio=1)`` produz o mesmo resultado, ou
|
||
+você pode salvar a figura usando ``c.save('filename.png',
|
||
+aspect_ratio=1)``.
|
||
+
|
||
+É fácil criar o gráfico de funções simples:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: plot(cos, (-5,5))
|
||
+
|
||
+Após especificar uma variável, você também pode criar gráficos
|
||
+paramétricos:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x = var('x')
|
||
+ sage: parametric_plot((cos(x),sin(x)^3),(x,0,2*pi),rgbcolor=hue(0.6))
|
||
+
|
||
+É importante notar que os eixos dos gráficos vão se intersectar apenas
|
||
+se a origem estiver no escopo do gráfico, e que valores grandes podem
|
||
+ser representados usando notação científica.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: plot(x^2,(x,300,500))
|
||
+
|
||
+Você pode combinar vários gráficos somando-os:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x = var('x')
|
||
+ sage: p1 = parametric_plot((cos(x),sin(x)),(x,0,2*pi),rgbcolor=hue(0.2))
|
||
+ sage: p2 = parametric_plot((cos(x),sin(x)^2),(x,0,2*pi),rgbcolor=hue(0.4))
|
||
+ sage: p3 = parametric_plot((cos(x),sin(x)^3),(x,0,2*pi),rgbcolor=hue(0.6))
|
||
+ sage: show(p1+p2+p3, axes=false)
|
||
+
|
||
+Uma boa forma de produzir figuras preenchidas é criar uma lista de
|
||
+pontos (``L`` no exemplo abaixo) e então usar o comando ``polygon``
|
||
+para fazer o gráfico do polígono formado por esses pontos. Por
|
||
+exemplo, aqui está um "deltoid" verde:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: L = [[-1+cos(pi*i/100)*(1+cos(pi*i/100)),\
|
||
+ ... 2*sin(pi*i/100)*(1-cos(pi*i/100))] for i in range(200)]
|
||
+ sage: p = polygon(L, rgbcolor=(1/8,3/4,1/2))
|
||
+ sage: p
|
||
+
|
||
+Digite ``show(p, axes=false)`` para visualizar isso sem os eixos.
|
||
+
|
||
+Você pode adicionar texto ao gráfico:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: L = [[6*cos(pi*i/100)+5*cos((6/2)*pi*i/100),\
|
||
+ ... 6*sin(pi*i/100)-5*sin((6/2)*pi*i/100)] for i in range(200)]
|
||
+ sage: p = polygon(L, rgbcolor=(1/8,1/4,1/2))
|
||
+ sage: t = text("hypotrochoid", (5,4), rgbcolor=(1,0,0))
|
||
+ sage: show(p+t)
|
||
+
|
||
+Professores de cálculo frequentemente desenham o seguinte gráfico na
|
||
+lousa: não apenas um ramo do arco-seno, mas vários deles: isto é, o
|
||
+gráfico de :math:`y=\sin(x)` para :math:`x` entre :math:`-2\pi` e
|
||
+:math:`2\pi`, refletido com respeito a reta :math:`x=y`. Os seguintes
|
||
+comandos fazem isso:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: v = [(sin(x),x) for x in srange(-2*float(pi),2*float(pi),0.1)]
|
||
+ sage: line(v)
|
||
+
|
||
+Como a função tangente possui imagem maior do que o seno, se você usar
|
||
+o mesmo método para fazer o gráfico da função inversa da função
|
||
+tangente, você deve alterar as coordenadas mínima e máxima para o eixo
|
||
+*x*:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: v = [(tan(x),x) for x in srange(-2*float(pi),2*float(pi),0.01)]
|
||
+ sage: show(line(v), xmin=-20, xmax=20)
|
||
+
|
||
+O Sage também cria gráficos usando coordenadas polares, gráficos de
|
||
+contorno e gráficos de campos vetoriais (para tipos especiais de
|
||
+funções). Aqui está um exemplo de gráfico de contorno:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: f = lambda x,y: cos(x*y)
|
||
+ sage: contour_plot(f, (-4, 4), (-4, 4))
|
||
+
|
||
+Gráficos Tridimensionais
|
||
+------------------------
|
||
+
|
||
+O Sage pode ser usado para criar gráficos tridimensionais. Tanto no
|
||
+Sage Notebook, como no console (linha de comando), esses gráficos serão
|
||
+exibidos usando o software de código aberto [Jmol]_, que permite girar
|
||
+e ampliar a figura usando o mouse.
|
||
+
|
||
+Use ``plot3d`` para criar o gráfico de uma função da forma `f(x, y) =
|
||
+z`:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x, y = var('x,y')
|
||
+ sage: plot3d(x^2 + y^2, (x,-2,2), (y,-2,2))
|
||
+
|
||
+Alternativamente, você pode usar ``parametric_plot3d`` para criar o
|
||
+gráfico de uma superfície onde cada coordenada `x, y, z` é determinada
|
||
+por uma função de uma ou duas variáveis (os parâmetros, tipicamente
|
||
+`u` e `v`). O gráfico anterior pode ser representado parametricamente
|
||
+na forma:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: u, v = var('u, v')
|
||
+ sage: f_x(u, v) = u
|
||
+ sage: f_y(u, v) = v
|
||
+ sage: f_z(u, v) = u^2 + v^2
|
||
+ sage: parametric_plot3d([f_x, f_y, f_z], (u, -2, 2), (v, -2, 2))
|
||
+
|
||
+A terceira forma de fazer um gráfico de uma superfície no Sage é
|
||
+usando o comando ``implicit_plot3d``, que cria um gráfico de uma
|
||
+superfície definida por uma equação `f(x, y, z) = 0` (isso define um
|
||
+conjunto de pontos). Vamos fazer o gráfico de uma esfera usando a
|
||
+expressão usual:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x, y, z = var('x, y, z')
|
||
+ sage: implicit_plot3d(x^2 + y^2 + z^2 - 4, (x,-2, 2), (y,-2, 2), (z,-2, 2))
|
||
+
|
||
+Aqui estão mais alguns exemplos:
|
||
+
|
||
+`Yellow Whitney's umbrella <http://en.wikipedia.org/wiki/Whitney_umbrella>`__:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: u, v = var('u,v')
|
||
+ sage: fx = u*v
|
||
+ sage: fy = u
|
||
+ sage: fz = v^2
|
||
+ sage: parametric_plot3d([fx, fy, fz], (u, -1, 1), (v, -1, 1),
|
||
+ ... frame=False, color="yellow")
|
||
+
|
||
+`Cross cap <http://en.wikipedia.org/wiki/Cross-cap>`__:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: u, v = var('u,v')
|
||
+ sage: fx = (1+cos(v))*cos(u)
|
||
+ sage: fy = (1+cos(v))*sin(u)
|
||
+ sage: fz = -tanh((2/3)*(u-pi))*sin(v)
|
||
+ sage: parametric_plot3d([fx, fy, fz], (u, 0, 2*pi), (v, 0, 2*pi),
|
||
+ ... frame=False, color="red")
|
||
+
|
||
+Toro retorcido:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: u, v = var('u,v')
|
||
+ sage: fx = (3+sin(v)+cos(u))*cos(2*v)
|
||
+ sage: fy = (3+sin(v)+cos(u))*sin(2*v)
|
||
+ sage: fz = sin(u)+2*cos(v)
|
||
+ sage: parametric_plot3d([fx, fy, fz], (u, 0, 2*pi), (v, 0, 2*pi),
|
||
+ ... frame=False, color="red")
|
||
+
|
||
+Lemniscata:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x, y, z = var('x,y,z')
|
||
+ sage: f(x, y, z) = 4*x^2 * (x^2 + y^2 + z^2 + z) + y^2 * (y^2 + z^2 - 1)
|
||
+ sage: implicit_plot3d(f, (x, -0.5, 0.5), (y, -1, 1), (z, -1, 1))
|
||
diff --git a/doc/pt/tutorial/tour_polynomial.rst b/doc/pt/tutorial/tour_polynomial.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/tour_polynomial.rst
|
||
@@ -0,0 +1,332 @@
|
||
+.. _section-poly:
|
||
+
|
||
+Polinômios
|
||
+==========
|
||
+
|
||
+Nesta seção vamos ilustrar como criar e usar polinômios no Sage.
|
||
+
|
||
+
|
||
+.. _section-univariate:
|
||
+
|
||
+Polinômios em Uma Variável
|
||
+--------------------------
|
||
+
|
||
+Existem três formas de criar anéis de polinômios.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R = PolynomialRing(QQ, 't')
|
||
+ sage: R
|
||
+ Univariate Polynomial Ring in t over Rational Field
|
||
+
|
||
+Esse comando cria um anel de polinômios e diz para o Sage usar a letra
|
||
+'t' para representar a variável indeterminada quando imprimir na tela.
|
||
+Todavia, isso não define o símbolo ``t`` para uso no Sage, logo você
|
||
+não pode usá-lo para definir um polinômio (como :math:`t^2+1`)
|
||
+pertencente a ``R``.
|
||
+
|
||
+Uma forma alternativa é
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: S = QQ['t']
|
||
+ sage: S == R
|
||
+ True
|
||
+
|
||
+As mesmas observações com respeito a ``t`` valem também nesse caso.
|
||
+
|
||
+Uma terceira e conveniente forma de definir polinômios é
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R.<t> = PolynomialRing(QQ)
|
||
+
|
||
+ou
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R.<t> = QQ['t']
|
||
+
|
||
+ou ainda
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R.<t> = QQ[]
|
||
+
|
||
+Isso tem o efeito colateral de definir a variável ``t`` como a
|
||
+variável indeterminada do anel de polinômios, logo você pode
|
||
+facilmente construir elementos de ``R`` 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.)
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: poly = (t+1) * (t+2); poly
|
||
+ t^2 + 3*t + 2
|
||
+ sage: poly in R
|
||
+ True
|
||
+
|
||
+Qualquer que seja o método usado para definir um anel de polinômios,
|
||
+você pode recuperar a variável indeterminada como o :math:`0`-ésimo
|
||
+gerador:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R = PolynomialRing(QQ, 't')
|
||
+ sage: t = R.0
|
||
+ sage: t in R
|
||
+ True
|
||
+
|
||
+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
|
||
+``i`` sobre os números reais; logo temos o seguinte:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: CC
|
||
+ Complex Field with 53 bits of precision
|
||
+ sage: CC.0 # 0th generator of CC
|
||
+ 1.00000000000000*I
|
||
+
|
||
+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:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R, t = QQ['t'].objgen()
|
||
+ sage: t = QQ['t'].gen()
|
||
+ sage: R, t = objgen(QQ['t'])
|
||
+ sage: t = gen(QQ['t'])
|
||
+
|
||
+Finalmente apresentamos um pouco de aritmética em :math:`\QQ[t]`.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R, t = QQ['t'].objgen()
|
||
+ sage: f = 2*t^7 + 3*t^2 - 15/19
|
||
+ sage: f^2
|
||
+ 4*t^14 + 12*t^9 - 60/19*t^7 + 9*t^4 - 90/19*t^2 + 225/361
|
||
+ sage: cyclo = R.cyclotomic_polynomial(7); cyclo
|
||
+ t^6 + t^5 + t^4 + t^3 + t^2 + t + 1
|
||
+ sage: g = 7 * cyclo * t^5 * (t^5 + 10*t + 2)
|
||
+ sage: g
|
||
+ 7*t^16 + 7*t^15 + 7*t^14 + 7*t^13 + 77*t^12 + 91*t^11 + 91*t^10 + 84*t^9
|
||
+ + 84*t^8 + 84*t^7 + 84*t^6 + 14*t^5
|
||
+ sage: F = factor(g); F
|
||
+ (7) * t^5 * (t^5 + 10*t + 2) * (t^6 + t^5 + t^4 + t^3 + t^2 + t + 1)
|
||
+ sage: F.unit()
|
||
+ 7
|
||
+ sage: list(F)
|
||
+ [(t, 5), (t^5 + 10*t + 2, 1), (t^6 + t^5 + t^4 + t^3 + t^2 + t + 1, 1)]
|
||
+
|
||
+Note que a fatorização corretamente leva em conta e armazena a parte
|
||
+unitária.
|
||
+
|
||
+Se você fosse usar, por exemplo, a função ``R.cyclotomic_polynomial``
|
||
+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 ``R.cyclotomic_polynomial??`` para ver o código fonte, você
|
||
+irá facilmente ver uma linha ``f = pari.polcyclo(n)`` o que significa
|
||
+que o PARI é usado para o cálculo dos polinômios ciclotrômicos. Cite o
|
||
+PARI também no seu trabalho.
|
||
+
|
||
+Dividindo dois polinômios cria-se um elemento do corpo de frações (o
|
||
+qual o Sage cria automaticamente).
|
||
+
|
||
+::
|
||
+
|
||
+ sage: x = QQ['x'].0
|
||
+ sage: f = x^3 + 1; g = x^2 - 17
|
||
+ sage: h = f/g; h
|
||
+ (x^3 + 1)/(x^2 - 17)
|
||
+ sage: h.parent()
|
||
+ Fraction Field of Univariate Polynomial Ring in x over Rational Field
|
||
+
|
||
+Usando-se a série de Laurent, pode-se calcular a expansão em série no
|
||
+corpo de frações de ``QQ[x]``:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R.<x> = LaurentSeriesRing(QQ); R
|
||
+ Laurent Series Ring in x over Rational Field
|
||
+ sage: 1/(1-x) + O(x^10)
|
||
+ 1 + x + x^2 + x^3 + x^4 + x^5 + x^6 + x^7 + x^8 + x^9 + O(x^10)
|
||
+
|
||
+Se nomearmos a variável de outra forma, obtemos um anel de polinômios
|
||
+em uma variável diferente.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R.<x> = PolynomialRing(QQ)
|
||
+ sage: S.<y> = PolynomialRing(QQ)
|
||
+ sage: x == y
|
||
+ False
|
||
+ sage: R == S
|
||
+ False
|
||
+ sage: R(y)
|
||
+ x
|
||
+ sage: R(y^2 - 17)
|
||
+ x^2 - 17
|
||
+
|
||
+O anel é determinado pela variável. Note que criar um outro anel com
|
||
+variável indeterminada ``x`` não retorna um anel diferente.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R = PolynomialRing(QQ, "x")
|
||
+ sage: T = PolynomialRing(QQ, "x")
|
||
+ sage: R == T
|
||
+ True
|
||
+ sage: R is T
|
||
+ True
|
||
+ sage: R.0 == T.0
|
||
+ True
|
||
+
|
||
+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 :math:`\GF{7}[[T]]` e dividimos para criar um elemento de
|
||
+:math:`\GF{7}((T))`.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R.<T> = PowerSeriesRing(GF(7)); R
|
||
+ Power Series Ring in T over Finite Field of size 7
|
||
+ sage: f = T + 3*T^2 + T^3 + O(T^4)
|
||
+ sage: f^3
|
||
+ T^3 + 2*T^4 + 2*T^5 + O(T^6)
|
||
+ sage: 1/f
|
||
+ T^-1 + 4 + T + O(T^2)
|
||
+ sage: parent(1/f)
|
||
+ Laurent Series Ring in T over Finite Field of size 7
|
||
+
|
||
+Você também pode criar anéis de polinômios usando a notação de
|
||
+colchetes duplos:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: GF(7)[['T']]
|
||
+ Power Series Ring in T over Finite Field of size 7
|
||
+
|
||
+Polinômios em Mais De Uma Variável
|
||
+----------------------------------
|
||
+
|
||
+Para trabalhar com polinômios em várias variáveis, nós primeiro
|
||
+declaramos o anel de polinômios e as variáveis.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R = PolynomialRing(GF(5),3,"z") # here, 3 = number of variables
|
||
+ sage: R
|
||
+ Multivariate Polynomial Ring in z0, z1, z2 over Finite Field of size 5
|
||
+
|
||
+Da mesma forma como ocorre com polinômios em uma variável, existem
|
||
+três maneiras de fazer isso:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: GF(5)['z0, z1, z2']
|
||
+ Multivariate Polynomial Ring in z0, z1, z2 over Finite Field of size 5
|
||
+ sage: R.<z0,z1,z2> = GF(5)[]; R
|
||
+ Multivariate Polynomial Ring in z0, z1, z2 over Finite Field of size 5
|
||
+
|
||
+Se você quiser usar os nomes das variáveis com apenas uma letra, então
|
||
+você pode usar os seguinte comando:
|
||
+
|
||
+::
|
||
+
|
||
+ sage: PolynomialRing(GF(5), 3, 'xyz')
|
||
+ Multivariate Polynomial Ring in x, y, z over Finite Field of size 5
|
||
+
|
||
+A seguir fazemos um pouco de aritmética.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: z = GF(5)['z0, z1, z2'].gens()
|
||
+ sage: z
|
||
+ (z0, z1, z2)
|
||
+ sage: (z[0]+z[1]+z[2])^2
|
||
+ z0^2 + 2*z0*z1 + z1^2 + 2*z0*z2 + 2*z1*z2 + z2^2
|
||
+
|
||
+Você também pode usar uma notação mais matemática para criar um anel
|
||
+de polinômios.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R = GF(5)['x,y,z']
|
||
+ sage: x,y,z = R.gens()
|
||
+ sage: QQ['x']
|
||
+ Univariate Polynomial Ring in x over Rational Field
|
||
+ sage: QQ['x,y'].gens()
|
||
+ (x, y)
|
||
+ sage: QQ['x'].objgens()
|
||
+ (Univariate Polynomial Ring in x over Rational Field, (x,))
|
||
+
|
||
+Polinômios em mais de uma variável são implementados no Sage usando
|
||
+dicionários em Python e a "representação distribuída" de um polinômio.
|
||
+O Sage usa o Singular [Si]_, por exemplo, para o cálculo do maior
|
||
+divisor comum e bases de Gröbner para ideais algébricos.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: R, (x, y) = PolynomialRing(RationalField(), 2, 'xy').objgens()
|
||
+ sage: f = (x^3 + 2*y^2*x)^2
|
||
+ sage: g = x^2*y^2
|
||
+ sage: f.gcd(g)
|
||
+ x^2
|
||
+
|
||
+A seguir criamos o ideal :math:`(f,g)` gerado por :math:`f` e
|
||
+:math:`g`, simplesmente multiplicando ``(f,g)`` por ``R`` (nós
|
||
+poderíamos também escrever ``ideal([f,g])`` ou ``ideal(f,g)``).
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: I = (f, g)*R; I
|
||
+ Ideal (x^6 + 4*x^4*y^2 + 4*x^2*y^4, x^2*y^2) of Multivariate Polynomial
|
||
+ Ring in x, y over Rational Field
|
||
+ sage: B = I.groebner_basis(); B
|
||
+ [x^6, x^2*y^2]
|
||
+ sage: x^2 in I
|
||
+ False
|
||
+
|
||
+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).
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: B.parent()
|
||
+ Category of sequences in Multivariate Polynomial Ring in x, y over Rational
|
||
+ Field
|
||
+ sage: B.universe()
|
||
+ Multivariate Polynomial Ring in x, y over Rational Field
|
||
+ sage: B[1] = x
|
||
+ Traceback (most recent call last):
|
||
+ ...
|
||
+ ValueError: object is immutable; please change a copy instead.
|
||
+
|
||
+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 :math:`I`:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: I.primary_decomposition()
|
||
+ [Ideal (x^2) of Multivariate Polynomial Ring in x, y over Rational Field,
|
||
+ Ideal (y^2, x^6) of Multivariate Polynomial Ring in x, y over Rational Field]
|
||
+ sage: I.associated_primes()
|
||
+ [Ideal (x) of Multivariate Polynomial Ring in x, y over Rational Field,
|
||
+ Ideal (y, x) of Multivariate Polynomial Ring in x, y over Rational Field]
|
||
diff --git a/doc/pt/tutorial/tour_rings.rst b/doc/pt/tutorial/tour_rings.rst
|
||
new file mode 100644
|
||
--- /dev/null
|
||
+++ b/doc/pt/tutorial/tour_rings.rst
|
||
@@ -0,0 +1,148 @@
|
||
+.. _section-rings:
|
||
+
|
||
+Anéis Básicos
|
||
+=============
|
||
+
|
||
+Quando se define matrizes, vetores, ou polinômios, é as vezes útil, e
|
||
+as vezes necessário, especificar o "anel" sobre o qual o objeto será
|
||
+definido. Um *anel* é uma estrutura matemática na qual se tem noções
|
||
+de adição e multiplicação bem definidas; se você nunca ouviu falar
|
||
+sobre anéis, você provavelmente só precisa saber a respeito dos
|
||
+seguintes exemplos:
|
||
+
|
||
+* os inteiros `\{..., -1, 0, 1, 2,... \}`, que são chamados ``ZZ`` no
|
||
+ Sage.
|
||
+* os números racionais -- i. e., frações, ou razões, de inteiros --
|
||
+ que são chamados ``QQ`` no Sage.
|
||
+* os números reais, chamados de ``RR`` no Sage.
|
||
+* os números complexos, chamados de ``CC`` no Sage.
|
||
+
|
||
+Você pode precisar saber sobre essas distinções porque o mesmo
|
||
+polinômio, por exemplo, pode ser tratado diferentemente dependendo do
|
||
+anel sobre o qual está definido. A propósito, o polinômio `x^2-2`
|
||
+possui duas raízes, `\pm \sqrt{2}`. Essas raízes não são racionais,
|
||
+logo, se você esta lidando com polinômios com coeficientes racionais,
|
||
+os polinômios não serão fatorados. Com coeficientes reais, eles serão.
|
||
+Portanto você pode querer especificar o anel para garantir que você
|
||
+vai obter a informação que deseja. Os dois comandos a seguir definem
|
||
+os conjuntos de polinômios com coeficientes racionais e coeficientes
|
||
+reais, respectivamente. Os conjuntos são chamados "ratpoly" e
|
||
+"realpoly", mas esses nomes não são importantes aqui; todavia, note
|
||
+que as strings ".<t>" e ".<z>" especificam o nome das variáveis
|
||
+usadas em cada caso.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: ratpoly.<t> = PolynomialRing(QQ)
|
||
+ sage: realpoly.<z> = PolynomialRing(RR)
|
||
+
|
||
+Agora ilustramos a nossa discussão sobre fatorar `x^2-2`:
|
||
+
|
||
+.. link
|
||
+
|
||
+::
|
||
+
|
||
+ sage: factor(t^2-2)
|
||
+ t^2 - 2
|
||
+ sage: factor(z^2-2)
|
||
+ (z - 1.41421356237310) * (z + 1.41421356237310)
|
||
+
|
||
+Comentários similares também se aplicam a matrizes: a forma reduzida
|
||
+de uma matriz pode depender do anel sobre o qual ela esta definida,
|
||
+como também pode os seus autovalores e autovetores. Para mais sobre
|
||
+polinômios, veja :ref:`section-poly`, para mais sobre matrizes, veja
|
||
+:ref:`section-linalg`.
|
||
+
|
||
+O símbolo ``I`` representa a raiz quadrada de :math:`-1`; ``i`` é um
|
||
+sinônimo de ``I``. Obviamente, isso não é um número racional::
|
||
+
|
||
+ sage: i # square root of -1
|
||
+ I
|
||
+ sage: i in QQ
|
||
+ False
|
||
+
|
||
+Nota: O código acima pode não funcionar como esperado se a variável
|
||
+``i`` estiver atribuída a um outro valor, por exemplo, se ela for
|
||
+usada como a variável de um laço (loop). Nesse caso, digite::
|
||
+
|
||
+ sage: reset('i')
|
||
+
|
||
+para restabelecer o valor original de ``i``.
|
||
+
|
||
+Há uma sutileza ao definir números complexos: como mencionado acima,
|
||
+o símbolo ``i`` representa a raiz quadrada de `-1`, mas é uma raiz
|
||
+quadrada de `-1` *formal* ou *simbólica*. Evocando ``CC(i)`` ou
|
||
+``CC.0`` obtém-se a raiz de `-1` complexa. Aritmética envolvendo tipos
|
||
+diferentes de números é possível graças ao que se chama de coação,
|
||
+veja :ref:`section-coercion`.
|
||
+
|
||
+::
|
||
+
|
||
+ sage: i = CC(i) # floating point complex number
|
||
+ sage: i == CC.0
|
||
+ True
|
||
+ sage: a, b = 4/3, 2/3
|
||
+ sage: z = a + b*i
|
||
+ sage: z
|
||
+ 1.33333333333333 + 0.666666666666667*I
|
||
+ sage: z.imag() # imaginary part
|
||
+ 0.666666666666667
|
||
+ sage: z.real() == a # automatic coercion before comparison
|
||
+ True
|
||
+ sage: a + b
|
||
+ 2
|
||
+ sage: 2*b == a
|
||
+ True
|
||
+ sage: parent(2/3)
|
||
+ Rational Field
|
||
+ sage: parent(4/2)
|
||
+ Rational Field
|
||
+ sage: 2/3 + 0.1 # automatic coercion before addition
|
||
+ 0.766666666666667
|
||
+ sage: 0.1 + 2/3 # coercion rules are symmetric in SAGE
|
||
+ 0.766666666666667
|
||
+
|
||
+Aqui estão mais exemplos de anéis básicos em Sage. Como observado
|
||
+acima, o anel dos números racionais pode ser referido usando ``QQ``,
|
||
+ou também ``RationalField()`` (um *corpo*, ou *field* em inglês, é um
|
||
+anel no qual a operação de multiplicação é comutativa, e todo elemento
|
||
+não-nulo possui um elemento inverso com respeito à operação de
|
||
+multiplicação. Logo, os racionais formam um corpo, mas os inteiros
|
||
+não)::
|
||
+
|
||
+ sage: RationalField()
|
||
+ Rational Field
|
||
+ sage: QQ
|
||
+ Rational Field
|
||
+ sage: 1/2 in QQ
|
||
+ True
|
||
+
|
||
+O número decimal ``1.2`` é considerado como um elemento de ``QQ``:
|
||
+número decimais que são também racionais podem ser coagidos ao conjunto de
|
||
+números racionais (veja :ref:`section-coercion`). Os números `\pi` e
|
||
+`\sqrt{2}` não são racionais, todavia::
|
||
+
|
||
+ sage: 1.2 in QQ
|
||
+ True
|
||
+ sage: pi in QQ
|
||
+ False
|
||
+ sage: pi in RR
|
||
+ True
|
||
+ sage: sqrt(2) in QQ
|
||
+ False
|
||
+ sage: sqrt(2) in CC
|
||
+ True
|
||
+
|
||
+Para uso em matemática mais avançada, o Sage também pode especificar
|
||
+outros anéis, como corpos finitos, inteiros `p`-ádicos, o anel dos
|
||
+números algébricos, anéis de polinômios, e anéis de matrizes. Aqui
|
||
+está a construção de alguns deles::
|
||
+
|
||
+ sage: GF(3)
|
||
+ Finite Field of size 3
|
||
+ sage: GF(27, 'a') # need to name the generator if not a prime field
|
||
+ Finite Field in a of size 3^3
|
||
+ sage: Zp(5)
|
||
+ 5-adic Ring with capped relative precision 20
|
||
+ sage: sqrt(3) in QQbar # algebraic closure of QQ
|
||
+ True
|