Documentos de Académico
Documentos de Profesional
Documentos de Cultura
1. Listas y conjuntos
Las listas en Sage pueden almacenar elementos de distintos tipos. Son objetos mutables (pueden modificarse añadiendo o
quitando elementos y modificando los ya existentes) y puede accederse a sus elementos directamente por posición.
Un tipo particular de lista son los rangos. El comando range(ini, fin, s) crea una lista de números que empieza en ini y va con un
incremento de s unidades hasta el mayor número posible antes de fin (éste no lo incluye). Por ejemplo, los números del 0 al 100,
sin incluir este último, en incrementos de 5.
range(0,104,5)
[0,
5,
10,
15,
20,
25,
30,
35,
40,
45,
50,
55,
60,
65,
70,
75,
80,
85,
90,
95,
100]
range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Las listas se pueden crear por comprensión (dando las propiedades que definen a sus elementos), al igual que los conjuntos. Por
ejemplo, números primos p entre 1 y 10000 tales que p+2 es primo:
is_prime(46789543)
True
is_prime(1)
False
lista = [n for n in range(1,1000) if (is_prime(n) and is_prime(n+2))]
lista
[3,
5,
11,
17,
29,
41,
59,
71,
101,
107,
1 de 9
137,
149,
179,
191,
197,
227,
239,
269,
281,
311,
347,
419,
431,
461,
521,
569,
599,
617,
641,
659,
809,
821,
827,
857,
881]
lista[5]
41
Sage tiene una función que identifica el tipo de número que tengamos, es decir, si es entero, racional o real.
type(1)
<type 'sage.rings.integer.Integer'>
type(2/5)
<type 'sage.rings.rational.Rational'>
type(3.5)
<type 'sage.rings.real_mpfr.RealLiteral'>
type(4.)
<type 'sage.rings.real_mpfr.RealLiteral'>
Podemos extraer sublistas de una lista dada. Por ejemplo: la sublista que comprende desde el sexto hasta el decimoquinto
elemento. Nota: el valor inicial y/o el final son opcionales.
lista = range(21)
lista[5:15]
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
lista
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20]
Se pueden cambiar los elementos que forman una lista accediendo a ellos a través de su posición:
lista[20] = 768
lista
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 768]
len(lista)
21
2 de 9
lista.append('fin')
lista
[0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
768,
'fin']
len(lista)
22
O en cualquier posición:
lista.insert(6,'nuevo')
lista
[0,
1,
2,
3,
4,
5,
'nuevo',
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
768,
'fin']
lista.remove('fin')
lista
[0,
1,
2,
3,
4,
5,
'nuevo',
6,
7,
3 de 9
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
768]
del lista[1]
lista
[0,
2,
3,
4,
5,
'nuevo',
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
768]
del(lista[4],lista[7])
lista
[0, 2, 3, 4, 'nuevo', 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 768]
Notar que, al eliminar lista[4], la lista ha cambiado y luego se elimina lista[7] de la lista modificada
sorted([3,4,1,1,2,5])
[1, 1, 2, 3, 4, 5]
Ahora vamos a trabajar con conjuntos. En los conjuntos, los elementos repetidos no son tomados en cuenta, se eliminan. Se
pueden construir con set() (tipo de Python) o Set() (tipo de Sage):
T=[1,2,3,56]
Set(T)
{56, 1, 2, 3}
A = Set(['a', 1, 2, 'b', 4, 'd', 'c', 3])
A
{'a', 1, 2, 'b', 4, 'd', 'c', 3}
Sage proporciona funciones para realizar la unión, intersección, diferencia y diferencia simétrica entre conjuntos:
B = Set(['a',1,'e',5])
A.difference(B)
{'c', 3, 4, 'd', 'b', 2}
4 de 9
A.symmetric_difference(B)
{2, 'b', 'e', 5, 'c', 3, 4, 'd'}
union(A,B)
['a', 1, 2, 'b', 4, 'd', 'c', 3, 'e', 5]
A.union(B)
{'a', 1, 2, 'b', 4, 'd', 'c', 3, 'e', 5}
A.intersection(B)
{'a', 1}
union?
File: /Applications/Sage/Sage-5.6-OSX-32bit-10.4.app/Contents/Resources/sage/local/lib/python2.7/site-packages/sage/misc
/misc.py
Docstring:
Return the union of x and y, as a list. The resulting list need not be sorted and can change from call to call.
INPUT:
x - iterable
y - iterable (may optionally omitted)
OUTPUT: list
EXAMPLES:
Podemos obtener subconjuntos de cualquier orden de un conjunto dado. Si no se especifica el orden devuelve todos los
subconjuntos:
S = A.subsets(3)
S.list()
[{'a', 1, 2},
{'a', 1, 'b'},
{'a', 1, 4},
{'a', 1, 'd'},
{'a', 1, 'c'},
{'a', 1, 3},
{'a', 2, 'b'},
{'a', 2, 4},
{'a', 2, 'd'},
{'a', 2, 'c'},
{'a', 2, 3},
{'a', 'b', 4},
{'a', 'b', 'd'},
{'a', 'c', 'b'},
{'a', 3, 'b'},
{'a', 4, 'd'},
{'a', 'c', 4},
{'a', 3, 4},
{'a', 'c', 'd'},
{'a', 3, 'd'},
{'a', 'c', 3},
{1, 2, 'b'},
{1, 2, 4},
5 de 9
{1, 2, 'd'},
{1, 2, 'c'},
{1, 2, 3},
{1, 'b', 4},
{1, 'b', 'd'},
{1, 'c', 'b'},
{3, 1, 'b'},
{1, 4, 'd'},
{1, 'c', 4},
{1, 3, 4},
{1, 'c', 'd'},
{1, 3, 'd'},
{1, 'c', 3},
{2, 'b', 4},
{2, 'b', 'd'},
{2, 'b', 'c'},
{3, 2, 'b'},
{2, 4, 'd'},
{2, 4, 'c'},
{2, 3, 4},
{'c', 2, 'd'},
{2, 3, 'd'},
{2, 3, 'c'},
{'b', 4, 'd'},
{'c', 'b', 4},
{3, 'b', 4},
{'c', 'b', 'd'},
{3, 'b', 'd'},
{3, 'c', 'b'},
{'c', 4, 'd'},
{3, 4, 'd'},
{'c', 3, 4},
{'c', 3, 'd'}]
8∗7∗6
El conjunto A tiene 6
subconjuntos de orden 3:
S.cardinality()
56
Sage tiene conjuntos de números predefinidos, con los que también se puede trabajar. Por ejemplo, ZZ representa el conjunto de
los números enteros:
C=Set(ZZ)
C.cardinality()
+Infinity
A.difference(C)
{'a', 'c', 'b', 'd'}
Sage trabaja con conjuntos infinitos de forma correcta, pero no los muestra:
D = A.symmetric_difference(C)
D
Set-theoretic symmetric difference of {'a', 1, 2, 'b', 4, 'd', 'c',
3} and Set of elements of Integer Ring
print 1 in D
print 5 in D
print 'a' in D
False
True
True
A.is_finite()
True
6 de 9
C.is_finite();C.cardinality()
False
+Infinity
D.is_finite();D.cardinality()
False
+Infinity
Se pueden hacer uniones de modo que sean forzosamente disjuntas, teniendo así elementos repetidos:
U = DisjointUnionEnumeratedSets((A,B))
U.cardinality()
12
U.list() # Lista asociada a este conjunto
['a', 1, 2, 'b', 4, 'd', 'c', 3, 'a', 1, 'e', 5]
3. Funciones
Sage permite al usuario definir funciones. Para ello, deben declararse previamente como variables las letras que se vayan a
utilizar en ellas:
var('x')
f(x) = x^2 +1
f(3)
10
g(x) = x+1
f(g(x))
(x + 1)^2 + 1
expand(f(g(x)))
x^2 + 2*x + 2
expand(g(f(x)))
x^2 + 2
plot(f(x),-1,1)
7 de 9
Podemos calcular inversas de funciones (no en todas las ocasiones) resolviendo la ecuación:
var('y')
solve(ln(sin(x)) == y, x)
[x == arcsin(e^y)]
4. Ejercicios
Ejercicio 1.- Crea una lista formada por los primos gemelos menores que 1000. Transforma esta lista en un conjunto A. ¿Cuántos
elementos hay en A? Nota: los primos gemelos son pares de números primos separados por dos unidades, como por ejemplo el
11 y el 13.
Ejercicio 2.- Estudia el funcionamiento de funciones para crear listas aleatorias como randrange. Úsala para crear otro conjunto
B, a partir de considerar una lista de un número de elementos aleatorios entre 0 y 1000 que tenga el mismo cardinal que A.
Calcula el cardinal de B y analiza los resultados.
Ejercicio 3.- Calcula la unión, la intersección y la diferencia simétrica de A y B, así como el cardinal de todos estos conjuntos.
Comprueba que se cumple el principio de inclusión-exclusión, es decir, que |A B| = |A| + |B| − |A ∩ B| .
Ejercicio 4.- Estudia el funcionamiento de la orden SetPartitions y úsala para obtener las particiones del conjunto V = {a, e, i, o,
u} en dos subconjuntos y el número total de particiones de V .
Ejercicio 5.- Contrasta los resultados obtenidos con el uso de las funciones bell_number y stirling_number2.
Ejercicio 6.- No hay que confundir las órdenes anteriores con las órdenes Partitions o number_of_partitions. Busca en la ayuda
qué hacen y para qué se utilizan. Como aplicación, calcula de cuántas formas puedo partir el número 10 y encuentra dichas
particiones.
Ejercicio 7.- Determina si la función f(x) = x2 − 1 tiene inversa. En su caso, dibújala. Lo mismo para g(x) = x3 − 1. En este
último caso compónla con la función h(x) = (x + 1)1/3 .
8 de 9
9 de 9