Sage Tutorial
Sage Tutorial
Versión 9.4
24 de agosto de 2021
Índice general
1. Introducción 3
1.1. Instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.2. Formas de usar Sage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3. Metas a largo plazo de Sage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2. Un Tour Guiado 7
2.1. Asignación, Igualdad y Aritmética . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2. Obteniendo Ayuda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3. Funciones, Indentación Y Conteo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4. Álgebra Y Cálculo Básicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.5. Anillos Elementales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.6. Álgebra Lineal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.7. Polinomios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.8. Grupos Finitos y Grupos Abelianos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.9. Teoría de Números . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Bibliografía 37
i
ii
Sage Tutorial, Versión 9.4
Sage es un software matemático libre y de código abierto que apoya la investigación y la enseñanza en álgebra, geome-
tría, teoría de números, criptografía, computación numérica y áreas relacionadas. Tanto el modelo de desarrollo como
la tecnología en Sage se distinguen por un énfasis extremadamente fuerte en la apertura, comunidad, cooperación y
colaboración: estamos construyendo el carro, no reinventando la rueda. La meta de Sage en su conjunto es la de crear
una alternativa viable, libre y de código abierto a Maple, Mathematica, Magma y MATLAB.
Este tutorial es la mejor manera de familiarizarse con Sage en unas cuantas horas. Puedes leerlo en versión HTML o
PDF, o desde el notebook de Sage (haz click en Help, luego haz click en Tutorial para trabajar interactivamente en
el tutorial desde dentro de Sage).
Este trabajo está licenciado bajo una licencia Creative Commons Attribution-Share Alike 3.0.
Índice general 1
Sage Tutorial, Versión 9.4
2 Índice general
CAPÍTULO 1
Introducción
Completar este tutorial debería llevarte unas 3 o 4 horas. Puedes leerlo en versión HTML o PDF, o desde el notebook
(interfaz interactiva vía web) de Sage (haz click en Help, luego haz click en Tutorial para trabajar interactivamente
en el tutorial desde dentro de Sage).
Aunque gran parte de Sage está implementada usando el lenguaje de programación Python, no es necesario ningún
conocimiento previo de Python para poder leer este tutorial. En algún punto seguramente querrás aprender Python
(¡un lenguaje muy divertido!), y hay muchos recursos gratuitos excelentes para hacerlo, La Guía Para Principiantes
De Python [PyB] enumera muchas opciones. Si tan solo quieres experimentar ligeramente con Sage, este tutorial es el
lugar justo para empezar. Por ejemplo:
sage: 2 + 2
4
sage: factor(-2007)
-1 * 3^2 * 223
sage: factor(A.charpoly())
x^2 * (x^2 - 30*x - 80)
sage: E = EllipticCurve([1,2,3,4,5]);
sage: E
(continué en la próxima página)
3
Sage Tutorial, Versión 9.4
1.1 Instalación
Si no tienes instalado Sage en tu computador y sólo quieres probar algunos comandos, usa la versión en línea en
http://sagecell.sagemath.org.
Mira la Guía De Instalación Para Sage en la sección de documentación de la página web principal de [Sage] para
obtener instrucciones sobre cómo instalar Sage en tu computador. Aquí hacemos simplemente dos comentarios:
1. El archivo de descarga de Sage viene con «baterías incluidas». En otras palabras, aunque Sage utiliza Python,
IPython, PARI, GAP, Singular, Maxima, NTL, GMP, etc., no necesitas instalarlos por separado pues ya están
incluidos con la distribución de Sage. Sin embargo, para utilizar ciertas características de Sage, por ejemplo,
Macaulay o KASH, debes tener los programas pertinentes ya instalados en tu computador.
2. La versión binaria precompilada de Sage (que se encuentra en el sitio web de Sage) puede ser más rápida y fácil
de instalar que la versión en código fuente. Sólo desempaqueta el archivo y ejecuta sage.
3. Si quieres utilizar el paquete SageTeX (el cual te permite insertar los resultados de tus cálculos con Sage en
un archivo LaTeX), necesitarás hacerle conocer SageTeX a tu distribución de TeX. Para hacer esto, consulta la
sección «Haciendo que TeX conozca a SageTeX» en la guía de instalación de Sage Sage installation guide (Este
enlace debería llevarte a tu copia local de la guía de instalación). Es bastante sencillo: sólo necesitas establecer
una variable de entorno o copiar un solo archivo en un directorio en el que TeX va a buscar.
La documentación para usar SageTeX se encuentra en $SAGE_ROOT/local/share/texmf/tex/latex/
sagetex/, donde «$SAGE_ROOT» se refiere al directorio donde Sage está instalado – por ejemplo, /opt/
sage-4.2.1.
4 Capítulo 1. Introducción
Sage Tutorial, Versión 9.4
Útil: La audiencia a la que está destinado Sage son los estudiantes de matemáticas (desde la secundaria hasta
la universidad), profesores y matemáticos (para la investigación). El objetivo es proveer un software que pueda
usarse para explorar y experimentar con construcciones matemáticas en álgebra, geometría, teoría de números,
cálculo, computación numérica, etc. Sage facilita la experimentación interactiva con objetos matemáticos.
Eficiente: Queremos que sea rápido. Sage utiliza software maduro y altamente optimizado: GMP, PARI, GAP y
NTL, por lo que es muy rápido en ciertas operaciones.
Libre y de código abierto: El código fuente debe ser legible y libremente disponible, de modo que los usuarios
puedan entender qué está haciendo realmente el sistema y así poder extenderlo fácilmente. Tal como los matemá-
ticos logran un entendimiento más profundo de un teorema al leerlo cuidadosamente o, por lo menos, al echarle
una ojeada a la prueba, la gente que efectúa cálculos debe ser capaz de comprender cómo funcionan los cálculos
leyendo el código fuente documentado. Si utilizas Sage para hacer cálculos en un artículo que vas a publicar,
puedes estar seguro que tus lectores siempre tendrán libre acceso a Sage y a todo su código fuente, y hasta se te
permite archivar y re-distribuir la versión de Sage que usaste.
Fácil de compilar: Sage tiene que ser fácil de compilar desde el código fuente para los usuarios de Linux, OS
X y Windows. Esto provee a los usuarios de una mayor flexibilidad para que modifiquen el sistema.
Cooperación con otros programas: Sage debe proveer interfaces robustos a la mayoría de sistemas algebraicos
de cómputo, incluyendo PARI, GAP, Singular, Maxima, KASH, Magma, Maple y Mathematica. Sage pretende
unificar y extender el software matemático existente.
Bien documentado: Debemos proveer un tutorial, una guía de programación, un manual de referencia y docu-
mentos sobre cómo hacer cosas específicas, con numerosos ejemplos y discusiones de las bases matemáticas.
Extensible: Debe ser posible definir nuevos tipos de datos o derivar de tipos incorporados y utilizar código
escrito en una amplia gama de lenguajes.
Fácil de usar: Debe de ser fácil comprender cual funcionalidad se ha provisto para un objeto dado y examinar
la documentación y el código fuente, así como alcanzar un alto nivel de soporte al usuario.
6 Capítulo 1. Introducción
CAPÍTULO 2
Un Tour Guiado
Esta sección es un tour guiado de las opciones disponibles en Sage. Para muchos más ejemplos, véase «Construcciones
En Sage», con la cual se intenta responder a la pregunta general «¿Cómo hago para construir . . . ?». Véase también el
«Manual De Referencia De Sage», el cual tiene miles de ejemplos. Observa también que puedes trabajar interactiva-
mente con este tour en el notebook de Sage haciendo click en el enlace Help.
(Si estás viendo el tutorial en el notebook de Sage, presiona shift-enter para evaluar cualquier celda de entrada
de datos. Incluso puedes editar la entrada de datos antes de presionar shift-enter. En algunas Macs tendrías que
presionar shift-return en lugar de shift-enter.)
Con algunas excepciones menores, Sage utiliza el lenguaje de programación Python, de modo que la mayoría de los
libros introductorios sobre Python te ayudarán a aprender Sage.
Sage utiliza = para la asignación. Utiliza ==, <=, >=, < y > para la comparación:
sage: a = 5
sage: a
5
sage: 2 == 2
True
sage: 2 == 3
False
sage: 2 < 3
True
sage: a == 5
True
7
Sage Tutorial, Versión 9.4
El cálculo de una expresión tal como 3^2*4 + 2 %5 depende de el órden en que las operaciones son aplicadas.
Sage también provee muchas funciones matemáticas conocidas; he aquí solo unos cuantos ejemplos:
sage: sqrt(3.4)
1.84390889145858
sage: sin(5.135)
-0.912021158525540
sage: sin(pi/3)
1/2*sqrt(3)
Como demuestra el último ejemplo, algunas expresiones matemáticas devuelven valores “exactos”, en lugar de apro-
ximaciones numéricas. Para obtener una aproximación numérica, utilice la función n o el método n (ámbas tienen
un nombre más largo, numerical_approx, y la función N es la misma que n)). Éstas toman argumentos opcionales
prec, que es el número requerido de bits de precisión, y digits, que es el número requerido de digitos decimales de
precisión; el número predeterminado es de 53 bits de precisión.
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
Python es un lenguaje de tipado dinámico, de modo que el valor referido por cada variable tiene un tipo asociado. Pero
una variable dada puede contener valores de cualquier tipo Python dentro de un ámbito dado:
sage: a = 5 # a es un entero
sage: type(a)
<type 'sage.rings.integer.Integer'>
sage: a = 5/3 # ahora es un número racional
sage: type(a)
<type 'sage.rings.rational.Rational'>
(continué en la próxima página)
El lenguaje de programación C, que es un lenguaje de tipado estático, es muy diferente; una variable declarada como
int solo puede contener un int en su ámbito.
Sage posee una extensa documentación incorporada, accesible con solo teclear el nombre de una función o una constante
(por ejemplo), seguido de un signo de interrogación:
sage: tan?
Type: <class 'sage.calculus.calculus.Function_tan'>
Definition: tan( [noargspec] )
Docstring:
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:
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
(continué en la próxima página)
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]
Sage también provee “Autocompletado con el tabulador”: teclea las primeras letras de una función y luego oprime
la tecla del tabulador. Por ejemplo, si tecleas ta seguido por TAB, Sage imprimirá tachyon, tan, tanh, taylor.
Esto proporciona una buena manera de encontrar los nombres de funciones y otras estructuras en Sage.
Para definir una nueva función en Sage, utilice el comando def y el signo de dos puntos después de la lista de nombres
de variable. Por ejemplo:
Nota: Dependiendo de la versión del tutorial que estás leyendo, puede que veas puntos ....: en la segunda línea de este
ejemplo. No los incluyas; son solo para enfatizar que el código está indentado. Siempre que este sea el caso, presiona
[Return/Enter] una vez al final del bloque para insertar una línea en blanco y concluir la definición de la función.
No tienes que especificar los tipos de ninguno de los argumentos de entrada. Puedes especificar múltiples entradas,
cada una de las cuales puede tener un valor predeterminado opcional. Por ejemplo, la función de abajo tiene un valor
predeterminado divisor=2 si no se especifica el valor de divisor.
También puedes especificar explícitamente una o ambas de las entradas cuando llames a la función; si especificas las
entradas explícitamente, puedes darlas en cualquier órden:
En Python, los bloques de código no se encierran entre llaves o bloques begin. . . end como en muchos otros lenguajes.
En vez de ello, los bloques de código se indican por medio de la indentación, la cual se debe agrupar con exactitud.
Por ejemplo, el siguiente es un error de sintáxis porque la declaración return no está indentada al mismo nivel que
las otras líneas por encima de ella.
El punto y coma no es necesario al final de las líneas. Una línea termina, en muchos casos, por un carácter de nueva
línea. Sin embargo, puedes poner múltiples declaraciones en una línea, separadas por punto y coma:
sage: a = 5; b = a + 3; c = b^2; c
64
Si quisieras que una simple línea de código abarque multiples líneas, utiliza una barra invertida como terminación:
sage: 2 + \
....: 3
5
En Sage, se cuenta iterando sobre un rango de enteros. Por ejemplo, la primer línea de abajo es exactamente igual a
for(i=0; i<3; i++) en C++ o Java:
A menudo, querrás crear una tabla para presentar números que has calculado utilizando Sage. Una manera sencilla
de hacer esto es usando el formateado de cadenas. Abajo, creamos tres columnas, cada una con un ancho exácto de 6
caracteres y hacemos una tabla de cuadrados y cubos.
La estructura de datos más básica en Sage es la lista, la cual es – como sugiere su nombre – solo una lista de objetos
arbitrarios. Por ejemplo, el comando range que hemos usado crea una lista (python 2):
sage: v[0]
1
sage: v[3]
sin(x^3)
La función len(v) devuelve la longitud de v. Utiliza v.append(obj) para añadir un nuevo objeto al final de v, y
utiliza del v[i] para borrar el 𝑖 − 𝑠𝑖𝑚𝑜 elemento de v:
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]
Otra estructura de datos importante es el diccionario (o array asociativo). Funciona como una lista, excepto que puede
ser indexado con casi cualquier objeto (los índices deben ser immutables):
También puedes definir nuevos tipos de datos usando clases. El encapsulado de objetos matemáticos con clases es una
técnica potente que puede ayudar a simplificar y organizar tus programas en Sage. Abajo, definimos una clase que
representa la lista de enteros positivos pares hasta n; se deriva de el tipo básico list.
El método __init__ se llama para inicializar al objeto cuando es creado; el método __repr__ imprime el objeto.
Llamamos al método constructor de listas en la segunda línea del método __init__. A continuación, creamos un
objeto de clase Evens:
sage: e = Evens(10)
sage: e
Even positive numbers up to n.
Observe que e se imprime usando el método __repr__ que hemos definido. Para ver la lista subyacente de números,
utilice la función list:
sage: list(e)
[2, 4, 6, 8, 10]
sage: e.n
10
sage: e[2]
6
Sage puede efectuar cómputos relacionados al algebra y cálculo básicos: por ejemplo, encontrar soluciones de ecua-
ciones, diferenciación, integración y transformadas de Laplace. Véa la documentación «Construcciones En Sage» para
más ejemplos.
La función solve resuelve ecuaciones. Para usarla, primero no olvides especificar algunas variables. Los argumentos
de solve son una ecuación (o un sistema de ecuaciones), junto con las variables a resolver:
sage: x = var('x')
sage: solve(x^2 + 3*x + 2, x)
[x == -2, x == -1]
El siguiente ejemplo del uso de Sage para resolver un sistema de ecuaciones no-lineales fue proporcionado por Jason
Grout: primero, resolvemos el sistema simbólicamente:
(La función n imprime una aproximación numérica, y el argumento es el número de bits de precisión.)
A menudo, solve no podrá encontrar una solución exacta para la ecuación o ecuaciones especificadas. Cuando falla,
puedes usar find_root para encontrar una solución numérica. Por ejemplo, solve no devuelve nada interesante para
la siguiente ecuación:
Por otro lado, podemos usar find_root para encontrar una solución a la ecuación de arriba en el rango 0 < 𝜃 < 𝜋/2:
Sage sabe cómo diferenciar e integrar muchas funciones. Por ejemplo, para diferenciar sin(𝑢) con respecto a 𝑢, haz lo
siguiente:
sage: u = var('u')
sage: diff(sin(u), u)
cos(u)
sage: diff(sin(x^2), x, 4)
16*x^4*sin(x^2) - 48*x^2*cos(x^2) - 12*sin(x^2)
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
∫︀ 1 𝑥
𝑥 sin(𝑥2 ) 𝑑𝑥 y
∫︀
También podemos calcular integrales, tanto indefinidas como definidas. Para calcular 0 𝑥2 +1
𝑑𝑥
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)
1
Para calcular la descomposición en fracciones simples de 𝑥2 −1 :
sage: f = 1/((1+x)*(x-1))
sage: f.partial_fraction(x)
-1/2/(x + 1) + 1/2/(x - 1)
Puedes usar a Sage para investigar ecuaciones diferenciales ordinarias. Para resolver la ecuación 𝑥′ + 𝑥 − 1 = 0:
Esto utiliza el interfaz a Maxima de Sage [Max], por lo que el resultado puede diferir de otros resultados de Sage. En
este caso, la salida nos dice que la solución general a la ecuación diferencial es 𝑥(𝑡) = 𝑒−𝑡 (𝑒𝑡 + 𝑐).
También puedes calcular transformadas de Laplace; la transformada de Laplace de 𝑡2 𝑒𝑡 − sin(𝑡) se calcula como sigue:
sage: s = var("s")
sage: t = var("t")
sage: f = t^2*exp(t) - sin(t)
sage: f.laplace(t,s)
-1/(s^2 + 1) + 2/(s - 1)^3
Veamos un ejemplo más complicado. El desplazamiento desde el punto de equilibrio de dos resortes acoplados, sujetos
a una pared a la izquierda
|------\/\/\/\/\---|masa1|----\/\/\/\/\/----|masa2|
resorte1 resorte2
(donde la transformada de Laplace de una función en letra minúscula como 𝑥(𝑡) es la función en letra mayúscula 𝑋(𝑠)).
Toma la transformada de Laplace de la segunda ecuación:
Esto dice
Introduce las condiciones iniciales para 𝑥(0), 𝑥′ (0), 𝑦(0) y 𝑦 ′ (0) y resuelve las dos ecuaciones resultantes:
sage: t = var('t')
sage: P = parametric_plot((cos(2*t) + 2*cos(t), 4*cos(t) - cos(2*t) ),\
....: (0, 2*pi), rgbcolor=hue(0.9))
sage: show(P)
sage: t = var('t')
sage: p1 = plot(cos(2*t) + 2*cos(t), 0, 2*pi, rgbcolor=hue(0.3))
sage: p2 = plot(4*cos(t) - cos(2*t), 0, 2*pi, rgbcolor=hue(0.6))
sage: show(p1 + p2)
REFERENCIAS: Nagle, Saff, Snider, Fundamentos De Ecuaciones Diferenciales, 6a ed, Addison-Wesley, 2004. (véase
§ 5.5).
En el siguiente ejemplo, ilustraremos el método de Euler para EDOs de primer y segundo órden. Primero, recordemos
la idea básica para ecuaciones de primer órden. Dado un problema con valor inicial de la forma
𝑦 ′ = 𝑓 (𝑥, 𝑦)𝑦(𝑎) = 𝑐
𝑦(𝑥 + ℎ) − 𝑦(𝑥)
𝑦 ′ (𝑥) ≈ ,
ℎ
𝑦(𝑥+ℎ)−𝑦(𝑥)
donde ℎ > 0 está dado y es pequeño. Esto, junto con la ED, dan 𝑓 (𝑥, 𝑦(𝑥)) ≈ ℎ . Ahora resuelve para
𝑦(𝑥 + ℎ):
Si llamamos a ℎ𝑓 (𝑥, 𝑦(𝑥)) el «término de corrección» (a falta de algo mejor), llamamos a 𝑦(𝑥) «el valor viejo de y»,
y llamamos a 𝑦(𝑥 + ℎ) el «nuevo valor de y», entonces, esta aproximación puede re-expresarse como
𝑥 𝑦 ℎ𝑓 (𝑥, 𝑦)
𝑎 𝑐 ℎ𝑓 (𝑎, 𝑐)
𝑎+ℎ 𝑐 + ℎ𝑓 (𝑎, 𝑐) ...
𝑎 + 2ℎ ...
...
𝑏 = 𝑎 + 𝑛ℎ ??? ...
La meta es llenar todos los espacios de la tabla, una fila cada la vez, hasta que lleguemos a la casilla ???, que será la
aproximación del método de Euler para 𝑦(𝑏).
La idea para los sistemas de EDOs es similar.
Ejemplo: Aproxima numéricamente 𝑧(𝑡) en 𝑡 = 1 usando 4 pasos del método de Euler, donde 𝑧 ′′ + 𝑡𝑧 ′ + 𝑧 = 0,
𝑧(0) = 1, 𝑧 ′ (0) = 0.
Debemos reducir la EDO de segundo órden a un sistema de dos EDs de primer órden (usando 𝑥 = 𝑧, 𝑦 = 𝑧 ′ ) y aplicar
el método de Euler:
A estas alturas, P está guardando dos gráficas: P[0], el gráfico de x vs. t, y P[1], el gráfico de y vs. t. Podemos mostrar
ámbas como sigue:
Se han implementado varios polinomios ortogonales y funciones especiales, utilizando tanto PARI [GAP] como Maxi-
ma [Max]. Estas funciones están documentadas en las secciones apropiadas («Polinomios Ortogonales» y «Funciones
Especiales», respectivamente) del manual de referencia de Sage.
Hasta este punto, Sage únicamente ha encapsulado estas funciones para uso numérico. Para uso simbólico, por favor
utiliza directamente la interfaz a Maxima, como en el siguiente ejemplo:
Cuando definimos matrices, vectores o polinomios, a veces es útil, incluso necesario, especificar el «anillo» sobre el
que están definidos. Un anillo es una construcción matemática consistente en un conjunto de elementos sobre los que
está bien definidas las operaciones de suma y producto; si la noción de anillo no te resulta familiar, probablemente sólo
necesitas conocer estos cuatro anillos:
los enteros {..., −1, 0, 1, 2, ...}, a los que nos referimos en Sage por ZZ.
los números racionales – e.g., fracciones, o cocientes de números enteros –, QQ en Sage.
los números reales, RR en Sage.
los números complejos, CC en Sage.
Es importante conocer estas distinciones porque el mismo polinomio, por ejemplo, puede ser tratado de√ forma diferente
dependiendo del anillo sobre el que se ha definido. Por ejemplo, el polinomio 𝑥2 −2 tiene dos raíces, ± 2. Estas raíces
no son racionales, así que si trabajamos con polinomios con coeficientes racionales, el polinomio es irreducible. Sin
embargo, si los coeficientes son números reales, el polinomio factoriza como producto de dos factores lineales. En el
siguiente ejemplo, los conjuntos de polinomios se llaman «ratpoly» y «realpoly», aunque no usaremos estos nombres;
observa sin embargo que las cadenas «.<t>» y «.<z>» sirven para dar nombre a las variables usadas en cada caso.
sage: factor(t^2-2)
t^2 - 2
sage: factor(z^2-2)
(z - 1.41421356237310) * (z + 1.41421356237310)
Comentarios similares se aplican a las matrices: la forma reducida por filas de una matriz puede depender del anillo en
que está definida, al igual que sus autovalores y autofunciones. Hay más construcciones con polinomios en la sección
Polinomios, y más construcciones con matrices en Álgebra Lineal.
El símbolo I representa la raíz cuadrada de −1; i es un sinónimo de I. Por supuesto, no es un número racional:
Nota: El código siguiente puede no funcionar como esperas si hemos asignado otro valor a la variable i, por ejemplo
si la hemos usado como variable interna de un bucle. En este caso, podemos devolver i a su valor original:
sage: reset('i')
Hay una sutileza al definir números complejos: el símbolo i representa una raíz cuadrada de −1, pero es una raíz formal
o simbólica. Ejecutando CC(i) ó CC.0 obtenemos el número complejo que es la raíz cuadrada de −1.
Veamos más ejemplos de anillos elementales en Sage. Como mencionamos antes, nos podemos referir al anillo de
números racionales usando QQ, o también RationalField() (field, o cuerpo, se refiere a un anillo en el que el producto
es conmutativo y todo elemento excepto el cero tiene un inverso para la multiplicación. De este modo, los racionales
son un cuerpo, pero los enteros no:
sage: RationalField()
Rational Field
sage: QQ
Rational Field
sage: 1/2 in QQ
True
El número decimal 1.2 se considera que está en QQ: los números decimales,
√ que también son racionales, se pueden
convertir a racionales de forma automática. Sin embargo, los números 𝜋 y 2 no son racionales:
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
En Sage también podemos trabajar con otros anillos, como cuerpos finitos, enteros 𝑝-ádicos, el anillo de los números
algebraicos, anillos de polinomios y anillos de matrices. Veamos algunos de estos anillos:
sage: GF(3)
Finite Field of size 3
sage: # es necesario dar un nombre al generador si el número
sage: GF(27, 'a') # de elementos no es primo
Finite Field in a of size 3^3
(continué en la próxima página)
Sage soporta construcciones estándar de álgebra lineal, como el polinomio característico, la forma escalonada, la traza,
descomposición, etcétera de una matriz.
La creación de matrices y la multiplicación es sencilla y 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]
La descripción de kernel(A) indica que se trata de un subespacio de dimensión 1 («rank 1») de un espacio de dimen-
sión 3 («degree 3»). Por el momento, tanto kernel(A) como el espacio ambiente admiten coeficientes enteros («over
Integer Ring»). Finalmente, Sage nos muestra una base escalonada («Echelon basis»).
Observa que en Sage, el núcleo de la matriz 𝐴 es el «núcleo por la izquierda», e.g. el subespacio formado por los
vectores 𝑤 tales que 𝑤𝐴 = 0.
Resolver ecuaciones matriciales es sencillo, usando el método solve_right (resolver por la derecha). Al evaluar
A.solve_right(Y) obtenemos una matriz (o un vector) 𝑋 tal que 𝐴𝑋 = 𝑌 :
Se puede usar una barra invertida \ en lugar de solve_right; usamos A \ Y en lugar de A.solve_right(Y).
sage: A \ Y
(-2, 1, 0)
sage: A.solve_right(w)
Traceback (most recent call last):
...
ValueError: matrix equation has no solutions
(La sintaxis de la salida de eigenvectors_left es una lista de tuplas: (autovalor, autovector, multiplicidad).) Los
autovalores y autovectores sobre QQ o RR también se pueden calcular usando Maxima.
Como ya indicamos en Anillos Elementales, el anillo sobre el que se define una matriz afecta algunas de sus propiedades.
En las líneas que siguen, el primer argumento al comando matrix le dice a Sage que considere la matriz como una
matriz de enteros (si el argumento es ZZ), de números racionales (si es QQ), o de números reales (si es RR):
sage: M = MatrixSpace(QQ,3)
sage: M
Full MatrixSpace of 3 by 3 dense matrices over Rational Field
(Para especificar el espacio de matrices 3 por 4, usaríamos MatrixSpace(QQ,3,4). Si se omite el número de columnas,
se adopta por defecto el número de filas, de modo que MatrixSpace(QQ,3) es un sinónimo de MatrixSpace(QQ,3,
3).) El espacio de matrices está equipado con su base canónica:
sage: B = M.basis()
sage: len(B)
9
sage: B[0,1]
[0 1 0]
[0 0 0]
[0 0 0]
sage: A = M(range(9)); A
[0 1 2]
[3 4 5]
[6 7 8]
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]
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)]
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]
La base de 𝑆 usada por Sage se obtiene de las filas no nulas de la forma escalonada reducida de la matriz compuesta
por los generadores de 𝑆.
El algoritmo multi-modular de Sage es bueno para matrices cuadradas (pero no tan bueno para matrices no cuadradas):
2.7 Polinomios
De esta forma creamos un anillo de polinomios en una variable, y pedimos que esta variable se muestre por pantalla
como t. Sin embargo, de esta forma no se define t como variable simbólica en Sage, y no se puede usar este símbolo
para escribr polinomios de R como por ejemplo 𝑡2 + 1.
Otra forma es:
sage: S = QQ['t']
sage: S == R
True
o incluso
2.7. Polinomios 25
Sage Tutorial, Versión 9.4
Todas estas formas tienen el efecto añadido de definir la variable t como la indeterminada del anillo de polinomios, lo
que hace más sencillo definir elementos de R. (Esta tercera forma es similar a la notación de Magma [MAGMA] , y al
igual que en Magma se puede usar para una amplia variedad de objetos.)
Independientemente de la forma usada para definir un anillo de polinomios, podemos recuperar la indeterminada me-
diante el generador 0-ésimo.
Observa que una construcción similar funciona con los números complejos, que pueden ser vistos como el conjunto
generado por los números reales y el símbolo i:
sage: CC
Complex Field with 53 bits of precision
sage: CC.0 # 0th generator of CC
1.00000000000000*I
También podemos obtener tanto el anillo como el generador, o sólo el generador, en el momento de crear un anillo de
polinomios, del modo siguiente:
sage: R, t = QQ['t'].objgen()
sage: t = QQ['t'].gen()
sage: R, t = objgen(QQ['t'])
sage: t = gen(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)]
Observamos que la factorización tiene en cuenta la unidad que multiplica a los factores irreducibles.
Si en el curso de nuestra investigación usásemos mucho, por ejemplo, la función R.cyclotomic_polynomial, sería
recomendable citar, además de a Sage, a la componente de Sage que realiza el cálculo en última instancia. En este caso,
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 series de Laurent, podemos calcular expansiones en serie de potencias de elementos del cuerpo de fracciones
de QQ[x]:
El anillo de polinomios está determinado por el anillo de coeficientes y la variable. Observamos que construir otro
anillo con una variable de nombre x no devuelve un anillo distinto.
Sage soporta los anillos de series de potencias y de series de Laurent sobre cualquier anillo base. En el ejemplo siguiente,
creamos un elemento de F7 [[𝑇 ]] y calculamos su inverso para crear un elemento de F7 ((𝑇 )).
2.7. Polinomios 27
Sage Tutorial, Versión 9.4
sage: GF(7)[['T']]
Power Series Ring in T over Finite Field of size 7
Para trabajar con polinomios de varias variables, comenzamos por declarar el anillo de polinomios y las variables.
Al igual que al definir anillos de polinomios en una variable, hay varias formas:
Es posible usar una letra distinta para cada variable usando la notación:
Es posible usar una notación más parecida a la convención usual en matemáticas para definir el anillo.
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,))
Los polinomios en varias variables están implementados en Sage usando diccionarios de Python y la «representación
distributiva» de un polinomio. Sage usa en parte Singular [Si], por ejemplo para el cálculo del mcd de dos polinomios
y la base de Gröbner de un ideal.
A continuación creamos el ideal (𝑓, 𝑔) generado por 𝑓 y 𝑔, simplemente multiplicando la tupla (f,g) por R (también
podemos escribir ideal([f,g]) o ideal(f,g)).
La base de Gröbner de arriba no es una lista, sino una secuencia inmutable. Esto implica que tiene un universo y un
padre, y que no se puede cambiar (lo cual es importante porque otras rutinas usarán esta base de Gröbner).
sage: B.parent()
<class 'sage.rings.polynomial.multi_polynomial_sequence.PolynomialSequence_generic'>
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.
Sage incluye código basado en la librería Singular que permite hacer algo de álgebra conmutativa (entiéndase: no tanta
como nos gustaría). Por ejemplo, podemos calcular la descomposición primaria y los primos asociados a 𝐼:
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]
Sage ofrece algunas posibilidades para trabajar con grupos de permutaciones, grupos finitos clásicos (como 𝑆𝑈 (𝑛, 𝑞)),
grupos finitos de matrices (con generadores definidos por el usuario), y grupos abelianos (incluso infinitos). La mayor
parte de esta funcionalidad está implementada por medio de una interfaz con GAP.
Por ejemplo, para crear un grupo de permutaciones, introducimos una lista de generadores:
sage: G.center()
Subgroup generated by [()] of (Permutation Group with generators [(3,4), (1,2,3)(4,5)])
sage: G.random_element() # random output (resultado aleatorio)
(1,5,3)(2,4)
sage: print(latex(G))
\langle (3,4), (1,2,3)(4,5) \rangle
También podemos obtener la tabla de caracteres en formato LaTeX (usa show(G.character_table()) para ver
directamente el resultado de compilar el código LaTeX):
Sage también incluye los grupos clásicos y los grupos de matrices sobre cuerpos 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_classes_representatives()
(
[1 0] [0 6] [0 4] [6 0] [0 6] [0 4] [0 6] [0 6] [0 6] [4 0]
[0 1], [1 5], [5 5], [0 6], [1 2], [5 2], [1 0], [1 4], [1 3], [0 2],
[5 0]
[0 3]
)
sage: G = Sp(4,GF(7))
sage: G._gap_init_()
'Symplectic Group of degree 4 over Finite Field of size 7'
sage: G
Symplectic Group of degree 4 over Finite Field of size 7
sage: G.random_element() # random output (resultado aleatorio)
[5 5 5 1]
[0 2 6 3]
[5 0 1 0]
[4 6 3 4]
sage: G.order()
276595200
Sage tiene bastante funcionalidad para teoría de números. Por ejemplo, podemos hacer aritmética en Z/𝑁 Z del modo
siguiente:
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
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
sage: n = 2005
sage: for i in range(1000):
....: n = 3*odd_part(n) + 1
....: if odd_part(n)==1:
....: print(i)
....: break
38
El cuerpo de números p-ádicos está implementado en Sage. Observa que una vez creamos un cuerpo 𝑝-ádico, no
podemos cambiar su precisión:
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)
Se ha hecho mucho trabajo para implementar otros anillos de enteros sobre cuerpos p-ádicos. El lector interesado está
invitado a pedir más detalles a los expertos en el grupo de Google sage-support.
Varios métodos relacionados están implementados en la clase NumberField:
sage: K.galois_group()
Galois group 3T2 (S3) with order 6 of x^3 + x^2 - 2*x + 8
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
genindex
modindex
search
35
Sage Tutorial, Versión 9.4
37