Professional Documents
Culture Documents
J. L. Tbara a
(jltabara@gmail.com)
27 de enero de 2009
INDICE GENERAL
1. Aritmtica Bsica e a 1.1. Operaciones con enteros . . . . . . . . . . . . . . . 1.2. Operaciones con nmeros racionales y reales . . . u 1.3. La ayuda en Sage . . . . . . . . . . . . . . . . . . 1.4. Comparacin de nmeros . . . . . . . . . . . . . . o u 1.5. Primos y factorizacin . . . . . . . . . . . . . . . . o 1.6. Divisin eucl o dea . . . . . . . . . . . . . . . . . . . 1.7. Mximo comn divisor y M a u nimo comn mltiplo u u 1.8. Nmeros complejos . . . . . . . . . . . . . . . . . u 1.9. Miscelnea . . . . . . . . . . . . . . . . . . . . . . a 2. Ecuaciones y sistemas 2.1. Resolucin de ecuaciones elementales en o 2.2. Resolucin de sistemas . . . . . . . . . o 2.3. Manipulacin de ecuaciones . . . . . . . o 2.4. Resolucin numrica de ecuaciones . . . o e 3. Polinomios 3.1. Operaciones con polinomios 3.2. Factorizacin . . . . . . . . o 3.3. Ra ces de polinomios . . . 3.4. Fracciones algebraicas . . . 3.5. Miscelnea . . . . . . . . . a
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
1 1 2 4 6 6 8 8 9 11 13 13 14 15 16 17 17 18 19 20 21 23 23 24 25 27 27 28 29 29
modo exacto . . . . . . . . . . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
4. Grcas y objetos grcos a a 4.1. Grcas de funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 4.2. Funciones a trozos y varias funciones . . . . . . . . . . . . . . . . . . . . . . . . 4.3. Diversos objetos grcos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 5. Anlisis a 5.1. L mites . 5.2. Derivadas 5.3. Integrales 5.4. Polinomio
. . . . . . . . . . . . . . . . . . de Taylor
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
6. Algebra Lineal Elemental 31 6.1. Vectores y operaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 6.2. Matrices y operaciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 6.3. Determinantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 i
6.4. 6.5.
7. Algebra Lineal 39 7.1. Espacios vectoriales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 7.2. Las matrices y los espacios vectoriales . . . . . . . . . . . . . . . . . . . . . . . . 41 7.3. Polinomio caracter stico y autovectores . . . . . . . . . . . . . . . . . . . . . . . 43 8. Teor elemental de n meros a u 45 8.1. Los anillos Zn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 8.2. Funciones multiplicativas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 A. Cuaterniones B. Grupos abelianos nitos 49 51
ii
CAP ITULO
ONE
Aritmtica Bsica e a
Suele denominarse Aritmtica al estudio de las operaciones con nmeros enteros. Nosotros e u entenderemos por Aritmtica tambin el estudio de las operaciones con otros tipos de nmeros, e e u como pueden ser los racionales y los reales.
En Matemticas existen distintos conjuntos numricos. Tenemos el conjunto de los nmeros a e u enteros, denotado por Z, el conjunto de los nmeros racionales Q, etc. En Sage hay algo similar, u aunque no totalmente igual: en Z y en Q el programa utiliza aritmtica exacta, sin embargo en e R y en C utiliza aritmtica aproximada, por lo que pueden producirse errores. El conjunto de los e enteros se denota en el programa por ZZ. Los racionales, los reales y los complejos se denotan QQ, RR y CC. Para saber en que conjunto considera Sage que est cada nmero utilizamos el a u mtodo e .base_ring() aunque tambin se puede utilizar la funcin e o type() La diferencia entre mtodo y funcin es su forma de utilizacin. Para usar una funcin escribimos e o o o el nombre de la funcin y entre parntesis el objeto al que se le aplica la funcin. Sin embargo o e o para utilizar un mtodo, primero escribimos el objeto sobre el que va a actuar, despus escribimos e e un punto y nalmente el mtodo. e Para obtener aproximaciones decimales utilizamos la funcin (y a la vez mtodo) o e n() 2 Cap tulo 1. Aritmtica Bsica e a
Esta funcin admite como opcin digits para obtener las aproximaciones con distinto nmero o o u de cifras.
Sage sage: a = 2 sage: a.base_ring() Integer Ring sage: type(a) <type sage.rings.integer.Integer> sage: # El comando in se utiliza como el simbolo pertenece sage: a in ZZ, a in QQ, a in RR, a in CC (True, True, True, True) sage: a = 3/7 sage: a.base_ring() Rational Field sage: type(a) <type sage.rings.rational.Rational> sage: a in ZZ, a in QQ, a in RR, a in CC (False, True, True, True) sage: a = 1.53876 sage: a.base_ring() Real Field with 53 bits of precision sage: type(a) <type sage.rings.real_mpfr.RealLiteral> sage: a in ZZ, a in QQ, a in RR, a in CC (False, True, True, True) sage: # El numero decimal tambien es un numero racional sage: n(sqrt(2)) # Precision por defecto 1.41421356237310 sage: n(sqrt(2), digits=50) # Mayor precision 1.4142135623730950488016887242096980785696718753769 sage: n(sqrt(2), digits=5) 1.4142 sage: sqrt(2).n() # Actuando como metodo 1.41421356237310 sage: sqrt(2).n(digits=30) # El modificador digits como metodo 1.414213562373095048801688724210
Para extraer el denominador y el numerador de un nmero racional u .denominator(), .numerator() Los nmeros reales se pueden aproximar a los enteros de distintos modos. La forma ms habitual u a es el redondeo, que devuelve el nmero entero ms prximo al nmero decimal en cuestion. Pero u a o u tambin podemos redondear por defecto y por exceso. Los comandos para realizar todos estos e tipos de redondeo son .round(), .floor(), .ceil() Estas 5 instrucciones se pueden utilizar como funciones o como mtodos. El mtodo .round() e e admite una opcin, que nos sirve para especicar con cuantos decimales queremos el redondeo. o Incluso admite nmeros negativos, si queremos redondear a las decenas, centenas,. . . . Sin emu bargo, y por razones no muy bien conocidas, esto solamente funciona si utilizamos la funcin y o no sirve con el mtodo. e 1.2. Operaciones con nmeros racionales y reales u 3
Sage sage: a = 77/23 sage: denominator(a) 23 sage: a.denominator(). 23 sage: a.numerator() 77 sage: a = -74/21 sage: a.numerator(), a.denominator() (-74, 21) sage: a = 3.67 sage: a.round(), a.floor(), a.ceil() (4, 3, 4) sage: a = 3.234 sage: a.round(), a.floor(), a.ceil() (3, 3, 4) sage: a = -3.898 sage: a.round(), a.floor(), a.ceil() (-4, -4, -3) sage: a = 3456.876543 sage: round(a), round(a,2), round(a,5) (3457, 3456.88, 3456.87654) sage: round(a,-1), round(a,-2), round(a,-4) (3460.0, 3500.0, 0.0)
Sage sage: # Veamos que metodos se pueden aplicar a un numero racional sage: a = 7/3 sage: a. a.abs a.inverse_mod a.period a.additive_order a.is_integral a.py a.base_extend a.is_nilpotent a.quo_rem a.base_ring a.is_one a.rename a.category a.is_square a.reset_name a.ceil a.is_unit a.round a.charpoly a.is_zero a.save a.conjugate a.lcm a.sobj a.copy a.list a.sqrt a.db a.minpoly a.sqrt_approx a.denom a.mod a.squarefree_part a.denominator a.mod_ui a.str a.divides a.multiplicative_order a.subs a.dump a.n a.substitute a.dumps a.norm a.support a.factor a.nth_root a.trace a.floor a.numer a.val_unit a.gamma a.numerator a.valuation a.gcd a.order a.version a.height a.parent sage: # Ahora los metodos que empiezan por d sage: a.d a.db a.denominator a.dump a.denom a.divides a.dumps sage: # Pedimos ayuda sobre metodo denominator sage: a.denominator? Type: builtin_function_or_method Base Class: <type builtin_function_or_method> String Form: <built-in method denominator of sage.rings.rational.Rational object at 0x9df295c> Namespace: Interactive Docstring: self.denominator(): Return the denominator of this rational number. EXAMPLES: sage: sage: 11 sage: sage: 1
Class Docstring: <attribute __doc__ of builtin_function_or_method objects> sage: # Ahora las funciones que empiezan por j j_invariant_qexp jacobi_P join jacobi jobs jordan_block
jsmath
Dado un nmero entero n, el primer nmero mayor que n y primo u u .next_prime() Anlogamente el primo inmediatamente anterior a n se calcula con la funcin (en la versin a o o 3.2.3 de Sage no es un mtodo) e previous_prime() Las siguientes funciones se expresan por si mismas (del mismo modo que la anterior, no son mtodos, solamente funciones) e next_prime_power(), previous_prime_power()
Sage sage: True sage: True sage: False sage: 11 sage: 13 sage: 16 sage: 89 sage: a = 89; a.is_prime() 81.is_prime_power() 100.is_prime_power() 9.next_prime() previous_prime(16) next_prime_power(14) previous_prime_power(90) # Efectivamente, puesto que 89 = 89^1 # Sabemos que 81 = 3^4 # Sin embargo 100 = 2^2*5^2
Cuando el nmero es compuesto podemos estar interesados en obtener su descomposicin en u o factores primos .factor() Muy relacionado con el problema de la factorizacin, se encuentra el problema de hallar todos o los divisores de un nmero dado. Multiplicando cualesquiera factores de la descomposicin de u o un nmero obtenemos un divisor de dicho nmero. Es ms, cualquier divisor se puede obtener u u a de ese modo. Para obtener una lista con todos los divisores de un nmero u .divisors()
Sage sage: 360.factor() 2^3 * 3^2 * 5 sage: # Comprobemos que es correcto sage: 2^3 * 3^2 * 5 360 sage: 180.divisors() [1, 2, 3, 4, 5, 6, 9, 10, 12, 15, 18, 20, 30, 36, 45, 60, 90, 180]
Ahora consideramos los mltiplos positivos de n y los de m. Hacemos la interseccin de dichos u o conjuntos. Dicha interseccin es no vac puesto que nm est en ambos conjuntos. De todos los o a, a elementos de dicha interseccin debe existir uno que sea el menor de todos (necesariamente es o menor o igual que nm). Dicho nmero es el m u nimo comn mltiplo. u u Para calcular el mximo comn divisor de dos enteros a u .gcd() El m nimo comn mltiplo u u .lcm()
Sage sage: (78).gcd(24) 6 sage: (78).lcm(24) 312 sage: # El producto del minimo por el maximo da el producto de los numeros sage: 6 * 312, 78 * 24 (1872, 1872)
Las operaciones aritmticas se realizan nuevamente con los operadores habituales. En las rese puestas de Sage la unidad imaginaria se escribe en maysculas. Las operaciones con nmeros u u complejos se realizan en aritmtica aproximada, por lo que son susceptibles a errores. Adems e a el nmero de decimales que da el programa puede hacer dif la lectura del resultado. u cil 1.8. Nmeros complejos u 9
Sage sage: i = CC(i) sage: a = 5 + 8*i sage: b = 3.4 + 9*i sage: a + b 8.40000000000000 + 17.0000000000000*I sage: 3*a + 8.9*b 45.2600000000000 + 104.100000000000*I sage: a - b 1.60000000000000 - 1.00000000000000*I sage: a * b -55.0000000000000 + 72.2000000000000*I sage: a / b 0.961538461538461 - 0.192307692307692*I sage: a^5 25525.0000000000 - 70232.0000000000*I
Dado el nmero complejo z = a+bi su parte real es a y su parte imaginaria es b. Para obtenerlas u utilizamos los mtodos e .real(), .imag() El mdulo o valor absoluto es o a2 + b2 .abs() El conjugado es a bi .conjugate() La norma de un nmero complejo se obtiene multiplicando dicho nmero por su complejo u u conjugado. Es siempre un nmero real, que resulta coincidir con a2 + b2 u .norm() Si imaginamos el nmero complejo z = a + bi como el vector (a, b), dicho vector forma con u la parte positiva del eje de las x un cierto ngulo. Es el denominado argumento del nmero a u complejo (Sage lo mide en radianes) .arg(), argument()
Sage sage: i = CC(i) sage: a = 5 + 8*i sage: a.real() 5.00000000000000 sage: a.imag() 8.00000000000000 sage: a.abs() 9.43398113205660 sage: a.norm() 89.0000000000000
10
sage: sqrt(89.0) 9.43398113205660 sage: a.conjugate() 5.00000000000000 - 8.00000000000000*I sage: a * a.conjugate() 89.0000000000000 sage: a.arg() 1.01219701145133
Como consecuencia del Teorema Fundamental del Algebra todo nmero complejo tiene exactau n a debe tener n soluciones). Para conocerlas mente n ra ces n-simas (pues el polinomio x e utilizamos el comando .nth_root(n) donde debemos indicar como argumento el orden de la ra deseada. Por defecto Sage solamente z nos devuelve una de las ra ces. Si utilizamos la opcin all = True nos devuelve una lista con o todas las ra ces. Para el caso de la ra cuadrada se puede utilizar sqrt(). z
Sage sage: i = CC(i) sage: a = 4.6 + 9.68*i sage: b = a.nth_root(5); b 1.56634459784419 + 0.359216283265026*I sage: b^5 4.59999999999999 + 9.68000000000000*I sage: a.nth_root(5, all = True) [1.56634459784419 + 0.359216283265026*I, 0.142392112822719 + 1.60068617272853*I, -1.47834143238984 + 0.630062176803190*I, -1.05605736501685 - 1.21128633243841*I, 0.825662086739775 - 1.37867830035833*I] sage: sqrt(a) 2.76743452871272 + 1.74891219639849*I sage: sqrt(a, all = True) [2.76743452871272 + 1.74891219639849*I, -2.76743452871272 - 1.74891219639849*I]
1.9. Miscelnea a
Normalmente los nmeros se escriben en base 10, pero se pueden expresar en otras bases. u Sage est especialmente preparado para esta circunstancia. Si escribimos un nmero entero a u que comience por 0, Sage entender que es un nmero escrito en el sistema octal. Si el nmero a u u empieza por 0x entiende que es un nmero escrito en hexadecimal. Para transformar un nmero u u a otra base b (necesariamente menor que 36, que es la suma de las diez cifras y las 26 letras) se emplea el mtodo e .str(b) La factorial de un nmero entero positivo es el producto de todos los nmeros enteros positivos u u menores o iguales que el dado 1.9. Miscelnea a 11
.factorial() La sucesin de Fibonacci es 1, 1, 2, 3, 5, 8, . . . . Los dos primeros trminos son la unidad. Los o e siguientes se obtienen sumando los dos anteriores. Para conocer el trmino n-simo de la sucesin e e o fibonacci() En una seccin anterior hemos dado la denicin ms elemental del concepto de mximo comn o o a a u divisor. Sin embargo muchas veces es ms util utilizar la siguiente. Dados dos enteros p y q, a consideremos todos los nmeros naturales que se pueden expresar en la forma np + mq, siendo n u y m nmeros enteros arbitrarios. El elemento m u nimo de dicho conjunto coincide con el mximo a comn divisor. Adems del mximo comn divisor d, muchas veces es necesario conocer una u a a u pareja de nmeros enteros n, m que cumplan np + mq = d. Para obtener todo empleamos el u comando .xgcd()
Sage sage: 010, 011, 012 (8, 9, 10) sage: 0x10, 0x11, 0x12 (16, 17, 18) sage: 03456 + 0x23a 2408 sage: 348.str(2) 101011100 sage: 348.str(23) f3 sage: factorial(4), factorial(5), 5*factorial(4) (24, 120, 120) sage: fibonacci(6), fibonacci(7), fibonacci(8) (8, 13, 21) sage: xgcd(78,24) (6, 9, -29) sage: 9*78 + (-24)*29 6
12
CAP ITULO
TWO
Ecuaciones y sistemas
Sage puede resolver muchos tipos de ecuaciones. Algunas las resuelve de un modo exacto y otras de un modo aproximado. Adems de esto tambin resuelve ecuaciones en modo simblico. En a e o este caso los coecientes de la ecuacin son letras. o
13
Hasta ahora en todas las ecuaciones que hemos resuelto la incgnita (o varible) es x. Si intentao mos repetir esto con otra letra, el programa nos informar de un error. Naturalmente se pueden a resolver ecuaciones con otro nombre de variable, pero para ello, antes de intentar resolverla debemos escribir var(letra) La letra debe ir necesariamente entre comillas simples. Se pueden ((inicializar)) ms letras escria biendo varias separadas por comas (o simplemente por espacios).
Sage sage: var(a) a sage: solve(a^2 - 5*a + 6, a) [a == 3, a == 2] sage: var(b,c,d,e) # Ya podemos utilizar todas estas letras (b, c, d, e) sage: solve(d^2 - 5*d + 6, d) [d == 3, d == 2]
Es muy comn que al resolver ecuaciones aparezcan soluciones complejas. El s u mbolo que usa el programa para la unidad imaginaria es I.
Sage sage: solve(x^2 +4,x) # Solucion compleja [x == -2*I, x == 2*I] sage: solve(3*x^3 + 5*x^2 - 4*x +5,x) [x == 61*(sqrt(3)*I/2 - 1/2)/(81*(sqrt(1423)/(18*sqrt(3)) - 2005/1458)^(1/3)) + (sqrt(1423)/(18*sqrt(3)) - 2005/1458)^(1/3)*(-sqrt(3)*I/2 - 1/2) - 5/9, x == (sqrt(1423)/(18*sqrt(3)) - 2005/1458)^(1/3)*(sqrt(3)*I/2 - 1/2) + 61*(-sqrt(3)*I/2 - 1/2)/(81*(sqrt(1423)/(18*sqrt(3)) - 2005/1458)^(1/3)) - 5/9, x == (sqrt(1423)/(18*sqrt(3)) - 2005/1458)^(1/3) + 61/(81*(sqrt(1423)/(18*sqrt(3)) - 2005/1458)^(1/3)) - 5/9]
14
Para desarrollar (expandir) ambos miembros de una ecuacin se emplea el mtodo o e .expand() Si queremos quedarnos con el primer miembro de la ecuacion .left() y para la parte derecha .right() Para sustituir la variable por un valor particular .subs(x = valor) 2.3. Manipulacin de ecuaciones o 15
Sage sage: f = (x-3)^2 + (3*x-5)/89 == (2*x - 5)*(x-2) sage: f (3*x - 5)/89 + (x - 3)^2 == (x - 2)*(2*x - 5) sage: f.expand() x^2 - 531*x/89 + 796/89 == 2*x^2 - 9*x + 10 sage: f.left() (3*x - 5)/89 + (x - 3)^2 sage: f.right() (x - 2)*(2*x - 5) sage: # Sustituimos x por el valor 7 sage: f.subs(x=7) 1440/89 == 45
16
CAP ITULO
THREE
Polinomios
A nivel elemental, un polinomio es simplemente una expresin algebraica formada con nmeros, o u letras y operaciones de suma, resta, multiplicacin y potenciacin. Sin embargo a un nivel ms o o a avanzado debemos indicar, de manera expl cita, que tipo de nmeros van a ser los coecientes u y la letra con la que vamos a trabajar. Nosotros adoptaremos este ultimo punto de vista para extraer todo el potencial de Sage. En general, de ahora en adelante, los coecientes sern nmeros racionales o enteros, puesto que a u el programa trabaja con ellos utilizando aritmtica exacta. Para ello, al comienzo del trabajo con e Sage debemos escribir lo siguiente (no es necesario entender lo que signica esta instruccin). o R.<x> = PolynomialRing(QQ) En este caso empleamos la letra x y QQ es la forma en que Sage denota el cuerpo de los nmeros u racionales. Existen otras formas de construir el anillo de polinomios con coecientes en Q. La siguiente tiene el mismo efecto y es ms corta a R.<x> = QQ[]
17
Sage sage: R.<x> = QQ[] sage: # Aunque no es obligatorio es conveniente nombrar los polinomios sage: f = 3*x^4 + 5*x^3 + 3*x + 2 sage: type(f) <class sage.rings.polynomial.polynomial_element_generic. Polynomial_rational_dense> sage: # Si hemos nombrado al polinomio, evaluarlo se hace como en Matematicas sage: f(0), f(1), f(89) (2, 13, 191751837) sage: g = x^2 - 4*x + 1 sage: f + g 3*x^4 + 5*x^3 + x^2 - x + 3 sage: f - g 3*x^4 + 5*x^3 - x^2 + 7*x + 1 sage: f * g 3*x^6 - 7*x^5 - 17*x^4 + 8*x^3 - 10*x^2 - 5*x + 2 sage: g^3 x^6 - 12*x^5 + 51*x^4 - 88*x^3 + 51*x^2 - 12*x + 1 sage: # Hallamos el cociente sage: f // g 3*x^2 + 17*x + 65 sage: # Ahora el resto sage: f % g 246*x - 63 sage: f.base_ring() Rational Field sage: f.parent() Univariate Polynomial Ring in x over Rational Field
3.2. Factorizacin o
Decimos que un polinomio g divide a f si al realizar la divisin eucl o dea de f entre g el resto es nulo. Es claro que todo polinomio f no nulo es divisible por cualquier constante k. Asimismo es divisible por todo polinomio de la forma kf , siendo k una constante no nula. Estos divisores se denominan triviales. Si un polinomio posee algn divisor no trivial decimos que es reducible. u En caso contrario, esto es, si sus unicos divisores son los triviales, decimos que el polinomio es irreducible. La cuestin de la irreducibilidad es delicada, pues depende en gran medida del o cuerpo base. Por ejemplo, x2 + 1 es irreducible como polinomio con coecientes racionales, pero entendido como polinomio con coecientes complejos es reducible, pues es divisible entre x i. El mismo comentario es vlido en la cuestin de la factorizacin de un polinomio en factores a o o irreducibles. La comprobacin de que un polinomio es irreducible (sobre el cuerpo de denicin) o o .is_irreducible() Para factorizar un polinomio (sobre el cuerpo de denicin) o .factor() Para obtener el mximo comn divisor de dos polinomios (que es independiente del cuerpo base) a u 18 Cap tulo 3. Polinomios
Sage sage: R.<x> = QQ[] sage: f = (x^2 + 1) * (x - 3)^2 * (x^2 - 2) * (5*x -13) sage: f.roots() [(13/5, 1), (3, 2)] sage: # Tiene la raiz 13/5 simple y la raiz 3 doble. No tiene mas raices en Q sage: f.real_roots() [-1.41421356237310, 1.41421356237310, 2.60000000000012, 2.99999974717083, 3.00000025282904] sage: # Han aparecido dos soluciones mas, que son las raices cuadradas de 2 sage: # Ademas observamos que la raiz doble 3 ahora son dos soluciones sage: # muy proximas a 3. Esto es debido a que se trabaja en modo aproximado sage: f.complex_roots() [-1.41421356237310, 1.41421356237310, 2.60000000000012, 2.99999974717083, 3.00000025282904, 3.06978292612115e-16 + 1.00000000000000*I, 3.06978292612115e-16 - 1.00000000000000*I] sage: # Las soluciones complejas, que son i y -i, se dan de modo aproximado
20
3.5. Miscelnea a
Muchos de estos comandos pueden parecer intiles, y ciertamente lo son, si trabajamos con Sage u en modo interactivo (esto es, tecleando comandos y esperando la contestacin). Sin embargo o pueden ser muy utiles cuando se programa en Sage. El grado de un polinomio .degree() Para obtener una lista con todos los coecientes, ordenados de grado menor a grado mayor .coeffs() Para derivar e integrar polinomios .derivative(), .integral() La grca del polinomio se obtiene con a .plot() Se pueden pasar varias opciones a este ultimo mtodo para mejorar la visualizacin de la grca e o a (ver el cap tulo sobre representacin grca). o a
Sage sage: R.<x> = QQ[x] sage: f = x^4 + 3*x^3 - 2*x^2 + 9 sage: f.degree() 4 sage: f.coeffs() [9, 0, -2, 3, 1] sage: f.derivative() 4*x^3 + 9*x^2 - 4*x sage: f.integral() 1/5*x^5 + 3/4*x^4 - 2/3*x^3 + 9*x sage: f.plot() sage: # Por defecto lo dibuja en el intervalo (0,1) y en color azul sage: f.plot(-3,2, color = red) sage: # Ahora se dibuja en el intervalo (-3,2) y en color rojo
3.5. Miscelnea a
21
22
CAP ITULO
FOUR
Despus de la funcin, podemos aadir, separados por comas, los extremos del intervalo donde e o n queremos dibujar la grca. a
Sage sage: f(x) = x^2 -2*x +3 sage: f.plot(-2,5) # Dibujo en el intervalo [-2,5]
Podemos cambiar el color de grca aadiendo la opcin color. El nombre del color debe gurar a n o entre comillas simples. Existen otras opciones como thickness que afecta al grosor de la grca. a Para ver todas las opciones del comando (y sus valores por defecto) tecleamos plot.options (sin parntesis). e
Sage sage: f = x^2 - 2*x + 3 sage: plot(f, -3, 4, color = red, thickness = 2)
23
Sin embargo la mejor opcin es construir una verdadera funcin denida a trozos y despus o o e representarla. A efectos grcos no tiene mucha importancia, pero en otros temas si la tendr. a a La orden para denir una funcin con varios trozos es o Piecewise()
Sage sage: f = Piecewise([[(-5,-1),sin(x)],[(-1,2),x^2],[(2,4),x]]); f Piecewise defined function with 3 parts, [[(-5, -1), sin(x)], [(-1, 2), x^2], [(2, 4), x]] sage: f.plot()
24
25
sage: a = point2d((2,3)) sage: b = line2d([(-1,-2),(4,1)]) # Una linea (o mejor un segmento) sage: c = circle((2,1), 1.5) sage: type(a) <class sage.plot.plot.Graphics> sage: # El comando show muestra los objetos graficos. La suma de objetos sage: # graficos significa que los muestra todos sage: show(a + b + c, aspect_ratio = 1) # Ejes con la misma escala
26
CAP ITULO
FIVE
Anlisis a
Puede denirse el Anlisis, de una manera un tanto tosca, como el estudio de las funciones. a Las funciones ms elementales son sin lugar a duda las polinmicas, construidas con una variaa o ble y las operaciones de suma, resta y multiplicacin. A un nivel un poco ms elevado estn o a a las funciones algebraicas, formadas por cocientes de polinomios. En estas encontramos ya los primeros problemas con el dominio de denicin. Sin embargo pronto se descubre que con estas o funciones no es suciente. A pesar de que el abanico de posibilidades es ilimitado, la siguiente tabla muestra algunas de las funciones predenidas en Sage. Su uso es similar al que se realiza en Matemticas. a sin(x) cos(x) tan(x) asin(x) acos(x) atan(x) abs(x) sinh(x) cosh(x) tanh(x) exp(x) log(x, base) ln(x) Seno de x medido en radianes Coseno de x medido en radianes Tangente de x medido en radianes ArcoSeno de x ArcoCoseno de x ArcoTangente de x Valor absoluto de x Seno hiperblico de x o Coseno hiperblico de x o Tangente hiperblica de x o Exponencial de base el nmero e u Logaritmo. Por defecto la base es e Logaritmo natural (en base e)
5.1. L mites
El primer concepto necesario para desarrollar el Anlisis es el de l a mite. Para calcular un limite necesitamos al menos dos datos: una funcin y un punto en el que calcular el l o mite. Para la existencia de l mite los dos l mites laterales deben existir y coincidir. Si queremos especicar un l mite lateral necesitamos informar al programa de otro dato, lo que haremos con la opcin dir, o que puede adoptar los valores (siempre entre comillas simples) plus (por la derecha) o minus (por la izquierda). Tambin es muy habitual calcular l e mites en el innito. La notacin de Sage o para el innito es oo. El comando para calcular l mites es limit(f, x = a) Este comando tiene una opcin, llamada Taylor, que nos permite resolver ms l o a mites. Un comentario sobre el polinomio de Taylor se da en la ultima seccin de este cap o tulo. 27
Sage sage: f = x^2 + 3 sage: limit(f, x = 7) # Un limite sencillo 52 sage: f.subs(x = 7) # Se podria haber hecho por sustitucion 52 sage: limit(sin(x)/x, x = 0) # Este da lugar a una indeterminacion 1 sage: limit(ln(x), x = 0, dir = plus) # Por la izquierda no existe -Infinity sage: limit(exp(x), x = oo), limit(exp(x), x = -oo) (+Infinity, 0) sage: var(t) # Se puede utilizar cualquier variable t sage: limit(sin(t)/t, t = 0) 1
5.2. Derivadas
Las derivadas de funciones se calculan con los comandos (ambos comando son ((alias)), o sea, son exactamente iguales) diff(), derivative() Si la funcin a derivar es de una sola variable se pueden usar con un unico argumento.El segundo o argumento, que por defecto es 1, indica el orden de derivacin (derivada segunda, tercera, etc). o
Sage sage: f(x) = x^4 + 3*x^3 + 2*x + sin(x); f x |--> sin(x) + x^4 + 3*x^3 + 2*x sage: f.diff() x |--> cos(x) + 4*x^3 + 9*x^2 + 2 sage: f.diff(3) # Derivada tercera x |--> -cos(x) + 24*x + 18 sage: f.derivative() # El otro comando x |--> cos(x) + 4*x^3 + 9*x^2 + 2
Si la funcin es de varias variables, tenemos la derivada parcial. Para ello es necesario indicar, o como segundo argumento, la variable sobre la que se deriva. Por lo dems el funcionamiento es a similar al caso de una variable.
Sage sage: var(x,y) (x, y) sage: f(x,y) = x^4*y^5 sage: f.diff(x) # Derivada parcial respecto a x (x, y) |--> 4*x^3*y^5 sage: f.diff(x,3) # Derivada parcial tercera respecto a x (x, y) |--> 24*x*y^5 sage: f.diff(x,y) # Derivada parcial respecto a x y a y (x, y) |--> 20*x^3*y^4 sage: f.diff(x,2,y,3) # Segunda respecto a x y tercera respecto a y (x, y) |--> 720*x^2*y^2
28
5.3. Integrales
Para realizar integrales empleamos los comandos (alias) integral(), integrate() Dicha funcin tiene cuatro argumentos, siendo los tres ultimos opcionales. El primero es la o funcion a integrar. Si la funcion tiene una sola variable con esto llega para realizar integrales indenidas. El segundo argumento es la letra sobre la que se realiza la integracin. Si la funcin o o tiene ms de una variable es imprescindible informar de ello al programa. La integracin en a o cualquiera de los dos casos es indenida. Los dos ultimos argumentos son los l mites inferior y superior, por lo que si los aadimos estaremos realizando una integracin denida. n o
Sage sage: f(x) = x^2 sage: f.integral() x |--> x^3/3 sage: f.integral(x,0,10) # Esta ya es una integral definida 1000/3 sage: var(a) a sage: f(a,x) = a * sin(x) # Una funcion con dos variables sage: f.integral(x) (a, x) |--> -a*cos(x) sage: f.integral(a) (a, x) |--> a^2*sin(x)/2
5.3. Integrales
29
30
CAP ITULO
SIX
31
Para realizar el producto escalar de dos vectores se pueden emplear indistintamente los siguientes mtodos (aunque tambin se puede utilizar el asterisco) e e .dot_product(), .inner_product() La norma de un vector (que es la ra cuadrada del producto escalar del vector consigo mismo) z .norm()
Sage sage: u = vector([2, 5, 6]); v = vector([4, 3/5, 8/3]) sage: u.dot_product(v) 27 sage: v.inner_product(u) 27 sage: u * v # La multiplicacion de vectores es la escalar 27 sage: u.norm(), u * u (sqrt(65), 65)
Para el producto vectorial (denido solamente para vectores tridimensionales) .cross_product() Aunque no es muy habitual, tambin a veces es necesario multiplicar dos vectores coordenada e a coordenada, siendo el resultado un vector de la misma dimensin o .pairwise_product() Para transponer un vector y ((colocarlo)) vertical .transpose() El resultado de transponer un vector, no es un vector sino una matriz. Sage puede dibujar vectores de dos y tres dimensiones. El mtodo para hacerlo es e .plot()
Sage sage: u = vector([2, 5, 6]) sage: v = vector([4, 3/5, 8/3]) sage: # El producto vectorial no conmuta, sino que anticonmuta sage: u.cross_product(v); v.cross_product(u) (146/15, 56/3, -94/5) (-146/15, -56/3, 94/5) sage: u.pairwise_product(v) (8, 3, 16) sage: u.transpose() [2] [5] [6] sage: <type sage: sage:
32
[-3 7 9] [ 8 -3 -7] [-2 0 9] sage: type(A) <type sage.matrix.matrix_integer_dense.Matrix_integer_dense> sage: A.base_ring() Integer Ring sage: A + B [-2 11 15] [11 3 1] [-5 8 10]
33
sage: 3*A - 5*B [ 18 -23 -27] [-31 33 59] [ 1 24 -42] sage: # La multiplicacin no es conmutativa o sage: A * B [ 17 -5 35] [ 23 3 57] [ 71 -45 -74] sage: B * A [ -9 102 47] [ 20 -42 17] [-29 64 -3] sage: A^3 [ 91 788 [ 111 1252 [ 9 712 622] 952] 507]
Escribir matrices de ordenes altos suele resultar tedioso. Sage es capaz de ((inventarse)) matrices por nosotros. Para ello debemos indicarle de que tipo van a ser los elementos de la matriz, el tamao de la matriz y el mximo de los nmeros aleatorios que puede generar el programa. La n a u orden es random_matrix(ZZ, n, m, x = max) Aqu n y m indican el tamao de la matriz. Si se omite alguno de ellos, el programa supone que n la matriz es cuadrada. Para constuir la matriz identidad de orden n identity_matrix(n) Para construir una matriz diagonal diagonal_matrix(lista) donde lista es una lista formada por los elementos de la diagonal principal.
sage: A = [7 4 7 7] [2 2 0 3] [5 6 6 4] sage: I = sage: I * True sage: D = [ 3 0 0 [ 0 6 0 [ 0 0 -2 [ 0 0 0 Sage random_matrix(ZZ, 3, 4, x = 10); A
identity_matrix(3) A == A diagonal_matrix([3,6,-2,7]); D 0] 0] 0] 7]
34
6.3. Determinantes
Los determinantes son nmeros asociados a las matrices cuadradas. En ellos est resumido cierta u a informacin algebraica y geomtrica relacionada con la matriz. Es conocido que una matriz es o e invertible si y solamente si su determinante es distinto de cero. Si la matriz no es cuadrada, ((tachando)) las y columnas podemos conseguir matrices cuadradas. Los determinantes de dichas matrices son los llamados menores. Ligado a estos menores est el concepto de rango, que es el a orden del mayor menor no nulo (aunque lo parezca no es un juego de palabras). Los menores tambin sirven para construir la llamada matriz adjunta, muy relacionada con la inversa de la e matriz. Para calcular el determinante hay dos rdenes sinnimas o o .det(), .determinant() Para transponer una matriz .transpose()
Sage sage: A = random_matrix(ZZ, 4, x = 10); A [4 2 3 7] [6 9 3 2] [4 9 2 5] [1 6 0 4] sage: B = A.transpose() sage: A.det(); B.det() 62 62 sage: # Veamos la potencia de calculo de Sage sage: A = random_matrix(ZZ, 500, x = 100) # Una matriz de buen tama~o n sage: # Si escribimos time delante de un comando, nos dice lo que tarda sage: # nuestro ordenador en realizar la operacion sage: time A.det() CPU times: user 9.21 s, sys: 0.07 s, total: 9.28 s Wall time: 9.47 s -51312118766062178215790287935910377804815521445276795844487992527289790 185754714277249296185253535819264346574960388348158150444222215717575271 582620208094273237654671407368449045494839625212568472820719182539369433 864144720619663533251447469207291330153663448885671161958743048804994401 033369198349588668211157092638507512238595926560582643712759086633633708 482592874208145460666299045405171350050208266234159017778314185118760333 122454222253557536031505255901630478649166521589863768860741764828469001 683955795874513743653697706392383461862894573146608266064281142813682113 343342262901515285739793161679021156636778269697375440293345428819927467 796075365373944915716559812112994273303001261081017214968312830561064174 742102238656132613385336089794969093158673579033166743398037770518036090 200513908945937873038712551913007436660951653274622106974218118890880317 868291047134215148396261992465767292143426822492602358671070588167633756 452096207163642405442038989272613126779682918059872287314653467587309168 493206248897710248054823898698472410039075480209369247191548256509067865 446925519063716764816895631173310097276903861710660521969905714397564184 207334741277542639830742489806961602424027410160496053353915810429096033 824699653357329390587994669534905897466587232310063644315336894711907545 5330
6.3. Determinantes
35
Si la matriz es invertible, su inversa se calcula elevando a -1 o con la orden .inverse() Los menores de una matriz .minors(n) donde n es el tamao de los menores. Debemos tener cuidado pues la colocacin de los menores n o puede resultar inesperado para muchos, puesto que no es el mismo que el que se utiliza en la matriz adjunta. El rango de la matriz .rank() La matriz adjunta .adjoint() En Espaa se suele denominar matriz adjunta a la formada por los menores. Si queremos n construir la matriz inversa, esta matriz adjunta, la debemos transponer y despus dividir por e un nmero. Sin embargo en los pa u ses anglosagones denominan matriz adjunta a lo que para nosotros ser la matriz adjunta y transpuesta. Naturalmente Sage sigue la convencin angloa o sagona.
sage: sage: -906 sage: sage: 4 sage: sage: Sage A = random_matrix(ZZ, 4, x = 10) A.det() # Determinante no nulo, implica rango maximo A.rank() # Dos formas de calcular la inversa A^(-1) -8/453] 49/302] 5/302] -23/302]
[ 38/453 61/453 -104/453 [ -22/151 -15/302 33/302 [ 7/151 -57/302 65/302 [ -2/151 81/302 3/302 sage: A.inverse()
[ 38/453 61/453 -104/453 -8/453] [ -22/151 -15/302 33/302 49/302] [ 7/151 -57/302 65/302 5/302] [ -2/151 81/302 3/302 -23/302] sage: # Observese la colocacion de los menores y el signo sage: A.adjoint() [ -76 -122 208 16] [ 132 45 -99 -147] [ -42 171 -195 -15] [ 12 -243 -9 69] sage: A.minors(3) [69, 15, -147, -16, 9, -195, 99, 208, -243, -171, 45, 122, -12, -42, -132, -76]
36
37
[ 1 0] [-4 0] [ 1 -1] [ 2 -1] sage: X = A.solve_right(B); X [-27/23 4/23] [ 17/69 -17/69] [-82/69 -56/69] [-88/69 19/69] sage: A * X [ 1 0] [-4 0] [ 1 -1] [ 2 -1] sage: # Si B es un vector, Sage comprende lo que queremos hacer sage: b = vector([1,4,7, 90]) sage: X = A.solve_right(b); X (-265/23, 2039/207, 6116/207, -5254/207) sage: A * X (1, 4, 7, 90)
38
CAP ITULO
SEVEN
Algebra Lineal
El concepto fundamental del Algebra Lineal es el de espacio vectorial. Un espacio vectorial es un grupo abeliano donde se ha denido una multiplicacin por escalares. Los escalares forman o siempre un cuerpo (si solamente forman un anillo, la estructura se denomina mdulo). Fijado un o cuerpo k, para cada nmero entero n existe un unico (salvo isomorsmos) k-espacio vectorial de u dimensin n. Tambin existen espacios vectoriales de dimensin innita, aunque no trataremos o e o n con las estructuras cannicas es un modelo de espacio ahora de ellos. El espacio coordenado k o vectorial de dimensin n. o
Sage sage: V = VectorSpace(QQ, 5); V Vector space of dimension 5 over Rational Field sage: W = QQ^5; W Vector space of dimension 5 over Rational Field sage: V == W True sage: a = V([3,7,9,2/7,1]) sage: a in V True sage: V.dimension() 5 sage: V.basis() [ (1, 0, 0, 0, 0), (0, 1, 0, 0, 0), (0, 0, 1, 0, 0), (0, 0, 0, 1, 0), (0, 0, 0, 0, 1) ] sage: V.basis_matrix() [1 [0 [0 [0 [0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0] 0] 0] 0] 1]
Dentro del espacio vectorial ambiente existen subconjuntos que tienen estructura de espacio vectorial. Son los denominados subespacios vectoriales. Para especicar un subespacio vectorial debemos dar un conjunto de vectores que lo generen, utilizando la orden .subspace(lista) Los subespacios son ellos mismos espacios vectoriales, por ello todo lo dicho para espacios vectoriales vale para subespacios. El problema que tiene este comando es que nosotros damos los vectores que generan y Sage ((elige)) una base del subespacio. Posiblemente no sea la base que a nosotros nos interese. Si queremos jar una base del subespacio empleamos el comando .subspace_with_basis(lista) En este caso la lista deben ser vectores linealmente independientes y formarn la base asociada a a dicho subespacio.
sage: sage: sage: sage: sage: Sage V = QQ^5 a = V([2,5,7,2,7]); b = V([2,0,8,2,5]); c = V([1,8,3,2,-90]) # El subespacio generado por a y b es W = V.subspace([a,b] W.basis_matrix()
[ 1 0 4 1 5/2] [ 0 1 -1/5 0 2/5] sage: # Ahora construimos un subespacio vectorial donde a y b sean base
40
Si W y Z son subespacios de un mismo espacio vectorial (el llamado espacio vectorial ambiente) podemos realizar la interseccin conjuntista de ambos subespacios. Resulta que el conjunto o resultante es nuevamente un subespacio. La orden es W.intersection(Z) El m nimo subespacio que contiene a la vez a W y a Z se denota habitualmente W + Z y se dice que es la suma de dos subespacios. En Sage se utiliza la misma notacin. o Todo espacio vectorial (en particular los subespacios) en Sage tienen vectores de n coordenadas (aunque el espacio vectorial puede tener dimensin menor). Se denomina grado de un espacio o vectorial precisamente al tamao de los vectores que lo contienen. Si un espacio vectorial tiene n grado n, es de modo natural un subespacio de k n . Este ultimo conjunto es lo que se denomina espacio vectorial ambiente. Las rdenes para extraer la informacin son o o .degree(), .ambient_vector_space()
sage: sage: sage: sage: sage: 5 sage: 2 sage: Sage V = QQ^5 a = V([2,5,7,2,7]); b = V([2,0,8,2,5]); c = V([1,8,3,2,-90]) W = V.subspace([a,b]) Z = V.subspace([b,c]) W.degree() W.dimension() W.intersection(Z)
Vector space of degree 5 and dimension 1 over Rational Field Basis matrix: [ 1 0 4 1 5/2] sage: W + Z Vector space of degree 5 and dimension 3 over Rational Field Basis matrix: [ 1 0 0 -17/3 1281/2] [ 0 1 0 1/3 -63/2] [ 0 0 1 5/3 -319/2]
41
el Algebra Lineal sea muy estrecha. Veamos algunos puntos donde las matrices se aplican al Algebra Lineal. Fijadas bases en dos espacios vectoriales, cada aplicacin lineal entre los espacios vectoriales da o lugar a una matriz. El tamao de la matriz es el producto de las dimensiones de ambos espacios. n La correspondencia inversa tambin es correcta: a cada matriz le corresponde una aplicacin e o lineal (una vez jadas las bases). Esta es la primera relacin que guardan las matrices con los o espacios vectoriales. Si tomamos una matriz, cada una de sus las puede considerarse como un vector. Por lo tanto una matriz ((es)) un conjunto de vectores. Lo mismo puede decirse de las columnas de la matriz. Cada matriz simtrica induce un producto escalar (no necesariamente denido positivo) en un e espacio vectorial (una vez jada una base). Aunque Sage permite tratar este aspecto, no lo discutiremos en estas notas. En todo lo que sigue supondremos que las matrices y vectores tienen los tamaos adecuados n para poder realizar las multiplicaciones. Asimismo a veces debemos entender un vector como una columna y no como una la. Dada una matriz A, se dice que un vector v pertenece al ncleo de A si vA = 0. Es fcil ver que u a el ncleo de cualquier matriz es siempre un subespacio vectorial. Esta el la nocin de Sage para u o el ncleo de una matriz. Sin embargo en Algebra Lineal es ms habitual considerar el ncleo de u a u una matriz al conjunto v de vectores que satisfacen Av = 0. Por ello Sage tiene varios comandos relacionados con matrices que comienza o bien por left o bien por right. En particular para calcular los ncleos de una matriz tenemos los comandos u .left_kernel(), .right_kernel()
Sage sage: A = random_matrix(QQ, 3, 5); A [ 0 1 0 0 0] [ -1 -1 -1/2 1 1/2] [ 1 2 1 0 -2] sage: A.kernel() Vector space of degree 3 and dimension 0 over Rational Field Basis matrix: [] sage: A.left_kernel() Vector space of degree 3 and dimension 0 over Rational Field Basis matrix: [] sage: A.right_kernel() Vector space of degree 5 and dimension 2 over Rational Field Basis matrix: [ 1 0 0 3/4 1/2] [ 0 0 1 1/4 1/2] sage: # Comprobemos que el primer vector de la base pertenece al ncleo u sage: A * vector(QQ, [1, 0, 0, 3/4, 1/2]).transpose() [0] [0] [0] sage: # Veamos que kernel es lo mismo que left_kernel en Sage sage: A = random_matrix(QQ, 5, 3) sage: A.kernel() == A.left_kernel() True
42
Dada una matriz A, entendemos que sus columnas son vectores de la dimensin adecuada. El o subespacio que generan las columnas de la matriz se obtiene con el mtodo e .column_space() Un resultado de Algebra Lineal dice que la dimensin de este subespacio vectorial coincide o con el rango de la matriz (que es nmero de vectores columna linealmente independientes). Si u queremos hacer lo mismo, pero con los vectores la, la orden es .row_space() El espacio vectorial tiene como cuerpo asociado el mismo que la matriz.
43
# A B C
Sage Construiremos una matriz C que tenga autovalores y no sea trivial = diagonal_matrix(QQ,[4, 4, -5, 1, 12]) = random_matrix(ZZ, 5, x = 5) = B * A * B^(-1); C
[-1089/268 662/67 -415/268 -411/134 267/134] [-1807/134 731/67 707/134 -129/67 477/67] [-1597/268 620/67 237/268 -207/134 111/134] [-1831/134 736/67 263/134 79/67 381/67] [-1573/134 967/67 -391/134 -147/67 475/67] sage: f = C.charpoly() sage: g = C.minpoly() sage: # El polinomio minimo siempre es divisor del caracteristico sage: g.divides(f) True sage: # Ademas tienen las mismas raices (aunque distinta multiplicidad) sage: f.roots(); g.roots() [(12, 1), (1, 1), (-5, 1), (4, 2)] [(12, 1), (4, 1), (1, 1), (-5, 1)]
El conjunto de autovalores de una matriz se obtiene con el comando .eigenvalues() Para obtener los subespacios vectoriales V , utilizamos el comando .eigenspaces_right()
Sage sage: # Seguimos con las definiciones anteriores sage: C.eigenvalues() [12, 1, -5, 4, 4] sage: # El autovalor doble aparece dos veces sage: factor(C.charpoly()) (x - 12) * (x - 1) * (x + 5) * (x - 4)^2 sage: C.eigenspaces_right() [ (12, Vector space of degree 5 and dimension 1 over Rational Field User basis matrix: [1 2 1 2 2]), (1, Vector space of degree 5 and dimension 1 over Rational Field User basis matrix: [ 1 3/4 1/2 1 3/4]), (-5, Vector space of degree 5 and dimension 1 over Rational Field User basis matrix: [ 1 0 1 2/3 4/3]), (4, Vector space of degree 5 and dimension 2 over Rational Field User basis matrix: [ 1 0 -1 -1/2 5/2] [ 0 1 2 3/4 -9/4]) ] sage: # Comprobemos que el primero es efectivamente un autovector de valor 12 sage: C * vector([1,2,1,2,2]) (12, 24, 12, 24, 24)
44
CAP ITULO
EIGHT
Si el anillo no tiene mdulo primo, existen elementos invertibles (los primos con el mdulo) y o o tambin elementos que no tienen inverso. Para averiguarlo tenemos el mtodo e e .is_unit() 45
Una vez que sabemos que es invertible podremos calcular el inverso (que es unico). De la misma forma, no todo elemento del anillo cociente es un cuadrado .is_square() Si un elemento es un cuadrado se puede extraer su ra cuadrada con el mtodo .sqrt(). Puede z e ocurrir que la ra cuadrada no sea unica. Si queremos obtenerlas todas debemos aadir la z n opcin all = True o
Sage sage: R = IntegerModRing(88) sage: a = R(4) sage: a.is_unit() False sage: a.is_square() True sage: a.sqrt() # Una raz cuadrada 2 sage: a.sqrt(all = True) # Todas las raices cuadradas [2, 42, 46, 86] sage: R(2)^2, R(42)^2, R(46)^2, R(86)^2 (4, 4, 4, 4)
Por ello, si conocemos f (p) y f (q), siendo p y q nmeros primos, podemos conocer f (pq). Por u el teorema fundamental de la aritmtica, si se conoce f (pk ) para cualquier primo, podemos e conocer f (n) para cualquier n. Dado un nmero n, consideramos todos sus divisores positivos, incluyendo la unidad y l mismo. u e Posteriormente sumamos todos los divisores. El nmero as obtenido es costumbre denotarlo u (n). Hemos construido as la funcin : N N. Esta funcin es multiplicativa y es sencillo o o calcular su valor para las potencias de primos. sigma(n)
Sage sage: sigma(8) 15 sage: divisors(8) [1, 2, 4, 8] sage: 1 + 2 + 4 + 8 15 sage: # Calculemos sigma sobre un numero primo sage: sigma(7) 8 sage: # Calculemos sigma sobre potencias de primos
46
sage: sigma(7), sigma(7^2), sigma(7^3), sigma(7^4) (8, 57, 400, 2801) sage: # Para obtener estos numeros debemos sumar progresiones geometricas sage: sigma(7^4), 1 + 7 + 7^2 + 7^3 + 7^4 (2801, 2801) sage: # Comprobemos que es multiplicativa sage: n = 2^5 * 3^6 sage: m = 5^4 * 7^3 sage: n,m (23328, 214375) sage: gcd(n,m) 1 sage: sigma(n*m), sigma(n) * sigma(m) (21511551600, 21511551600) sage: # Los numeros perfectos son aquellos que sigma(n) = 2n sage: sigma(6), 2 * 6 (12, 12) sage: sigma(28), 2 * 28 (56, 56)
La funcin cuenta el nmero de divisores positivos, incluyendo la unidad y el mismo nmero. o u u Es tambin una funcin multiplicativa. e o number_of_divisors(n)
Sage sage: divisors(90) [1, 2, 3, 5, 6, 9, 10, 15, 18, 30, 45, 90] sage: number_of_divisors(90) 12 sage: # Sobre los numeros primos la funcion tau es sencilla sage: number_of_divisors(23) 2 sage: # Tambien es sencilla sobre potencias de primos sage: number_of_divisors(7^6), number_of_divisors(7^201) (7, 202) sage: # Veamos que es multiplicativa sage: n = 2^4 * 3^7 sage: m = 5^3 * 11^5 sage: n, m, gcd(n,m) (34992, 20131375, 1) sage: number_of_divisors(n * m) 960 sage: number_of_divisors(n) * number_of_divisors(m) 960
La funcin de Mbius es un poco ms complicada de denir. Tomamos un nmero natural n y o o a u lo descomponemos en factores primos. Si algn factor primo aparece con exponente 2 o superior, u entonces (n) = 0. Si todos los factores que aparecen en n son de grado 1 entonces los contamos. Si hay un nmero par de factores primos, entonces (n) = 1. Si hay un nmero impar de factores u u entonces (n) = 1. Es sencillo comprobar que si (n) = 0 entonces existe un cuadrado r2 que divide a n. El inverso tambin es correcto: Si algn cuadrado divide a n entonces (n) = 0. e u Tambin es una funcin multiplicativa y en cierto sentido es la ms importante de todas, debido e o a a la frmula de inversin de Mbius (ver cualquier libro de Teor de Nmeros). o o o a u
47
moebius() Dado un nmero natural n consideramos todos los nmeros menores que l. De estos algunos u u e son primos con n y otros no. Consideramos unicamente los que son primos con n y los contamos. Dicho nmero se denota (n). El primero en utilizar esta funcin de un modo consciente fue u o Euler, y hoy en dia se llama la funcin phi de Euler. Como hemos visto en la primera seccin de o o este cap tulo, el nmero (n) coincide con el conjunto de unidades del anillo Zn . u euler_phi()
Sage sage: moebius(2^2*3*5) # Un factor repetido 0 sage: moebius(3*5*7) # Un numero impar de factores, sin repeticion -1 sage: moebius(3*5*11*23) # Un numero par de factores sin repeticion 1 sage: euler_phi(7) # Sobre los numeros primos es sencilla 6 sage: euler_phi(23) 22 sage: # Ahora sobre potencias de primos sage: euler_phi(7^2) 42 sage: euler_phi(7^3) 294 sage: euler_phi(77655697987878788899999876) 38445632524277534820378240
48
APENDICE
Cuaterniones
El invento o descubrimiento de los cuaterniones se debe al matemtico irlands Hamilton. Una a e vez que fue asimilado por la comunidad matemtica que los nmeros complejos eran simplemente a u pares de nmeros reales con unas reglas especiales de multiplicacin, Hamilton intent realizar lo u o o mismo con ternas de nmeros. Fracas, naturalmente, puesto que hoy es conocido que no puede u o existir ningun cuerpo de grado 3 sobre los nmeros reales. Sin embargo, en un momento de u inspiracin, descubri las reglas para multiplicar cuaternas de nmeros. Estas reglas cumpl o o u an todas las propiedades, salvo la propiedad conmutativa de la multiplicacin. A d de hoy sabemos o a construir, a semejanza de lo hecho por Hamilton, extensiones de cuerpos (no necesariamente del cuerpo real) de grado 4 y que cumplen propiedades similares. Nosotros trabajaremos con el Algebra cuaternionica ms simple, que es aquella en la que los generadores i, j, k cumplen a 2 = 1, j 2 = 1 e ij = k, construida sobre el cuerpo Q. i La orden para crear el Algebra cuaternionica es A.<i,j,k> = QuaternionAlgebra(QQ, -1, -1) Una vez hecho esto, cualquier cuaternin se puede escribir como una combinacin lineal de o o la unidad y de las tres letras. Las operaciones, como siempre, se realizan con los operadores habituales. Debemos tener en cuenta que la multiplicacin no es conmutativa. o
Sage sage: A.<i,j,k> = QuaternionAlgebra(QQ, -1, -1) sage: a = 4 + 5*i + 8*j + 2*k sage: type(a) <class sage.algebras.quaternion_algebra_element.QuaternionAlgebraElement> sage: b = 8 + 2*i -9*j + 3*k sage: a * b 88 + 90*i + 17*j - 33*k sage: b * a 88 + 6*i + 39*j + 89*k sage: a + 7*b 60 + 19*i - 55*j + 23*k sage: b^4 -23164 - 1920*i + 8640*j - 2880*k sage: c = 1 / b # El inverso de b sage: b * c 1
La norma de un cuaternin es su mdulo en el espacio de cuatro dimensiones. Coincide con la o o multiplicacin de un cuaternin por su conjugado (como en el caso complejo) o o .reduced_norm() La parte real (tambin llamada escalar) del cuaternin anterior es a y la parte vectorial bi + cj + e o dk. Un cuaternin se dice que es imaginario puro (o simplemente que es un cuaternin puro), o o si su parte real es nula, por analog con el caso complejo. a .scalar_part(), .pure_part()
Sage sage: sage: 109 sage: 109 sage: 109 sage: 4 sage: 5*i + a = 4 + 5*i + 8*j + 2*k a.reduced_norm() a * a.conjugate() a.conjugate() * a a.scalar_part() a.pure_part() 8*j + 2*k # Un cuaternion y su conjugado conmutan
50
Apndice A. Cuaterniones e
APENDICE
51
sage: h = G.random_element(); h a^10*b^449*c^22 sage: g = G.random_element(); g a^62*b^391*c^20 sage: h * g, g * h # Deben conmutar (a^5*b^840*c^19, a^5*b^840*c^19) sage: i = g^(-1); i a^5*b^589*c^3 sage: i * g 1
Para crear un subgrupo H de un grupo G basta con dar una lista de generadores del subgrupo. Esto es, si damos una lista de elementos del grupo, el subgrupo generado es el m nimo subgrupo que contiene a todos los elementos. En Sage se utiliza el mtodo e .subgroup(lista) donde lista es una lista (y por lo tanto debe ir entre corchetes, aunque tenga un solo elemento) de generadores del subgrupo. Dado un elemento g del grupo G, dicho elemento genera un subgrupo. Como estamos suponiendo que G es nito, el subgrupo generado por g tambin debe serlo. Al nmero de elementos de este e u subgrupo (tambin llamado orden del subgrupo) se le denomina orden del elemento g. Coincide e con el menor entero positivo que cumple la igualdad g n = 1, que es la denicin clsica de este o a concepto. El mtodo para saber el orden de un elemento es e .order() pero en este caso debe actuar sobre un elemento del grupo.
Sage sage: G.<a,b,c,d> = AbelianGroup([45,78,23,678]); G Multiplicative Abelian Group isomorphic to C45 x C78 x C23 x C678 sage: g = G.random_element() sage: h = G.random_element() sage: g, h (a^4*b^76*c^21*d^548, a^22*b^75*c^17*d^129) sage: H = G.subgroup([a,b]); H Multiplicative Abelian Group isomorphic to C2 x C3 x C5 x C9 x C13, which is the subgroup of Multiplicative Abelian Group isomorphic to C45 x C78 x C23 x C678 generated by [a, b] sage: Hg = G.subgroup([g]) sage: Hg.order(), g.order() (1520415, 1520415)
52