






Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: algebra, Profesor: Juan Manuel Urbano Blanco, Carrera: Ingeniería Informática, Universidad: UGR
Tipo: Ejercicios
1 / 11
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!







En esta práctica veremos cómo Maxima trae implementados algunos conceptos básicos sobre conjuntos, aplicaciones, relaciones de equivalencia y relaciones de orden.
Como ya sabemos, Maxima numera las sucesivas líneas de entrada como (%i1), (%i2), (%i3), etcétera. En los guiones de prácticas de Maxima, cuando indiquemos la introducción de un comando, escribimos a la izquierda del mismo (%ixx). Obviamente, el alumno sólo ha de escribir el comando en cuestión y no la cadena de caracteres (%ixx). Por ejemplo, si escribimos
(%ixx) 1+1;
el alumno sólo ha de introducir 1+1 y pulsar la tecla Intro en el teclado numérico, ó bien pulsar al mismo tiempo las teclas Shift y Enter. El punto y coma nal tampoco es necesario escribirlo. Lo añade Maxima.
Lo primero es ver cómo introducir conjuntos. Tenemos, en principio, dos opciones:
Enumerando los elementos separados por comas y encerrándolos entre llaves. (%ixx) A:{1,2,3,4,5,6,7,8,9}; (%oxx) {1,2,3,4,5,6,7,8,9} De esta forma hemos creado un conjunto con nombre A y cuyos elementos son los números naturales del 1 al 9. Observe que para asignarle un valor a una variable, en Maxima se usa el símbolo : y no el símbolo := más común en algunos lenguajes de programación. (%ixx) VACIO:{}; (%oxx) {} Ahora hemos denido el conjunto vacio y le hemos llamado VACIO. Recuerde que Maxima a la hora de nombrar variables, distingue entre mayúsculas y minúsculas. Mediante la sentencia set. (%ixx) B:set(2,4,6,8,10,12,14,16); (%oxx) {2,4,6,8,10,12,14,16}
Hemos creado un conjunto con nombre B cuyos elementos son los números naturales pares del 2 al
Si escribimos elementos repetidos en la denición de un conjunto, Maxima deja sólo un elemento por cada grupo de repetidos, y además si los elementos son números, los escribe ordenados en orden creciente.
(%ixx) C:set(1,2,3,1,2,3,1,2,3,1,1,2); (%oxx) {1,2,3}
Ahora vemos los comandos para calcular uniones, intersecciones, etc.
(%ixx) union(A,B); (%oxx) {1,2,3,4,5,6,7,8,9,10,12,14,16} (%ixx) intersection(A,B); (%oxx) {2,4,6,8} (%ixx) setdifference(A,B); (%oxx) {1,3,5,7,9} (%ixx) setdifference(B,A); (%oxx) {10,12,14,16}
Con las últimas cuatro instrucciones hemos calculado A ∪ B, A ∩ B, A \ B y B \ A.
También tenemos la posibilidad de preguntar algunas cuestiones, tales como si un elemento pertenece o no a un conjunto, si un conjunto es o no subconjunto de otro, etc.
(%ixx) elementp(5,A); (%oxx) true
Le hemos preguntado si 5 es un elemento del conjunto A y su respuesta ha sido armativa devolviendo como salida true.
(%ixx) elementp(5,B); (%oxx) false
Por tanto 5 no es un elemento del conjunto B.
Ahora le preguntamos si A es un subconjunto de B.
(%ixx) subsetp(A,B); (%oxx) false
Otros ejemplos.
(%ixx) subsetp({2,6,10},B); (%oxx) true (%ixx) subsetp(VACIO,B); (%oxx) true (%ixx) elementp(5,VACIO); (%oxx) false
También se puede preguntar a Maxima con el comando is si una expresión lógica se satisface ó no. Por ejemplo:
(%ixx) is(A=B); (%oxx) false
Le hemos preguntado si los conjuntos A y B son iguales y la respuesta ha sido negativa. Veamos más ejemplos.
(%ixx) is(A=B or A=A); (%oxx) true Ahora le hemos preguntado si A=B ó A=A. Aunque lo primero es falso, como lo segundo es cierto, la disyunción de ambas armaciones es cierta y por eso devuelve true.
Ahora usamos la función que acabamos de denir.
(%ixx) dif_sim(A,B); (%oxx) {1,3,5,7,9,10,12,14,16} (%ixx) dif_sim(A,A); (%oxx) {}
Si tenemos un conjunto X, podemos calcular el subconjunto formado por los elementos de X que satisfacen una determinada propiedad. Esto lo hacemos con la sentencia subset que tiene dos argumentos: el primero es el conjunto de partida, y el segundo una condición que deben cumplir los elementos para pertenecer al subconjunto.
(%ixx) f(x):=is(x>6)$
Con ésto hemos denido una función que se aplica a un objeto x, que suponemos es un número, y devuelve true si x>6, y false en caso contrario.
(%ixx) f(7); (%oxx) true (%ixx) f(5); (%oxx) false
Ahora usamos f para obtener un subconjunto de A, el cual llamamos D.
(%ixx) A:{1,2,3,4,5,6,7,8,9}$ (%ixx) D:subset(A,f); (%oxx) {7,8,9}
Observe que al usar en el comando subset la función f que hemos denido, no escribimos f(x), sino el nombre de la función que es f.
Maxima tiene algunas funciones ya denidas y que en algunos ejemplos son útiles para especicar la condición, como por ejemplo primep, que nos dice si un número es o no primo, oddp o evenp, que nos dicen si un número es impar o par, respectivamente.
(%ixx) Primos:subset(A,primep); (%oxx) {2,3,5,7}
Así, hemos obtenido los números primos que pertenecen a A. Recuerde que el número 1 por denición no es primo. Seguidamente calculamos los números impares pertenecientes a A.
(%ixx) Impares:subset(A,oddp); (%oxx) {1,3,5,7,9}
Otra forma de obtener conjuntos es a partir de listas. Recordemos que una lista es una secuencia de objetos separados por comas y delimitados por corchetes. En una lista pueden haber objetos repetidos e importa el orden en el que éstos aparecen. Las listas se corresponden con lo que en teoría hemos denido como n-uplas.
(%ixx) lista:[1,2,3,4,2,5,1,2]; (%oxx) [1,2,3,4,2,5,1,2]
Así hemos denido una lista llamada lista.
La longitud de una lista se obtiene con el comando length.
(%ixx) length(lista); (%oxx) 8
Veamos cómo podemos referirnos a los elementos de una lista.
(%ixx) lis:[78,-45,0,34];
(%oxx) [78,-45,0,34] (%ixx) lis[1]; lis[2]; lis[3]; lis[4]; (%oxx) 78 (%oxx) - (%oxx) 0 (%oxx) 34
Podemos modicar algunos de sus valores.
(%ixx) lis[3]:11; (%oxx) 11 (%ixx) lis[1]; lis[2]; lis[3]; lis[4]; (%oxx) 78 (%oxx) - (%oxx) 11 (%oxx) 34
Vea cómo el orden de los elementos ahora sí importa.
(%ixx) is([1,2,3]=[2,1,3]); (%oxx) false
La función setify transforma una lista en un conjunto, mientras que la función listify transforma un conjunto en una lista.
(%ixx) setify([2,3,5,6,8,9,11,12]); (%oxx) {2,3,5,6,8,9,11,12} (%ixx) listify(A); (%oxx) [1,2,3,4,5,6,7,8,9]
Vea lo que ocurre cuando pasamos a conjunto una lista con elementos repetidos.
(%ixx) lx:[1,2,2,3,3,3,4,4,4,4]$ (%ixx) setify(lx); (%oxx) {1,2,3,4}
Como ejemplo, vamos a construir el conjunto de los números primos menores que 100. Para ésto, primero construímos una lista con los 100 primeros números, a continuación la pasamos a conjunto y por último la ltramos, quedándonos únicamente con los elementos que sean primos.
(%ixx) lx:makelist(i,i,1,100)$ D:setify(lx)$ P:subset(D,primep); (%oxx) {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97}
Los dos primeros comandos que hemos introducido en la línea anterior acaban en $, pues no nos interesa que aparezcan todos los números del 1 al 100 en pantalla.
Con Maxima podemos construir el producto cartesiano de dos o más conjuntos.
(%ixx) A1:{a,b,c}$ A2:{3,5}$ cartesian_product(A1,A2); (%oxx) {[a,3],[a,5],[b,3],[b,5],[c,3],[c,5]}
Con los tres comandos anteriores hemos denido los conjuntos A1 y A2, y hemos calculado el conjunto A1 × A2. Observe que el resultado es un conjunto de listas de longitud dos. Es decir, lo que en teoría representamos como pares ordenados, (x, y), en Maxima se representa como listas de longitud dos, [x,y]. Veamos otros ejemplos:
(%ixx) cartesian_product(A2,A1); (%oxx) {[3,2],[3,b],[3,c],[5,2],[5,b],[5,c]} (%ixx) cartesian_product({1,2,3},VACIO);
(%ixx) expand(g(f(x))); (%oxx) 6 x^2 − 1
Por supuesto Maxima dispone de las funciones numéricas usuales como la exponencial, las funciones trigonométricas, etc, que el alumno podrá encontrar en la ayuda de Maxima.
Si tenemos una aplicación f : S → R × R, donde S ⊆ R × R y f (x, y) = (2x + y, x − 3 y), podemos denir f en Maxima de la forma siguiente:
(%ixx) f(x,y):=[2x+y,x-3y]; (%oxx) f(x,y):=[2x+y,x-3y] (%ixx) f(1,1); f(0,0); f(-1,5); (%oxx) [3,-2] (%oxx) [0,0] (%oxx) [3,-16]
Observe que f se aplica a dos números x e y, pero no a una lista de dos números. Si escribe lo siguiente, se obtiene un error precisamente por lo que estamos comentando.
(%ixx) f([1,1]);
Si queremos escribir f de modo que su argumento sea una lista formada por dos números, también es incorrecto introducir lo siguiente.
(%ixx) f([x,y]):=[2x+y,x-3y];
La forma de hacerlo es usar la referencia dentro de el argumento de entrada que se supone es una lista de longitud dos.
(%ixx) f(lis):=[2lis[1]+lis[2],lis[1]-3lis[2]]; (%ixx) f([1,1]); f([0,0]); f([-1,5]); (%oxx) [3,-2] (%oxx) [0,0] (%oxx) [3,-16]
A continuación mostramos algunos ejemplos.
Ejemplo 1. Calcular la imagen de la aplicación f : X → Z, donde X = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } y f (x) = x^2 − 10 x + 21.
(%ixx) X:{0,1,2,3,4,5,6,7,8,9}; (%ixx) f(x):=x^2-10*x+21;
Usamos el comando map que aplica la función f al dominio (conjunto) X y por tanto obtenemos la imagen de f.
(%ixx) map(f,X); (%oxx) {-4,-3,0,5,12,21};
Ejemplo 2. Obtener la imagen de la aplicación f : X × X → Z, donde X = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 } y f (x, y) = 2x − 3 y.
Primero construímos el dominio de f que llamamos Dom.
(%ixx) X:{0,1,2,3,4,5,6,7,8,9}$ (%ixx) Dom:cartesian_product(X,X)$
Observe que los dos comandos anteriores acaban con el símbolo $.
Ahora denimos f y la aplicamos al dominio con lo que obtenemos la imagen de la aplicación.
(%ixx) f(lis):=2lis[1]-3lis[2];
(%ixx) map(f,Dom); (%oxx) {-27,-25,-24,-23,-22,-21,-20,-19,-18,-17,-16,-15,-14,-13,-12,- (%oxx) ,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14, (%oxx) ,16,18}
Hay otras formas de obtener el mismo resultado. Una de ellas consiste en usar el comando makeset que ya hemos usado en la sección anterior.
(%ixx) makeset(2x-3y,[x,y],Dom);
Ejemplo 3. Sean el conjunto X = { 17 , 19 , 31 , 33 , 45 , 57 , 89 } y la aplicación f : P(X) → N tal que
f (A) =
a∈A
a
con f (∅) = 0 por denición.
Es decir, f le hace corresponder a cada subconjunto A de X la suma de los elementos que pertenecen a A.
Primero denimos el dominio de f.
(%ixx) X:{17,19,31,33,45,57,89}$ (%ixx) Dom:powerset(X)$
Usaremos el comando apply que aplica un operador dado (en nuestro caso el operador suma) a los elementos de una lista para obtener un nuevo elemento (en nuestro ejemplo, la suma de todos los elementos que forman la lista). Por ejemplo:
(%ixx) apply("+",[5,11,13]); (%oxx) 29 (%ixx) apply("+",[7]); (%oxx) 7 (%ixx) apply("+",[]); (%oxx) 0
La aplicación que nos interesa es la siguiente:
(%ixx) sumaelem(A):=apply("+",listify(A));
En la denición dada, suponemos que A es un conjunto, por lo que tenemos que transformalo previamente en una lista.
Probamos la función sumaelem con algunos ejemplos concretos.
(%ixx) sumaelem({31}); (%oxx) 31 (%ixx) sumaelem({31,33,45}); (%oxx) 109 (%ixx) sumaelem({}); (%oxx) 0
Finalmente obtenemos la imagen de la aplicación f.
(%ixx) map(sumaelem,Dom); (%oxx) {0,17,19,31,33,36,45,48,50,52,57,62,64,67,69,74,76,78,81,83,88, (%oxx) ,90,93,95,97,100,102,105,106,107,108,109,112,114,119,120,121,122,124,125, (%oxx) 126,128,133,134,135,137,138,139,140,141,145,146,150,151,152,153,154,156, (%oxx) 157,158,163,165,166,167,169,170,171,172,177,179,182,183,184,185,186,189, (%oxx) 191,194,196,198,201,202,203,208,210,213,215,217,222,224,227,229,234,239,
Los objetos de Maxima (símbolos, números y cadenas) se ordenan atendiendo al siguiente criterio: Ente- ros y decimales en coma otante preceden a constantes declaradas (que representan al número π, e, etc), que a su vez preceden a las cadenas de caracteres, es decir, secuencias de caracteres encerradas entre dobles comillas. Por último, éstas preceden a nombres de variable que no tienen valores asignados.
Este orden queda reejado en la función booleana orderlessp.
(%ixx) orderlessp(4,5); (%ixx) orderlessp(4,4.0 ); (%ixx) orderlessp(4.0 ,4); (%ixx) orderlessp(4,abc); (%ixx) abc:1; (%ixx) orderlessp(4,abc); (%ixx) orderlessp(%pi,7);
El número π vale aproximadamente 3 , 14159265. Sin embargo la constante predeclarada en Maxima %pi que representa a dicho número, es considerada por el comando orderlessp mayor que la constante numérica 7.
(%ixx) is(3+%pi<7);
Como se aprecia, al usar %pi es una expresión aritmética, sí se toma su valor numérico.
(%ixx) orderlessp(400,"12"); (%ixx) orderlessp("tara","taza")
Para ordenar los elementos de una lista, Maxima dispone del comando sort.
Consideramos algunos ejemplos:
(%ixx) sort([%e,e,3,a,b,4,5,c,d,"xyz",abc,%pi,"xxyz",3.4,%phi,3.25]);
Para ver lo que valen aproximadamente las constantes predenidas %e, %pi, %phi, %gamma, escribimos:
(%ixx) %e,numer; (%ixx) %pi,numer; (%ixx) %phi,numer; (%ixx) %gamma,numer;
Para que tenga en cuenta el valor numérico de las constantes a la hora de ordenar una lista, escribiremos:
(%ixx) sort([%pi,3,4,%e,%gamma,%phi], "<");
El comando que obtiene el producto cartesiano de dos o más conjuntos, genera los elementos del conjunto resultante ordenados lexicográcamente. Compruebe ésto viendo la salida del comando siguiente.
(%ixx) cartesian_product({1,2,3},{a,b},{4,5,6});
Hemos obtenido un conjunto de listas de longitud 3. Maxima asume que 1 < 2 < 3 , a < b y 4 < 5 < 6.
Es más, el comando orderlessp mencionado en la sección anterior, cuando se aplica a dos listas (no necesariamente de igual longitud) devuelve true sólo cuando la primera es estrictamente menor que la segunda en el orden lexicográco. Introduzca los comandos siguientes y compruebe lo que acabamos de decir.
(%ixx) orderlessp([1,8,3],[4,5,6]); (%ixx) orderlessp([1,8,3],[1,8,3]);
(%ixx) orderlessp([4,8,3],[4,5,6]); (%ixx) orderlessp([1,8,3],[4,2,2,7,8]); (%ixx) orderlessp([1,8,3,1,1,5],[4,2,2]);
Ejercicio. Sea el conjunto A = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 } ordenado con el orden usual. Sobre el conjunto H = A × A × A consideramos el orden producto correspondiente. Escriba una función moi(v1,v2) en Maxima que se aplica a dos elementos de H, es decir, a dos 3-uplas y devuelve true exactamente cuando v1 es menor o igual que v2 con el orden producto.