1 Álgebra

1.1 Aritmética

1.1.1 Dígitos de un número

1.1.1.1 Dígitos de un número en una base arbitraria

sage: 19.digits(base=10)
[9, 1]
sage: 19.digits(base=2)
[1, 1, 0, 0, 1]
sage: 19.digits()
[9, 1]
sage: digitos_a_numeros([9,1],10)
19
sage: digitos_a_numeros([1,1,0,0,1],2)
19
def digitos_a_numeros(xs,b):
    return sum([x*b^n for (x,n) in zip(xs,srange(len(xs)))]) 

1.1.1.2 Criterio de divisibilidad por nueve.

sage: [x for x in srange(50) if divisible_por_9(x)]
[9, 18, 27, 36, 45]
def divisible_por_9(n):
    if n < 9:
        return False
    elif n == 9:
        return True
    else:
        return divisible_por_9(sum(n.digits()))

1.1.1.3 Números inversos y palíndromos

sage: inverso(325679)
976523
# 1ª definición:
def inverso(n):
    xs = n.digits() 
    xs.reverse()
    return digitos_a_numeros(xs,10)

# 2ª definición:
def inverso2(n):
    return digitos_a_numeros(list(reversed(n.digits())),10)
sage: palindromo(32523)
True
sage: palindromo(32524)
False
def palindromo(n):
    return n == inverso(n)
sage: palindromo_base(353,10)
True
sage: palindromo_base(353,2)
False
sage: palindromo_base(17,2)
True
sage: palindromo_base(17,10)
False
def palindromo_base(n,b):
    xs = n.digits(base=b)
    return xs == list(reversed(xs))
sage: palindromos(1000)
[0, 1, 3, 5, 7, 9, 33, 99, 313, 585, 717]
def palindromos(n):
    return [x for x in srange(n) if palindromo_base(x,2) & palindromo_base(x,10)]

1.1.2 Números primos

1.1.2.1 Funciones sobre primos

1.1.2.2 Infinitos primos en cualquier progresión aritmérica

sage: dirichlet(2,3,200)
617
# 1ª definición
def dirichlet(a,b,n):
    j = n+1
    while not (is_prime(a+b*j)):
        j = j+1
    return a+b*j

# 2ª definición
def dirichlet2(a,b,n):
    p = next_prime(a+b*n)
    while (p-a) % b != 0:
        p = next_prime(p)
    return p

# Comparación:
#    sage: timeit('dirichlet(2,29,2000000000000)')
#    625 loops, best of 3: 1.24 ms per loop
#    sage: timeit('dirichlet2(2,29,2000000000000)')
#    25 loops, best of 3: 10.8 ms per loop

1.1.2.3 Teorema de los números primos

sage: aproxima_primos(1e6)
1.08448994777908
def aproxima_primos(x):
    return n(len(prime_range(x))/(x/log(x)))
sage: plot(aproxima_primos,(x,1e3,1e6))

La gráfica es

1.1.2.4 Sucesión maximal de números compuestos consecutivos.

sage: compuesto_maximal(100)
(90, 96)
sage: compuesto_maximal(1e6)
(492114, 492226)
def compuesto_maximal(n):
    ps = prime_range(n)
    (_,a,b) = max([(y-x,x,y) for (x,y) in zip(ps,ps[1:])])
    return (a+1,b-1)

1.1.2.5 La función indicatriz de Euler.

sage: indicatriz(12)
4
def indicatriz(n):
    return len([x for x in srange(n) if gcd(x,n) == 1])
def indicatriz2(n):
    xs = list(n.factor())
    return prod([p^e-p^(e-1) for (p,e) in xs])
sage: all([indicatriz(n) == indicatriz2(n) for n in srange(1,1000)])
True
sage: time indicatriz(1000000)
400000
Time: CPU 8.67 s, Wall: 8.68 s
sage: time indicatriz2(1000000)
400000
Time: CPU 0.00 s, Wall: 0.00 s
indicatriz3 = euler_phi

1.1.3 Algoritmo de Euclides

sage: mcd(30,70)
10
sage: mcd(70,30)
10
sage: mcd(30,30)
30
def mcd(n,m):
    if n == 0:
        return m
    elif m < n:
        return mcd(m,n)
    else:
        return mcd(m%n,n)
sage: mcd_lista([20,30,45,50])
5
def mcd_lista(xs):
    n = len(xs)
    if n == 1:
        return xs[0]
    elif n == 2:
        return mcd(xs[0],xs[1])
    else:
        return mcd(xs[0],mcd_lista(xs[1:]))
sage: mcd_fact(30,70)
10
sage: mcd_fact(70,30)
10
sage: mcd_fact(30,30)
30
def mcd_fact(n,m):
    xs = dict(n.factor())
    ys = dict(m.factor())
    return prod([p^min(xs[p],ys[p]) for p in xs if p in ys])

1.1.4 Identidad de Bezout

sage: xgcd(15,25)
(5, 2, -1)
sage: gcd(15,25)
5
sage: 15*2+25*(-1)
5
sage: bezout([15,25,30,45])
(5, 0, -1, -2, 2)
sage: 15*0+25*(-1)+30*(-2)+45*2
5
def bezout(xs):
    n = len(xs)
    if n == 2:
        return xgcd(xs[0],xs[1])
    else:
        (d1,v,w) = xgcd(xs[-2],xs[-1])
        ys = xs[:-2] + [d1]
        t = bezout(ys)
        return t[:-1] + (t[-1]*v,t[-1]*w) 

1.1.5 Teorema chino del resto

sage: chino(5495,7569,7643,8765)
16231584
# Veamos cómo se puede resolver el sistema
#    x ≡ a (mod m)   (1)
#    x ≡ b (mod n)   (2)
# De (1),
#    x = a + mk (3)
# Sustituyendo en (2)
#    a + mk ≡ b (mod n)   
#    mk ≡ (b-a) (mod n)   (4)   
# El inverso de m módulo n lo calculamos (de existir) con el
# algoritmo extendido de Euclides. 
#    1 = u*m + v*n
#    u*m ≡ 1 (mod n)
# Multiplicando (4) por u (mod n),
#    k ≡ (b-a)*u (mod n)     
#      ≡ mod((b-a)*u,n) (mod n)     
#    k = mod((b-a)*u,n) + nt
# Sustituyendo en (3)
#    x = a + m*(mod((b-a)*u,n) + n*t)
#      = (a + m*mod((b-a)*u,n)) + m*n*t

def chino(a,b,m,n):
    (_,u,_) = xgcd(m,n)
    return a + m*((b-a)*u % n)

# 2ª definición (con preconstruida)
chino2 = crt
sage: chinoG([2,1,6], [3,5,7])
41
def chinoG(xs,ms):
    n = len(xs)
    if n == 2:
        return chino(xs[0],xs[1],ms[0],ms[1])
    else:
        c = chino(xs[-2],xs[-1],ms[-2],ms[-1])
        return chinoG(xs[:-2]+[c],ms[:-2]+[ms[-2]*ms[-1]])

# 2ª definición (con preconstruida)
chinoG2 = crt

1.2 Grupos y anillos

sage: R = ZZ
sage: a = R(3)
sage: a.parent()
Ring of integers modulo 5
sage: a+a
6

1.2.1 Anillo \mathbb{Z}_n

sage: R = Integers(5)
sage: a = R(3)
sage: a.parent()
Ring of integers modulo 5
sage: a+a
1

1.2.1.1 Suma y producto módulo m

sage: (a,b,m) = (12,23,31)
sage: ((a+b)%m,(a*b)%m)
(4, 28)
sage: R = Integers(31)
sage: (a,b) = (R(12),R(23))
sage: (a+b,a*b)
(4, 28)

1.2.1.2 Potencia módulo m

sage: potencia1(2,4,5)
1
# 1ª definición
def potenciaM1(x,n,m):
    return (x^n)%m

# 2ª definición
def potenciaM2(x,n,m):
    if n == 0:
        return 1
    elif n%2 == 0:
        y = potenciaM1(x,n/2,m)
        return (y*y)%m
    else:
        y = potenciaM1(x,(n-1)/2,m)
        return (x*y*y)%m

# 3ª definición (con preconstruida)
potenciaM3 = power_mod
sage: R = Integers(5)
sage: potencia(R(2),4)
1
sage: potencia(Integers(5)(2),4)
1
def potencia(x, n):
    if n == 0:
        return 1
    elif n%2 == 0:
        y = potencia(x, n/2)
        return y*y
    else:
        y = potencia(x, (n-1)/2)
        return x*y*y
sage: time potenciaM1(3254,10000000,5)
1
Time: CPU 4.65 s, Wall: 4.66 s
sage: time potenciaM2(3254,10000000,5)
1
Time: CPU 2.25 s, Wall: 2.25 s
sage: time potenciaM3(3254,10000000,5)
1
Time: CPU 0.00 s, Wall: 0.02 s
sage: time potencia(Integers(5)(3254),10000000)
1
Time: CPU 0.00 s, Wall: 0.00 s

1.2.1.3 Inverso módulo

sage: inverso(3,7)
5
sage: inverso(7,3)
1
# 1ª definición (con xgcd):
def inverso(x,n):
    (d,u,v) = xgcd(x,n)
    return u%n

# 2ª definición (con preconstruida):
inverso2 = inverse_mod 

# 3ª definición (con Z_n):
def inverso3(x,n):
    R = Integers(n)
    y = R(x)
    return 1/y

# 4ª definición (simplificación de la 3ª):
def inverso4(x,n):
    return 1/Integers(n)(x)

1.2.2 Anillos de polinomios

sage: PR1.<t> = PolynomialRing(ZZ)
sage: p=t^2-1
sage: p.base_ring()
Integer Ring
sage: PR2.<x> = PolynomialRing(QQ)
sage: q=x^2-1
sage: q.base_ring()
Rational Field

1.2.2.1 Operaciones con polinomios

sage: AP.<x> = PolynomialRing(QQ)
sage: p = 2*x^3+x-1
sage: q = x^3+4*x^2+3
sage: p+q
3*x^3 + 4*x^2 + x + 2
sage: p*q
2*x^6 + 8*x^5 + x^4 + 9*x^3 - 4*x^2 + 3*x - 3
sage: p-q
x^3 - 4*x^2 + x - 4
sage: p^2
4*x^6 + 4*x^4 - 4*x^3 + x^2 - 2*x + 1

1.2.2.2 Valor de un polinomio en un punto

sage: A = ZZ[x]
sage: p = 2*x^3+x-1
sage: p(x=5)
254

1.2.2.3 Gráficas de polinomios

sage: A = ZZ[x]
sage: p = 3*x^2+x-1
sage: p.plot(-4,4)

1.2.3 Raíces de polinomios

  • p.roots() es una lista de tuplas que contienen las raíces del polinomio p con sus multiplicidades. Por ejemplo,
sage: A1.<x> = PolynomialRing(ZZ)
sage: p = x^3 - 11*x^2 + 39*x - 45
sage: p.roots()
[(5, 1), (3, 2)]
sage: q = x^2-3
sage: q.roots()
[]
  • p.real_roots() es una lista de las raíces reales del polinomio p. Por ejemplo,
sage: A1.<x> = PolynomialRing(ZZ)
sage: q = x^2-3
sage: q.real_roots()
[-1.73205080756888, 1.73205080756888]
  • p.complex_roots() es una lista de las raíces complejas del polinomio p. Por ejemplo,
sage: A1.<x> = PolynomialRing(ZZ)
sage: q = x^2+9
sage: q.real_roots()
[]
sage: q.complex_roots()
[-3.00000000000000*I, 3.00000000000000*I]
  • p.base_extend(A) es el polinomio p con los coeficientes en A.
sage: p = 2*t-1
sage: p.parent()
Univariate Polynomial Ring in t over Integer Ring
sage: p.roots()
[]
sage: q = p.base_extend(QQ)
sage: q.parent()
Univariate Polynomial Ring in t over Rational Field
sage: q.roots()
[(1/2, 1)]
sage: p.real_roots()
[0.500000000000000]
  • Ejemplo de raices en anillo modular:
sage: A1 = Integers(7)
sage: A2.<u> = PolynomialRing(A1)
sage: r = u^2+3
sage: r.roots()
[(5, 1), (2, 1)]
sage: [(j, r(u=j)) for j in srange(7)]
[(0, 3), (1, 4), (2, 0), (3, 5), (4, 5), (5, 0), (6, 4)]

1.2.4 Factorización de polinomios

  • factor(q) ó q.factor() es la factorización del polinomio q.
sage: A.<t> = PolynomialRing(ZZ)
sage: q = t^3 - 3*t^2 + 4
sage: q.factor()
(t + 1) * (t - 2)^2
  • list(q.factor()) es la lista de tuplas (factor, multiplicidad) de la factorización del polinomio q.
sage: list(q.factor())
[(t + 1, 1), (t - 2, 2)]
  • q.is_irreducible() se verifica si q es irreducible.
sage: q.is_irreducible()
False
sage: (q+1).is_irreducible()
True

1.2.5 Lista de coeficientes

  • list(p) es la lista de los coeficientes del polinomio p, ordenados de menor a mayor grado. Por ejemplo,
sage: A.<z> = PolynomialRing(QQ)
sage: p = 2*z^2-3*z^5+1
sage: p
-3*z^5 + 2*z^2 + 1
sage: list(p)
[1, 0, 2, 0, 0, -3]

1.2.6 Ejercicios

1.2.6.1 Definición de polinomios mediante su lista de coeficientes

  • Ejercicio. Definir la función polinomio tal que polinomio(xs) es el polinomio cuya lista de coeficientes es xs. Por ejemplo,
sage: polinomio([1,3,5])
5*x^2 + 3*x + 1
  • Solución.
def polinomio(xs):
    A.<x> = PolynomialRing(ZZ)
    if len(xs) == 1:
        return xs[0]
    else:
        return xs[0]+x*polinomio(xs[1:])

1.3 Álgebra lineal

1.3.1 Espacios vectoriales

  • Cuerpos en Sage:
    • QQ (o RationalField()) es el cuerpo de los números racionales.
    • QQbar (o AlgebraicField ()) es la clausura algebraica del cuerpo de los números racionales.
    • RDF (o RealDoubleField()) es el cuerpo de los números reales de 64 bits.
    • CDF (o ComplexDoubleField()) es el cuerpo de los números complejos de 64 bits.
    • SR, o expresiones simbólicas. Cualquier expresión algebraica que contenga símbolos como pi, I, sqrt(2) pertenece a este anillo.
  • VectorSpace(K,n) es el espacio vectorial sobre el cuerpo K de dimensión
  1. Por ejemplo,
sage: V1 = VectorSpace(QQ,3)
sage: print V1
Vector space of dimension 3 over Rational Field
sage: V2 = VectorSpace(RDF,3)
sage: print V2
Vector space of dimension 3 over Real Double Field
sage: V3 = VectorSpace(CDF,4)
sage: print V3
Vector space of dimension 4 over Complex Double Field

1.3.1.1 Vectores

  • V(xs) es el vector del espacio vectorial V cuyas coordenadas son xs. Por ejemplo,
sage: v1 = V1([1,1,1])
sage: print v1 ,v1.parent()
(1, 1, 1) Vector space of dimension 3 over Rational Field
sage: v2 = V2([1,1,0])
sage: print v2 ,v2.parent()
(1.0, 1.0, 0.0) Vector space of dimension 3 over Real Double Field
  • Los vectores pertenecen a un espacio vectorial concreto, aunque SAGE hará las conversiones necesarias entre tipos de datos si queremos hacer operaciones entre espacios vectoriales compatibles. Por ejemplo,
Los vectores pertenecen a un espacio vectorial concreto, aunque SAGE
hará las conversiones necesarias entre tipos de datos si queremos hacer
operaciones entre espacios vectoriales compatibles.
sage: v3 = 2*v1+v2
sage: print v3 ,v3.parent()
(3.0, 3.0, 2.0) Vector space of dimension 3 over Real Double Field
  • vector(xs) es un vector con espacio ambiente el anillo de coeficientes más pequeño que contenga xs. Por ejemplo,
sage: v1 = vector([1,1,1])
sage: print v1 ,v1.parent()
(1, 1, 1) Ambient free module of rank 3 over the principal ideal domain Integer Ring
sage: v2 = vector([1/2,1,1])
sage: print v2 ,v2.parent()
(1/2, 1, 1) Vector space of dimension 3 over Rational Field
sage: v3 = vector([1.0,2.0])
sage: print v3 ,v3.parent()
(1.00000000000000, 2.00000000000000) Vector space of dimension 2 over Real Field with 53 bits of precision

1.3.1.2 Subespacios vectoriales

  • V.subspace(xs) es el subespacio de V generado por xs. Por ejemplo,
sage: V1 = VectorSpace(QQ,3)
sage: V2 = VectorSpace(RDF,3)
sage: v1 = vector([1,1,1])
sage: v2 = vector([1,1,0])
sage: L1 = V1.subspace([v1,v2])
sage: print L1
Vector space of degree 3 and dimension 2 over Rational Field
Basis matrix:
[1 1 0]
[0 0 1]
sage: L1_bis = V2.subspace([v1,v2])
sage: print L1_bis
Vector space of degree 3 and dimension 2 over Real Double Field
Basis matrix:
[1.0 1.0 0.0]
[0.0 0.0 1.0]
  • L.ambient_vector_space() es el espacio ambiente del subespacio L. Por ejemplo,
sage: L1.ambient_vector_space()
Vector space of dimension 3 over Rational Field
sage: L1_bis.ambient_vector_space()
Vector space of dimension 3 over Real Double Field
  • dim(L) es la dimensión del subespacio L. Por ejemplo,
sage: dim(L1)
2
  • L.degree() es la dimensión del espacio ambiente del subespacio L. Por ejemplo,
sage: L1.degree()
3
  • v in L se verifica si v pertenece al subespacio L. Por ejemplo,
sage: v1+v2 in L1
True
sage: vector([4,7,3]) in L1
False
  • L1 == L2 se verifica si los subespacios L1 y L2 son iguales. Por ejemplo,
sage: L1 == V1
False
sage: L1 == V1.subspace([v1,v1+v2])
True
  • L1 <= L2L2 >= L1) se verifica si L1 es subespacio de L2. Por ejemplo,
sage: L1 <= V1
True
sage: L1 >= V1
False
sage: L1 >= V1.subspace([v1])
True
  • L1.intersection(L2) es la intersección de los subespacios L1 y L2. Por ejemplo.
sage: v1 = vector([1,1,0])
sage: v2 = vector([0,0,1])
sage: v3 = vector([1,0,1])
sage: v4 = vector([0,1,0])
sage: L1 = V1.subspace([v1,v2])
sage: L2 = V1.subspace([v3,v4])
sage: L3 = L1.intersection(L2)
sage: print L3
Vector space of degree 3 and dimension 1 over Rational Field
Basis matrix:
[1 1 1]
  • L1 + L2 es la suma de los subespacios L1 y L2. Por ejemplo,
sage: L4 = L1 + L2
sage: print L4
Vector space of degree 3 and dimension 3 over Rational Field
Basis matrix:
[1 0 0]
[0 1 0]
[0 0 1]

1.3.1.3 Bases de los espacios vectoriales

  • L.basis() es una base del subespacio L. Por ejemplo,
sage: v1 = vector([1,1,0])
sage: v2 = vector([1,0,1])
sage: L1 = V1.subspace([v1,v2])
sage: L1.basis()
[
(1, 0, 1),
(0, 1, -1)
]
  • L.basis_matrix() es la matriz formada por una base del subespacio L. Por ejemplo,
sage: L1.basis_matrix()
[ 1  0  1]
[ 0  1 -1]
  • subspace_with_basis(vs) es el subespacio cuya vase es vs. Por ejemplo,
sage: L3 = V1.subspace_with_basis([v1,v2])
sage: L3
Vector space of degree 3 and dimension 2 over Rational Field
User basis matrix:
[1 1 0]
[1 0 1]
sage: L1 == L3
True
sage: L3.basis_matrix()
[1 1 0]
[1 0 1]
  • L.coordinates(v) son las coordenadas de v en la base de L. Por ejemplo,
sage: L1.coordinates(2*v1+3*v2)
[5, 2]
sage: L3.coordinates(2*v1+3*v2)
[2, 3]

1.3.2 Matrices

  • matrix(A,vs) es la matriz, de coeficientes en el anillo A, cuyas filas son los vectores de vs. Por ejemplo,
sage: M = matrix(QQ,[[0,1,0,0],[1,0,0,0]])
sage: M
[0 1 0 0]
[1 0 0 0]
  • matrix(A,m,n,xs) es la matriz, con coeficientes en el anillo A, con m filas y n columnas cuyos elementos son xs. Por ejemplo,
sage: matrix(QQ,2,4,[1,2,3,4,5,6,7,8])
[1 2 3 4]
[5 6 7 8]
  • identity_matrix(A,n) es la matriz identidad con coeficientes en el anillo A de dimensión n. Por ejemplo,
sage: identity_matrix(QQ,3)
[1 0 0]
[0 1 0]
[0 0 1]

1.3.2.1 Métodos de las matrices

  • Los métodos de las matrices se pueden consultar en el manual.

  • M.left_kernel() es el núcleo de la matriz M por la izquierda, como subespacio vectorial. Por ejemplo,

sage: M1 = matrix(QQ,[[1,2,3,4],[4,2,3,1]])
sage: M1.left_kernel()
Vector space of degree 2 and dimension 0 over Rational Field
Basis matrix:
[]
  • M.right_kernel() es el núcleo de la matriz M por la derecha, como subespacio vectorial. Por ejemplo,
sage: M1.right_kernel()
Vector space of degree 4 and dimension 2 over Rational Field
Basis matrix:
[   1    0 -5/3    1]
[   0    1 -2/3    0]
  • M.kernel() es lo mismo que M.left_kernel(). Por ejemplo,
sage: M1.kernel()
Vector space of degree 2 and dimension 0 over Rational Field
Basis matrix:
[]
  • M.image() es la imagen de la matriz M, como subespacio vectorial. Por ejemplo,
sage: M1.image()
Vector space of degree 4 and dimension 2 over Rational Field
Basis matrix:
[  1   0   0  -1]
[  0   1 3/2 5/2]
  • M.echelon_form() es una forma escalonada de la matriz M. Por ejemplo,
sage: M1.echelon_form()
[  1   0   0  -1]
[  0   1 3/2 5/2]

1.3.2.2 Suma y productos de matrices

  • Las operaciones aritméticas sobre vectores y matrices se hacen con la notación habitual. Por ejemplo,
sage: M1 = matrix(ZZ,3,3,srange(9))
sage: M1
[0 1 2]
[3 4 5]
[6 7 8]
sage: M2 = identity_matrix(ZZ,3)
sage: M1+3*M2
[ 3  1  2]
[ 3  7  5]
[ 6  7 11]
sage: v = vector([1,2,3])
sage: M1*v
(8, 26, 44)
sage: M1*M2
[0 1 2]
[3 4 5]
[6 7 8]

1.3.3 Obtener el subespacio dado por ecuaciones

  • Ejemplo: Calcular el espacio dado por
    \left.  \begin{array}{lll}      x_1 + 2 x_2 & = & 0 \\     -x_1 + x_3   & = & 0  \end{array}  \right\}
sage: M = matrix(QQ,2,3,[1,2,0, -1,0,1])
sage: M.right_kernel()
Vector space of degree 3 and dimension 1 over Rational Field
Basis matrix:
[   1 -1/2    1]

1.3.3.1 Obtener las ecuaciones de un subespacio

  • Ejemplo: Calcular las ecuaciones del subespacio de \mathbb{C}^{4} engendrado por [1,1,1,1] y [1,1,0,0].
sage: v1 = vector([1,1,1,1])
sage: v2 = vector([1,1,0,0])
sage: L1 = V3.subspace([v1,v2])
sage: M = L1.basis_matrix()
sage: K = M.right_kernel()
sage: print K.basis()
[
(1.0, -1.0, 0.0, 0.0),
(-0.0, 0.0, 1.0, -1.0)
]
  • Ejemplo: Calcular una base del subespacio de \mathbb{C}^{4} dado por x_1+2x_2-x_4 y una base de su intersección con el subespacio engendrado por [1,1,1,1] y [1,1,0,0].
sage: # Subespacio dado por x1 + 2*x2 -x4 en V(CDF,4)
sage: M = matrix(CDF,4,1,[1,2,0,-1])
sage: print M
[ 1.0]
[ 2.0]
[ 0.0]
[-1.0]
sage: L2 = M.left_kernel()
sage: print L2
Vector space of degree 4 and dimension 3 over Complex Double Field
Basis matrix:
[ 1.0  0.0  0.0  1.0]
[ 0.0  1.0  0.0  2.0]
[-0.0  0.0  1.0  0.0]

sage: # Subespacio engendrado por [1,1,1,1] y [1,1,0,0]
sage: L3 = V3.subspace([[1,1,1,1],[1,1,0,0]])
sage: L3.intersection(L2)
Vector space of degree 4 and dimension 1 over Complex Double Field
Basis matrix:
[1.0 1.0 3.0 3.0]

1.3.4 Autovalores, autoespacios, forma de Jordan

  • M.eigenvalues() son los autovalores de la matriz M. Por ejemplo,
sage: M = matrix(QQ,3,3,[0,1,0,1,0,0,0,0,1])
sage: M.eigenvalues()
[-1, 1, 1]
  • M.eigenvectors_left() son los autovectores de la matriz M. Por ejemplo,
sage: M.eigenvectors_left()
[(-1, [
(1, -1, 0)
], 1), (1, [
(1, 1, 0),
(0, 0, 1)
], 2)]
  • M.jordan_form() es la forma de Jordan de la matriz M. Por ejemplo,
sage: M.jordan_form()
[-1| 0| 0]
[--+--+--]
[ 0| 1| 0]
[--+--+--]
[ 0| 0| 1]
  • M.jordan_form(transformation=True) es la forma de Jordan de M y la matriz de paso. Por ejemplo,
sage: M = matrix(QQ,3,3,[ 8,  6,  3, -1,  8, -3, 4, 10, 19])
sage: M.jordan_form(transformation=True)
(
[ 7| 0  0]                  
[--+-----]  [   1    0    1]
[ 0|14  1]  [   0   -7    0]
[ 0| 0 14], [-1/3   14    2]
)
  • Ejemplo con extensión de cuerpo:
sage: M = matrix(QQ,3,3,[0,1,0,-1,0,0,0,0,1])
sage: M.eigenvalues()
[1, -1*I, 1*I]
sage: M.jordan_form()
RuntimeError: Some eigenvalue does not exist in Rational Field.
sage: M2 = M.base_extend(QQbar)
sage: M2.jordan_form()
[   1|   0|   0]
[----+----+----]
[   0|-1*I|   0]
[----+----+----]
[   0|   0| 1*I]

1.4 Formas bilineales

1.4.1 Matrices definidas positivas

1.4.2 Trabajar con un producto escalar distinto del habitual

1.4.3 Bases ortonormales

1.4.4 Método de Gram-Schmidt