x.digits(base=b)
es la lista de los dígitos de x
en la base b
. Por ejemplo,sage: 19.digits(base=10)
[9, 1]
sage: 19.digits(base=2)
[1, 1, 0, 0, 1]
sage: 19.digits()
[9, 1]
digitos_a_numero
tal que digitos_a_numero(xs,b)
es el número cuyos dígitos en base b
es xs
. Por ejemplo,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)))])
divisible_por_9
tal que divisible_por_9(n)
se verifica si n
es divisible por 9 usando el criterio que dice: "un número es divisible por 9 si y sólo si la suma de sus dígitos es divisible por 9". Si la suma de los dígitos es mayor que 9, puedes llamar a la función recursivamente para decidir si verifica el criterio. No debería usar el resto de la división (%
) en ningún momento. Por ejemplo,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()))
inverso
tal que inverso(n)
es el número obtenido invirtiendo los dígitos de n
. Por ejemplo,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)
palindromo
tal que palindromo(n)
se verifica si n
es un palíndromo. Por ejemplo,sage: palindromo(32523)
True
sage: palindromo(32524)
False
def palindromo(n):
return n == inverso(n)
palindromo_base
tal que palindromo_base(n,b)
se verifica si n
escrito en base b
es palíndromo. Por ejemplo,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))
palindromos
tal que palindromos(n)
es la lista de los números menores que n que son palíndromos tanto en la base 2 como en la 10. Por ejemplo,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)]
is_prime(k)
se verifica si k es primo.
next_prime(k)
es el menor número primo mayor que k.
prime_range(k)
es la lista de primos menores que k.
factor(k)
es la factorización de k.
list(factor(k))
es la lista de tuplas con cada factor y su exponente correspondiente de la factorización de k.
dirichlet
tal que dirichlet(a,b,n)
es el menor número primo de la forma 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
aproxima_primos
tal que aproxima_primos(x)
es sage: aproxima_primos(1e6)
1.08448994777908
def aproxima_primos(x):
return n(len(prime_range(x))/(x/log(x)))
Ejercicio. Representar aproxima_primos(x)
para x entre 1.000 y 1.000.000.
Solución.
sage: plot(aproxima_primos,(x,1e3,1e6))
La gráfica es
compuesto_maximal
tal que compuesto_maximal(n)
es el par formado por los extremos de la secuencia más larga de números consecutivos menores que n quee no contiene ningún primo. Por ejemplo,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)
indicatriz
tal que indicatriz(n)
es el número de enteros positivos menores o iguales a n y coprimos con n. Por ejemplo,sage: indicatriz(12)
4
def indicatriz(n):
return len([x for x in srange(n) if gcd(x,n) == 1])
Ejercicio. La función de Euler se puede calcular utilizando la factorización del número. Si
, entonces
.
Redefinir la función indicatriz
usando la fórmula anterior.
Solución.
def indicatriz2(n):
xs = list(n.factor())
return prod([p^e-p^(e-1) for (p,e) in xs])
Ejercicio. Comprobar la equivalencia de las dos definiciones para los números menores que 1000.
Solución. La comprobación es
sage: all([indicatriz(n) == indicatriz2(n) for n in srange(1,1000)])
True
Ejercicio. Comparar los tiempos de cálculo de la indicatriz de 1000000 con las dos definiciones.
Solución. La comparación es
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
Ejercicio. Redefinir la función indicatriz
mediante preconstruidas.
Solución.
indicatriz3 = euler_phi
El algoritmo de Euclides calcula el máximo común divisor (mcd) de dos números naturales n y m. El algoritmo se basa en el siguiente principio: el mcd de dos números n y m, con n < m, es también el mcd de n y m%n (el resto de dividir m por n). De esta forma, hemos reducido el problema a otro con números menores. Eventualmente, uno de los dos números será 0, y entonces sabemos que mcd(0,m)=m.
Ejercicio. Definir la función mcd
tal que mcd(n,m)
es el máximo común divisor de n y m calculado mediante el algoritmo de Euclides. Por ejemplo,
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)
mcd_lista
tal que mcd_lista(xs)
es el máximo común divisor de la lista xs. Por ejemplo,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:]))
mcd_fact
tal que mcd_fact(n,m)
es el máximo común divisor de n y m calculado a partir de la factorización de cada uno de ellos y después escogiendo los factores comunes con el menor exponente. Por ejemplo,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])
Una identidad de Bézout muestra explícitamente el mcd de
y
como una combinación lineal de
y
con coeficientes enteros:
.
xgcd(m,n)
es la terna formada por el m.c.d. de m y n y los coeficientes de una identidad de Bézout. Por ejemplo,
sage: xgcd(15,25)
(5, 2, -1)
sage: gcd(15,25)
5
sage: 15*2+25*(-1)
5
bezout
tal que bezout(xs)
es la tupla formada por el m.c.d. de m y n y los coeficientes de una identidad de Bézout; es decir, si xs es bezout(xs)
es 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)
Si los números y
son primos entre sí, entonces para cualesquiera
,
existe un único número
menor que
tal que el resto de dividir
entre
es
y el resto de dividir
entre
es
. En término de congruencias, c es la solución del sistema
Ejercicio. Definir la función chino
tal que chino(a,m,b,n)
es la solución de
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
chinoG
tal que chinoG(xs,ms)
es la solución del sistema xs
es ms
es 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
ZZ
es el anillo de los enteros. Por ejemplo,sage: R = ZZ
sage: a = R(3)
sage: a.parent()
Ring of integers modulo 5
sage: a+a
6
QQ
, RR
y CC
son los anilllos de los racionales, reales y complejos.Integers(n)
es el anillo sage: R = Integers(5)
sage: a = R(3)
sage: a.parent()
Ring of integers modulo 5
sage: a+a
1
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)
potenciaM
tal que potenciaM(x,n,m)
es x elevado a n módulo m. Por ejemplo,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
potencia
tal que potencia(x,n)
es x elevado a n (en cualquier anillo). Por ejemplo,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
Ejercicio. Comparar el tiempo para calcular módulo 5.
Solución.
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
inverso
tal que inverso(x,n)
es el inverso de x módulo n. Por ejemplo,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)
R.<x> = PolynomialRing(A)
ó R.<x> = A['x']
define el anillo de los polinomios con coeficientes en el anillo A
y variable x
. Por ejemplo,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
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
p(x=e)
es el valor del polinomio p, con variable x, al sustituir su variable por el valor de la expresión e. Por ejemplo,sage: A = ZZ[x]
sage: p = 2*x^3+x-1
sage: p(x=5)
254
p.plot(a,b)
dibuja el polinomio p entre a y b. Por ejemplo,sage: A = ZZ[x]
sage: p = 3*x^2+x-1
sage: p.plot(-4,4)
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]
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)]
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
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]
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
def polinomio(xs):
A.<x> = PolynomialRing(ZZ)
if len(xs) == 1:
return xs[0]
else:
return xs[0]+x*polinomio(xs[1:])
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ónsage: 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
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.
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
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 <= L2
(ó L2 >= 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]
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]
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]
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]
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]
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]
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)
]
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]
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]
)
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]