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]