Académique Documents
Professionnel Documents
Culture Documents
html
Matemtica Discreta
Ingeniera Tcnica en Informtica de Sistemas y Gestin
ESCET
Secuencias
El tipo de datos ms bsico es la secuencia, una coleccin ordenada de objetos de Maple separados por comas .
>
sec1:=4,Pi,7.5,E,{1,2,3},x->3*x^2;
Se puede introducir cualquier tipo de objetos en una secuencia. Observa que entre los datos de la secuencia de arriba hay nmeros, smbolos, conjuntos... Puedes acceder a sus elementos escribiendo el lugar que ocupan en la secuencia entre corchetes: As por ejemplo el segundo elemento de sec1 es pi.
>
sec1[2];
El quinto es un conjunto:
>
sec1[5];
sec1[6];
Mira ahora ms detalles en la ayuda para secuencias. Detente sobre la ayuda o vuelve sobre ella, es importante ir entendiendo bien los conceptos.
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]
LibroMaple03.html
Continuar aqu Como habrs visto en la ayuda, dos operadores importantes para la generacin de secuencias son $ y seq : Por ejemplo, para construir una secuencia de 10 ceros se puede escribir:
>
0$10;
seq(2*i-1,i=1..20);
seq(3*i,i=1..10);
Mira la ayuda para el comando seq . Ejercicios. Despus de haber ledo detenidamente la ayuda para secuencias, deberas ser capaz de responder a las siguientes preguntas acerca de la siguiente secuencia:
>
sec1:=4,8,13,{Pi,E,I},seq([k,k+2],k=6..18);
(2) Escribe un comando que devuelva una secuencia con once palabras `bien`.
> > >
(4) Haz una secuencia formada por los cubos X^3 de nmeros naturales que verifican X^3<1000.
> >
Listas
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]
LibroMaple03.html
Una lista es una secuencia contenida dentro de corchetes []. Tanto en secuencias como en listas se pueden repetir elementos, y el orden en el que se escriben los elementos es importante.
>
sec1:=seq(i^4,i=1..5); lista1:=[seq(i^4,i=1..5)];
Dada una lista, puedes acceder a la secuencia de sus elementos mediante el comando op :
>
op(lista1);
Para aadir elementos al final de una secuencia, basta escribir una coma y despus los elementos que queremos aadir. Pr ejemplo podemos aadir dos a'es al final de la secuencia sec1 :
>
sec2:=sec1,a,a;
Para aadir elementos al final de una lista, hay que extraer la secuencia de sus elementos, aadir los elementos nuevos, y volver a hacer una lista del resultado:
>
lista2:=[op(lista1),muchos,mas];
Para acceder a los elementos de una lista, se hace de la misma manera que para secuencias. El nmero de elementos de una lista se puede contar con el comando nops.
>
lista2[2]; nops(lista2);
>
>
subsop(3=febrero,meses);
subsop(1=NULL,meses);
Ejercicios Como en el caso de las secuencias, realiza los siguientes ejercicios sobre listas:
> >
a:=seq(i,i=1..60): s:=2,3,4,5,t,y,j,a,a,l^2;
LibroMaple03.html
(2) Construir la lista de los 30 primeros cuadrados (esto es, 1^2, 2^2, 3^2....)
> >
Conjuntos
Un conjunto es una secuencia contenida dentro de llaves{}. En un conjunto cada elemento slo puede aparecer una vez y los datos no estn ordenados.
Echa una ojeada a la ayuda para conjuntos. Podemos definir por ejemplo los conjuntos A y B siguientes. Observa que los elementos repetidos slo se tienen en cuenta una vez y que el orden no es relevante:
> >
restart; A:={1,2,3,4,1,4,5};
>
B:={1,2,1,b,s,b,c,4};
Y se pueden hacer operaciones con conjuntos. Es posible hacer uniones (coleccionar los elementos de ambos conjuntos), intersecciones (coleccionar los elementos que pertenecen simultneamente a ambos conjuntos) y complementos (tomar los elementos de un conjunto que no estn en otro):
>
A union B;
>
A intersect B;
>
A minus B;
>
>
lista:=[Lunes,Martes,Sabado,Jueves];
LibroMaple03.html
>
s1:=g,e,y,d,e,r,f,y,f,d,e,k,y,e,f,g,h,d,y;
>
(1) Cmo puedes obtener los elementos comunes a s y t ? Y los elementos de s que no estn en t ?
> > >
(3) Cmo puedes saber cuntos elementos tiene el conjunto cuyos elementos son los de s1?
> > >
(4) Genera la lista formada por la concatenacin de los elementos de lista y lista2 (definida abajo)
>
lista2:=[elem1,elem2,elem3];
( 5) Cuntos nmeros menores que 1000 son a la vez el cuadrado y el cubo de un nmero entero?
> >
Bucles y condicionales
Bucles
Una de las razones por las que los ordenadores a veces son tiles es su capacidad de repetir la misma tarea rutinaria una y otra vez sin equivocarse. El elemento sintctico que realiza estas repeticiones se llama bucle y suele consistir de dos partes: en primer lugar un comando o una serie de comandos que queremos ejecutar repetidamente, y luego un comando que controla cuntas veces se ejecuta el bucle.
Condicionales
Por otro lado estn las condicionales de la forma:
LibroMaple03.html
La primera lnea de cdigo asigna un nombre al procedimiento, digamos mximo e indica que va a actuar sobre dos nmeros a y b La variable c que va a ser la salida se define como una variable local, esto es, slo se considera dentro del procedimiento. La sentencia condicional es exactamente la eleccin del mximo. Como c va seguida de un punto y coma, ser lo que se vea en la pantalla, la asignacin a la salida.. El comando end termina el procedimiento.
>
maximo(2,4);
signo:=proc(a) local s; if a<0 then s:=menos elif a=0 then s:=0 else s:=mas fi: s; end: signo(27);
>
>
signo(-23);
>
signo(0);
> >
El Bucle "for"
Como en muchos lenguajes de programacin, los bucles for y while (mira la ayuda) sirven para la iteracin de comandos, de manera parecida al comando seq.
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]
LibroMaple03.html
En Maple, la forma general de un bucle es la siguiente: for variable from inicio by salto to final while expresin do operaciones od
Cuando Maple encuentra este comando, primero asigna el valor inicio a la variable. Si se cumple expresin , ejecuta las sentencias entre do y od . A continuacin, se hayan ejecutado las sentencias o no, incrementa la variable por el valor del salto (que puede perfectamente ser negativo!), y compara el nuevo valor de variable con final. Si variable no es mayor (en el caso de ser salto positivo) respectivamente menor (si salto es negativo) que final, y se cumple la condicin que seala el while , ejecuta otra vez sentencias, y as sucesivamente. Si omitimos algunas de estas clusulas, Maple les asigna un valor por defecto: inicio ---->1 salto ---->1 final ----> + expresin ---->true Por ejemplo para sumar los nmeros del 1 al 10000.
>
Que coincide con el valor de la suma de los trminos de una sucesin aritmtica:
>
(10^4)*(10^4+1)/2;
a:=[1,2,3,4,5,6,7,8];
>
> >
restart; suma:=proc(A::list) local S,i: S:=0: for i from 1 to nops(A) do S:=S+A[i]: od: S;
LibroMaple03.html
end: Se puede declarar el tipo de variables que usa el procedimiento y as hemos considerado A como una lista. Esto ayuda a determinar los errores en un procedimiento pues si introducimos variables no adecuadas manda mensaje de error. Puedes consultar la ayuda para ver los distintos tipos de variables.
> >
?type; suma(2,3,4,5,6,6);
Error, invalid input: suma expects its 1st argument, A, to be of type list, but received 2
Lo aplicamos a una sucesin aritmtica cuyo primer trmino es a y la diferencia entre dos consecutivos es d . La lista de los 50 primeros trminos es:
>
L:=[seq(a+i*d,i=1..50)]:
Y su suma es:
>
suma(L);
>
Despus de acabar la definicin de la subrutina mediante la palabra clave "end", Maple nos confirma el cdigo que ha sacado en claro de nuestra entrada. Si no se quiere esta informacin se puede terminar el procedimiento con los dos puntos, esto es, end: Probemos unos ejemplos:
>
rectangulo(-2,3);
>
rectangulo(0,0);
>
with(plots): polygonplot(rectangulo(5,3));
LibroMaple03.html
> >
Bsqueda
Para buscar un elemento b en una lista a introducimos la lista y el elemento y vamos recorriendo la lista comparando con el elemento, continuando la ejecucin del bucle si son distintos. Si el bucle se detiene antes de recorrer toda la lista la salida es s y en caso contrario no. Desarrollaremos otros algoritmos de bsqueda.
>
busqueda:=proc(a::list,b::numeric) local i,c: c:=0: for i from 1 to nops(a) while c=0 do if a[i]=b then c:=1 fi: od: if c=0 then c:=No else c:=Si fi: c; end:
busqueda([1,2,3,4,7,8],8);
>
busqueda([1,2,3,4,7,8],9);
>
busqueda([1,4,5,6,7,9,10],5);
>
busqueda([1,3,4,5,2,3,4,8],4);
>
busqueda([1,3,4,5,2,3,4,8],8);
>
LibroMaple03.html
> >
Media aritmtica
La media aritmtica no es ms que el cociente entre la suma de los elementos de la lista y el nmero de elementos, entonces:
>
media:=proc(a::list) local S,i: S:=0: for i from 1 to nops(a) do S:=S+a[i] od: S/nops(a); end: media ([1,2,3,4,5,6]);
>
>
Mximo
Podemos hacer un procedimiento para calcular el mximo de una lista de nmeros. Sencillamente definimos una variable M donde inicialmente se almacena el valor del primer elemento de la lista y que se va comparando con cada elemento de la lista cambiando su valor por l si es necesario.
>
Maximo:=proc(a) local c,i: c:=a[1]: for i from 2 to nops(a) do if c<a[i] then c:=a[i] fi: od: c; end:
Maximo([44,55,6,7,10]);
>
Maximo([45,789,10^6,45,6]);
Ejercicios
(1) Disea un procedimiento para dada una lista L y dos enteros a y b tales que 0<a<b<nops( L ) calcular el producto de los elementos de L entre el a'simo y el b'simo.
>
LibroMaple03.html
>
(2) Disea un procedimiento para saber qu lugares ocupa un elemento que est en una lista.
> >
(3) Disea un procedimiento para, dadas dos conjuntos A y B construir el producto cartesiano AxB.
> >
Prctica 2
PRCTICA 2
TEORA DE NMEROS
1. Introduccin
Instrucciones
1. Lee con atencin el texto. Cuando aparezcan comandos o procedimientos de Maple (lneas en rojo), intenta averiguar para qu sirven (puedes emplear la ayuda de Maple) y despus ejectalos. Puedes ejecutarlos varias veces y cambiar en ellos lo que te parezca para entenderlo mejor o mejorarlo.
3. Lee los puntos 1 y 2 de la prctica. Despus realiza el test. El punto nmero 3, de aplicaciones, puedes leerlo fuera de horario de la prctica para ver distintas aplicaciones de lo estudiado.
Contenidos
Tericos: - Aritmtica modular - Mximo comn divisor y mnimo comn mltiplo - Teorema chino del resto - Factorizacin de enteros - Test de primalidad - La funcin de Euler Aplicaciones : - Criptografa clsica - Criptografa de clave pblica Maple dispone de un paquete de funciones especficas para la Teora de Nmeros , numtheory , que cargaremos con la instruccin:
>
with(numtheory):
Warning, the protected name order has been redefined and unprotected
>
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]
LibroMaple03.html
2. Fundamentos
2.1. Aritmtica modular
Para calcular el resto de la divisin de dos nmeros enteros a,b se usa el comando mod.
>
5 mod 3;
>
Para resolver congruencias lineales en una indeterminada, podemos usar msolve . Por ejemplo, supongamos que queremos resolver el siguiente problema: Por qu nmero debo multiplicar 3 para obtener 1 mdulo 7 ?
>
msolve(3*y=1,7);
3*5-1 mod 7;
msolve(3*y=1,6);
Parece que Maple ha fallado, pero en realidad no ha aportado ninguna solucin porque no existe. Para comprobarlo observemos la lista de los distintos productos por 3 mdulo 6 y veamos que ninguno es igual a 1.
>
>
Cul es la razn de que no tenga solucin esta ecuacin y sin embargo s la tenga la anterior?
igcd(3,6);
>
igcd(6,4,12);
Para calcular el mximo comn divisor de todos los enteros entre 10 y 100 hacemos:
>
igcd(seq(i,i=10..100));
LibroMaple03.html
Y debe ser 1 porque entre el 10 y el 100 hay nmeros primos. La funcin ilcm ( i nteger l east c ommon m ultiple) permite calcular el mnimo comn mltiplo (el menor de los mltiplos comunes):
>
ilcm(101,13);
>
ilcm(6,4,12);
>
ilcm(seq(i,i=10..100));
>
Comprueba con varios ejemplos la relacin que existe entre el mximo comn divisor, el mnimo comn mltiplo y el producto de dos nmeros enteros : a.b = mcd(a,b). mcm(a,b). El comando is de la lnea siguiente determina si dos expresiones son iguales.
>
is(125*3490=ilcm(125,3490)*igcd(125,3490));
> >
Recuerda que la verificacin de una igualdad en unos cuantos ejemplos no es una demostracin, slo nos convence de que la frmula parece verdadera, no demuestra su veracidad. Las funciones gcd y lcm de Maple calculan el mximo comn divisor y mnimo comn mltiplo respectivamente de polinomios. Tambin pueden usarse con nmeros enteros, ya que stos pueden considerarse polinomios, pero las funciones igcd e ilcm lo hacen de forma ms eficiente. El mximo comn divisor de dos nmeros se puede expresar como combinacin lineal de stos con coeficientes enteros (Lema de Bezout). Por ejemplo, el mximo comn divisor de 3 y 5 , que es 1, se expresa como:
>
2*3-1*5;
>
Los coeficientes 2 y (-1) se obtienen del algoritmo de Euclides para calcular el mximo comn divisor. La funcin igcdex de Maple calcula estos coeficientes, si damos como parmetros los nombres de las variables a las que queremos que asigne dichos valores:
>
igcdex(3,5,a,b);
>
a,b;
>
Otro ejemplo:
>
igcd(324,779);
>
igcdex(324,779,x,y); x; y;
LibroMaple03.html
>
324*x+779*y;
>
chrem([2,3,2],[3,5,7]);
>
La primera lista contiene los segundos miembros de las igualdades y la segunda los mdulos respectivos. Utiliza esta instruccin para encontrar un entero que sea congruente con 5 mdulo 2, con 4 mdulo 7 y con 3 mdulo 11.
> >
with(numtheory);
ifactor(100);
>
ifactor(12345);
>
ifactor(39248675928359283654928364);
LibroMaple03.html
>
h:=2^33*3^55;
>
ifactor(h);
>
Los algoritmos de factorizacin de nmeros enteros son muy poco efectivos, nmeros de tamao muy grande hacen que el programa se quede bloqueado. Si quieres probar, graba primero lo que has hecho hasta ahora e intenta factorizar, digamos, el nmero 1+2^200. Recuerda que la seal de STOP en la barra de instrucciones detiene un cmputo.
> > >
with(numtheory): Testprimo1:=proc(a) local i,s,c: s:=0: for i from 2 to a-1 while s=0 do if a mod i = 0 then s:=1 fi: od: if i<a then c:=compuesto else c:=primo fi: c; end:
Testprimo1(9);
>
Testprimo1(17);
>
Testprimo1(34567890);
>
En cualquier caso, como decamos antes, este mtodo es muy poco eficiente. Actualmente apenas se pueden factorizar nmeros de 100 cifras, y factorizar un nmero de 200 cifras es impensable (se necesitaran millones de aos de clculo con los mejores computadores para hacerlo). En consecuencia, en lugar de intentar emplear mtodos directos de factorizacin, para averiguar si un nmero es primo se emplean mtodos probabilsticos. La funcin isprime de Maple est basada en stos mtodos. Cuando responde true significa que el nmero evaluado es primo con una probabilidad muy alta, pero sin garantizar al 100% el que lo sea.
>
isprime(101);
>
isprime(2342138342111);
LibroMaple03.html
>
isprime(23218093249834217);
>
Como ste nmero no es muy grande, puedes comprobar factorizndolo que, en efecto, no es primo.
> > > > >
La funcin ithprime calcula el i -simo nmero primo. Esto es, el primo que ocupa el lugar i en la lista creciente de los nmeros primos. Los primeros nmeros primos son 2, 3, 5, 7, 11, ... pero cul es el que ocupa el lugar 3000 en la lista de todos los primos?
>
ithprime(1);ithprime(2);ithprime(3);
>
ithprime(3000);
> >
Esta funcin puede usarse para generar nmeros primos. Tambin pueden utilizarse las funciones nextprime y prevprime , que, como su nombre indica, calculan respectivamente el nmero primo ms prximo mayor y menor al nmero dado.
>
nextprime(1000);
>
prevprime(1000);
>
nextprime(13);
Observa que si el nmero es primo nextprime te da el siguiente primo y prevprime el primo anterior. Conviene tener en cuenta que las funciones nextprime y prevprime estn basadas en la funcin isprime , por lo que no podemos garantizar el resultado, aunque la probabilidad de que sea correcto es muy elevada. Terminamos observando que la lista de nmeros primos no se conoce, esto es, no hay una manera de determinar el primo ensimo. Es uno de los grandes problemas no resueltos de la matemtica.
2.6. La funcin
La funcin
de Euler
de Euler phi(n) (del paquete numtheory) computa el nmero de enteros positivos menores o iguales que n y que son relativamente primos con n (cuenta el 1 porque mcd(1,n)=1 ). Obsrvese que phi(n) = n-1 si y slo si n es , la primalidad de n . Sin embargo, nuevamente, no es un test eficiente.
LibroMaple03.html
>
phi(1);
>
phi(2);
>
phi(10);
Este nmero, phi(10) , es exactamente el nmero de elementos del conjunto de nmeros positivos menores que 10 y relativamente primos con 10, a saber, {1,3,7,9}.
>
is(phi(13)=12);
phi(5);
>
phi(10);
>
phi(107);
Testprimo2(37);
>
Testprimo2(5);
>
Testprimo2(107);
>
Testprimo2(32);
Si queremos determinar todos los nmeros naturales k tales que phi(k) = n , esto es, todos aquello nmeros naturales k con exactamente n nmeros a<k primos con k , podemos usar la funcin invphi de Maple. Por ejemplo,
>
invphi(2);
>
phi(3),phi(4),phi(6);
LibroMaple03.html
>
Otro ejemplo:
>
s:=invphi(6);
>
>
3. Aplicaciones
En esta seccin veremos algunas aplicaciones de la aritmtica modular y las congruencias.
alias(I=I); alias(E=E);
El alfabeto ser:
>
alfabeto:=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","","O","P","Q","R","S","T","U","V","W","X","Y","Z"]:
En nuestor ejemplo
>
letranumerogen(alfabeto): letranumero("U");
>
Tambin necesitamos convertir nmeros en letras. Para ello emplearemos la funcin inversa numeroletra :
>
En nuestro ejemplo:
>
numeroletragen(alfabeto,[seq(i,i=0..nops(alfabeto)-2)]): numeroletra(21);
LibroMaple03.html
>
Un encriptador afin clsico es de la forma: f(p) = (ap + b) (mod 26) donde (a,b) es la clave de cifrado (que nadie ms que el emisor y el receptor debe conocer). El entero p es el nmero correspondiente a una letra, y el nmero f(p) es el correspondiente a esa letra encriptada. Para poder desencriptar un mensaje es preciso elegir la clave de forma que la funcin f sea biyectiva.
Cul es la condicin para que eso ocurra, esto es, para que f tenga inversa? Emplearemos una funcin auxiliar Encripletra para encriptar una sola letra. La ayuda te puede aclarar sobre el tipo de datos string:
>
Encripletra:=proc(s::string,clave::[integer,integer]) local factor,incremento; if not length(s) = 1 then ERROR(`el argumento debe ser una sola letra`); fi; factor:=clave[1]; incremento:=clave[2]; RETURN(numeroletra((letranumero(s)*factor+incremento) mod 26)); end:
>
La funcin de encriptado aplica mediante un bucle la funcin Encripletra a cada letra de la palabra que se va a encriptar:
>
Encripta := proc(s::string, clave::[integer,integer]) local i,textocifrado; textocifrado:=NULL; for i from 1 to length(s) do textocifrado:= cat(textocifrado, Encripletra(substring(s,i..i),clave)); od; RETURN(textocifrado); end:
>
Una prueba:
>
Encripletra("A",[3,5]);
>
Encripta("QUIENSABEDONDE",[3,7]);
>
Una vez enviado el mensaje encriptado debemos desencriptarlo, calculando por la inversa de f y la operacin letra nmero la palabra de que proviene el mensaje anterior.
> > >
LibroMaple03.html
Generacin de claves En primer lugar debemos obtener dos nmeros primos grandes p y q . Con ellos generamos la clave pblica que consta de n = pq , y el exponente e. Se genera tambin la clave privada que consta de n , y el inverso de e mdulo phi(n) , donde phi es la funcin de Euler. El nmero e no tiene relacin con los nmeros p y q . Se puede generar de muchas maneras. Dos valores clsicos para e en los sistemas reales son 13 y el cuarto nmero de Fermat F4 = 2^2^4 + 1 = 65537. En nuestro caso tomaremos e = 13. A n le llamamos mdulo.
>
Generaclaves:=proc(p::integer,q::integer) local n, #modulo e, #exponente d, #d*e=1 (mod phin) phin; #phi(n)=(p-1)(q-1) n:=p*q; #calcula el modulo (publico) phin:=(p-1)*(q-1); e:=13; #este numero se podria generar aleatoriamente #calculamos d tal que e*d=1 (mod phin) d:=op(1,op(Roots(e*x-1) mod phin)); RETURN([[n,e],[n,d]]); end:
>
Veamos un ejemplo:
>
Generaclaves(43,59);
Funcin de cifrado y descifrado Ahora que sabemos generar claves, vamos a ver el mtodo RSA de encriptado. El cdigo es sencillo:
>
RSA:=proc(key,msg::list(posint)) local ct, #texto cifrado obtenido pe, #exponente (pblico) pm, #modulo (pblico) i; #ndice del bucle pm:=key[1]; pe:=key[2]; ct:=[]; for i from 1 to nops(msg) do ct:=[op(ct),msg[i]^pe mod pm]; od; RETURN(ct); end:
En la lnea 10 del cdigo del procedimiento RSA est la idea de la encriptacin, toma el nmero que ocupa el lugar i en el mensaje lo eleva a pe y calcula el resto mdulo 13. El primer argumento del procedimiento RSA es la clave. El segundo argumento es el mensaje que queremos encriptar, en forma de lista de enteros positivos. Para ver cmo funciona se lo aplicamos a un ejemplo concreto.
Ejemplo Veamos cmo utilizar el sistema RSA para transmitir un mensaje: Primero debemos codificar el mensaje en forma de lista de enteros positivos. Para ello podemos asignar a cada letra del alfabeto un nmero de dos cifras (por ejemplo A-> 10 , B-> 11, etc.). A continuacin troceamos la lista numrica obtenida en
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]
LibroMaple03.html
bloques de 4 dgitos cada uno. La lista de esos bloques constituye la entrada para el procedimiento RSA de encriptado. La eleccin de la longitud de los bloques ha de escogerse de forma que, despus de la conversin, el entero mayor obtenido sea menor que el mdulo n . Primero asignamos a cada letra un nmero de dos cifras (empezaremos por el 10 por comodidad) y al espacio en blanco otro nmero para separar palabras.
>
>
Ahora definimos un procedimiento para transformar el mensaje en una lista de enteros de cuatro cifras (el mensaje debe tener un nmero par de caracteres, es decir, letras maysculas o espacios en blanco),
>
bloques:=proc(msg::string) local i,listabloques; i:=1;listabloques:=[]; while i < length(msg) do listabloques:=[op(listabloques), od; RETURN(listabloques); end:
(msg ,i+1..i+1))]:i:=i+2:
> >
Ahora vamos a generar una clave para poder utilizarla (nadie debe saber qu nmeros primos estamos usando para crearla):
>
Generaclaves(83,61);
>
Cuando alguien quiera enviarnos el mensaje "HOLA QUE TAL" de forma cifrada, debe usar nuestra clave pblica, que previamente debemos comunicarle. La forma de hacerlo es la siguiente:
>
>
De esta forma, el mensaje que nos enviarn ser: y no importa que nadie lo lea, porque no sern capaces de entenderlo. Para desencriptar el mensaje, usamos nuestra clave privada, que es el segundo elemento de nuestra clave RSA, de la siguiente forma, aplicando nuevamente RSA:
>
>
LibroMaple03.html
>
Bueno, emplea los primos ms prximos a 100 y a 200 por exceso para generar la clave con la que est encriptado el siguiente mensaje. As podrs descifrarlo.
restart; with(numtheory):
Warning, the protected name order has been redefined and unprotected
>
igcd(5643,985798); igcdex(5643,985798,a,b): a; b;
chrem([44,-8,25,0],[99,50,31,13]);
[nextprime(10^6),nextprime(2*10^6),nextprime(3*10^6)];
c:=0; for i from 10^5 to 2*10^5 do if isprime(i) then c:=c+1 fi; od; c;
LibroMaple03.html
restart; with(numtheory): c:=0; for i from 0 to 10^3 do if isprime(i^2+i+41) then c:=c+1 fi; od; evalf(100*c/1001);
Warning, the protected name order has been redefined and unprotected
restart; with(numtheory): c:=0; for i from 0 to 10^4 do if isprime(i^2+i+41) then c:=c+1 fi; od; evalf(100*c/10001);
Warning, the protected name order has been redefined and unprotected
>
LibroMaple03.html
La respuesta correcta es la c). 10. Los nmeros menores que 1000 que tienen exactamente 100 nmeros ms pequeos que son relativamente primos con ellos:
> >
invphi(100);
restart; with(numtheory):
Warning, the protected name order has been redefined and unprotected
>
ifactor(712504);ifactor(985898); igcd(712504,985898);
chrem([42,-8,25,0],[99,50,17,13]); 99*50*17*13;
3. Determina el nmero de mltiplos de 13 que hay entre el 115218 y el 369214 (ambos inclusive).
> >
c:=0: for i from 115218 to 369214 do if (i mod 13)=0 then c:=c+1 fi od: c;
LibroMaple03.html
>
c:=0: for i from 3*10^4 to 4*10^4 do if isprime(i) then c:=c+1 fi; od; evalf(c/10001);
5. Sea la funcin del conjunto cociente de Z por la relacin de congruencia mdulo 13 en s mismo dada por la frmula f(n)=n^13+1 mod 13. Seala la respuesta correcta:
> >
6. Sean las congruencias 3x+1 congruente con 5 mdulo 7 y 2x+3 congruente con 7 mdulo 11.
> >
msolve(3*x+1=5,7); msolve(2*x+3=7,11);
>
{seq(7*i+6,i=1..100)}intersect{seq(11*i+2,i=1..100)};
> >
7. Determinar la cantidad de nmeros enteros menores o iguales que 1000 relativamente primos con 1000.
> >
phi(1000);
>
LibroMaple03.html
msolve(7*x=1,5);msolve(4*x=1,9);msolve(8*x=1,11);
igcd(14,67,89); igcd(14,igcd(67,89));
>
igcd(1445,6785,8900); igcd(1445,igcd(6785,8900));
>
restart; with(numtheory):
Warning, the protected name order has been redefined and unprotected
>
igcd(9755076,3489755);
restart; with(numtheory):
Warning, the protected name order has been redefined and unprotected
>
ifactor(99);ifactor(52);99*52*17*19;
LibroMaple03.html
>
chrem([42,-8,25,0],[99,52,17,19]);
restart; with(numtheory):
Warning, the protected name order has been redefined and unprotected
>
listaprimos:=proc(n) local p,i,c; i:=1;c:=[]; for p from 2 to n do if isprime(p) then c:=[op(c),p]; fi; od; c; end: listaprimos(100);nops(%);
restart; with(numtheory):
Warning, the protected name order has been redefined and unprotected
>
f:=n->4*n^32+4 mod 8;
>
restart; with(numtheory):
Warning, the protected name order has been redefined and unprotected
>
solve(2^n-1<100000,n);
LibroMaple03.html
>
floor(ln(100001)/ln(2));
Tambin,
>
seq(2^n-1,n=2..16);2^17-1;
>
restart; with(numtheory):
Warning, the protected name order has been redefined and unprotected
>
ifactor(4536789);
>
phi(4536789);
La respuesta correcta es la b) porque los mltiplos de 3 no son relativamente primos con 4536789.
>
7. Determinar cuntos nmeros enteros mayores estrictamente que 10 y menores estrictamente que 1000 son, a la vez, primos y congruentes con 5 mdulo 7.
> >
restart; with(numtheory):
Warning, the protected name order has been redefined and unprotected
>
solve(7*i+5<1000,i);floor(995/7);
>
LibroMaple03.html
restart; with(numtheory):
Warning, the protected name order has been redefined and unprotected
>
chrem([1,1],[5,3]); chrem([1,1],[10,3]);
>
restart; with(numtheory):
Warning, the protected name order has been redefined and unprotected
>
>
restart; with(numtheory):
Warning, the protected name order has been redefined and unprotected
>
msolve(5*n-1,12); msolve(7*n-1,12);
Prctica 3
PRCTICA 3
COMBINATORIA
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]
LibroMaple03.html
Comandos de Maple
En el paquete combinat de Maple se recogen comandos relacionados con la combinatoria. Para cargar el paquete procedemos como siempre con la instruccin:
>
with(combinat);
Warning, the protected name Chi has been redefined and unprotected
>
Hay otro paquete de funciones ms avanzadas, combstruct , que no emplearemos en esta prctica.
Cardinales de conjuntos
Comenzamos con las funciones que presenta Maple para trabajar con conjuntos finitos y calcular sus cardinales. Recordamos que los conjuntos se definan con llaves.
>
A:={1,2,3,4};
Y que la operacin nops calculaba el nmero de elementos, es decir, el cardinal del conjunto A:
>
nops(A);
>
C:={seq(n^2,n=-10..10)}; nops(C);
Las operaciones habituales de conjuntos, como son la unin, la interseccin, la diferencia de conjuntos y el producto cartesiano se pueden efectuar con Maple.
>
B:={1,a,b,c};
>
A union B;
>
A intersect B;
LibroMaple03.html
>
A minus B;
cartesiano:=proc(A::set,B::set) local i,j,C: C:={}: for i from 1 to nops(A) do for j from 1 to nops(B) do C:=C union {[[op(A)][i],[op(B)][j]]} od: od: C; end:
cartesiano({1,2},{l,m});
>
cartesiano({maria,juana,luisa},{pedro,pepe,juan});
>
Aplicamos la teora de conjuntos para responder la siguiente cuestin: cuntos nmeros enteros positivos menores o iguales que 1000 son a la vez el cuadrado de un nmero entero y mltiplos de 4?. Definimos el conjunto de los cuadrados menores que 1000.
>
evalf(sqrt(1000));
>
32**2;
>
F:={seq(n^2,n=1..31)};
G:={seq(4*n,n=1..250)}:
F intersect G;
>
LibroMaple03.html
Permutaciones
Comenzamos ahora a estudiar los comandos que tiene Maple para el clculo de variaciones, permutaciones y combinaciones. Aunque siguiendo el orden de los apuntes deberamos empezar con las variaciones de m elementos tomadas de n en n vamos a comenzar sin embargo con las permutaciones. Maple no tiene implementada una funcin para calcular las variaciones, pero s que la tiene para permutaciones y combinaciones, de modo que con ellas podremos definir las variaciones. El nmero de permutaciones de m elementos se calcula con numbperm :
>
numbperm(6);
Tambin se puede usar el smbolo ! o la expresin factorial para calcular el factorial de un nmero:
>
6!; factorial(6);
numbperm({a,b,c,d,e,f});
Para generar todas las permutaciones de un conjunto, esto es, las distintas maneras de ordenarlo, empleamos permute :
>
permute({a,b,c});
Observad que el resultado es una secuencia. Y para generar aleatoriamente una permutacin de los elementos de un conjunto usamos la funcin randperm :
>
randperm({a,b,c,d,e,f});
Si queremos introducir repeticiones , entonces debemos dar los datos con una secuencia:
> >
permute([c,o,c,o,d,r,i,l,o]): numbperm([c,o,c,o,d,r,i,l,o]);
La lnea en que enumeran las permutaciones de la palabra cocodrilo la hemos terminado con dos puntos para no llenar pantallas con las 30240 permutaciones distintas de la palabra. Y podemos verificar que es correcto segn las frmulas de clase:
>
9!/(2!*3!);
Tambin la funcin multinomial permite calcular las permutaciones con repeticin. Mediante la funcin convert podemos ver exactamente la frmula que desarrolla multinomial:
>
multinomial(9,2,3,1,1,1,1); convert(multinomial(n,a,b,c,d),factorial);
De esta manera las permutaciones con repeticin se pueden calcular por estos dos caminos:
>
is(numbperm([c,o,c,o,d,r,i,l,o])=multinomial(9,2,3,1,1,1,1));
LibroMaple03.html
>
Combinaciones
Para calcular el nmero de combinaciones de n elementos (por ejemplo 2 elementos) escogidos entre los elementos de un conjunto (por ejemplo el conjunto {Mara , Juan , Eva , Luis , Teresa, Pablo} ), esto es, sus subconjuntos de n elementos, empleamos la funcin numcomb,
>
Aunque tambin se puede hacer empleando los nmeros combinatorios m sobre n que son los coeficientes en el binomio de Newton.
>
binomial(6,2);
Para ver la frmula con la que trabaja binomial podemos usar de nuevo convert .
>
convert(binomial(m,n),factorial);
### WARNING: combinat[choose] with numeric first parameter now returns a sorted list rather than a set choose({Maria, Juan, Eva, Luis, Teresa, Pablo},2);
Obsrvese que el resultado es un conjunto. Si a las funciones numbcomb y choose no se les da el segundo argumento, hacen el clculo correspondiente a todos los valores desde cero hasta el nmero de elementos del conjunto.
>
Que es el cardinal del conjunto partes de {Mara , Juan , Eva , Luis , Teresa, Pablo} formado por todos sus subconjuntos.
>
2^6;
### WARNING: combinat[choose] with numeric first parameter now returns a sorted list rather than a set choose({Maria, Juan, Eva, Luis, Teresa, Pablo});
LibroMaple03.html
>
randcomb({chocolate,vainilla,fresa,limon},2);
>
randcomb(5,3);
>
En el ltimo caso se eligen al azar tres nmeros del conjunto {1,2,3,4,5} . De nuevo, como en el caso de las permutaciones, si queremos que haya elementos repetidos los datos deben introducirse como una secuencia.
>
### WARNING: combinat[choose] with numeric first parameter now returns a sorted list rather than a set choose([a,b,a],2);
>
numbcomb([a,b,a],2);
Observa que stas no son las combinaciones con repeticin de 2 elementos tomadas de dos en dos, que son por la frmula vista en clase:
>
binomial(2+2-1,2);
Ya que en las combinaciones elegidas arriba, falta la pareja (b,b) . Se puede introducir una funcin en dos variables que permita calcular el nmero de combinaciones con repeticin de m elementos tomadas de n en n .
>
CR:=(m,n)->binomial(m+n-1,n);
>
CR(2,2);
>
Variaciones
Vamos a construir una frmula para las variaciones y para las variaciones con repeticin. Como las combinaciones de m elementos tomadas de n en n son el cociente de las variaciones de m elementos tomadas de n en n por las permutaciones de n , la frmula oportuna ser:
>
V:=(m,n)->binomial(m,n)*n!;
>
V(3,5);
>
V(3,3);
O como un procedimiento:
>
V2:=proc(m,n)
LibroMaple03.html
local s,i: if n>m then s:=0 else s:=1: for i from 0 to n-1 do s:=s*(m-i): od: fi: s; end:
>
V2(5,3); V2(5,10);
Y tambin podemos construir una frmula para las variaciones con repeticin:
>
VR:=(m,n)->m^n;
>
VR(2,3);
Y dado un conjunto de m elementos podramos disear un procedimiento que construyera primero todas las combinaciones de n elementos con el comando choose , y luego hiciera todas las permutaciones para cada una de estas combinaciones. El resultado es el conjunto de todas las variaciones de m elementos tomados de n en n , esto es, las listas ordenadas de n elementos en un conjunto de m elementos.
>
variaciones:=proc(A,n) local C,D,i: ### WARNING: combinat[choose] with numeric first parameter now returns a sorted list rather than a set C:=[op(choose(A,n))]: D:={}: for i from 1 to nops(C) do D:= D union {op(permute([op(C[i])]))}: od: D; end:
variaciones({a,b,c,d},3);
is(nops(variaciones({a,b,c,d,e},3))=V(nops({a,b,c,d,e}),3));
Otros ejemplos:
>
variaciones({1,2,3},2);
> >
variaciones({p,q,r,s,t,u,v},7): is(nops(%)=7!);
>
LibroMaple03.html
partition(10);
Es decir, ha encontrado todas las maneras en que 10 se puede poner como suma de nmeros naturales menores o iguales que 10. Para contarlas se usa:
>
numbpart(10);
nops(partition(10));
randpart(10);
randpart(10);
>
with(combinat): evalf(binomial(154,3)*(1/3)^3*(2/3)^(151));
evalf(add(binomial(154,i)*(1/3)^i*(2/3)^(154-i),i=0..75));
La respuesta correcta es la c). 3. Con el mismo enunciado del primer problema, calcula el mnimo nmero de veces que se ha de repetir el experimento para que la probabilidad de obtener al menos 1 xito sea mayor que 0.75:
>
LibroMaple03.html
>
seq([n,evalf(1-(2/3)^n)],n=1..10);
La respuesta correcta es la a). 4.- Sea el experimento aleatorio extraer una bola de un bombo con bolas numeradas del 1 al 100 todas ellas iguales. Dada una variable aleatoria X definida sobre el espacio muestral de este experimento de forma que X(s)=s^2, su valor esperado (o esperanza matemtica) es:
> >
evalf(add(s^2/100,s=1..100));
5.- La probabilidad de extraer un nmero primo en una urna que contiene los nmeros enteros entre el 1 y el 5000 es:
> >
c:=0; for i from 1 to 5000 do if isprime(i) then c:=c+1 fi; od; evalf(c/5000);
La respuesta correcta es la c). 6.- Sea el conjunto de pares de palabras (p,q) donde la palabra p es una palabra de 9 letras que se obtiene permutando las letras de la palabra abracadabra . Cul es la probabilidad de que al elegir una de ellas sea justamente la palabra (cocodrilo,abracadabra)?:
> >
cocodrilo
evalf(1/(numbperm([c,o,c,o,d,r,i,l,o])*numbperm([a,b,r,a,c,a,d,a,b,r,a])));
La respuesta correcta es la b). 7.- De cuantas maneras se pueden sentar 11 personas en dos mesas, una de 6 comensales y otra de 5 comensales, teniendo en cuenta tanto la distribucin en las dos mesas, como el orden en cada mesa:
> >
binomial(11,6)*6!*5!;
La respuesta correcta es la c). 8.- Cual es el menor valor de n para el cual la probabilidad de que dos personas en un grupo de n personas cumplan los aos el mismo da es mayor que 0.75?
> >
f:=n->1-(binomial(365,n)*n!/365^n);
>
seq([n,evalf(f(n))],n=30..40);
LibroMaple03.html
La respuesta correcta es la a). 10.- De los nmeros naturales menores o iguales que 10.000 cuntos mltiplos de 5 no son mltiplos de 7.
> >
evalf(10000/7);
>
La respuesta correcta es la b)
>
restart: with(combinat):
Warning, the protected name Chi has been redefined and unprotected
2.- Determinar cuntos subconjuntos de menos de 5 elementos (de 0 a 4 elementos) tiene el conjunto
> >
E:={a,b,c,d,f,e,r,t,y,n,l}:
nops(E);
>
c:=binomial(11,0):
LibroMaple03.html
>
La respuesta correcta es la c). 3.- Dado un conjunto de 54 personas hay que elegir un delegado, un subdelegado y un vocal. De entre los restantes hay que elegir a 3 personas para que les acompaen. Determinar cuntas posibles delegaciones hay. a) 3099889800 b) c) 3099889800
>
54*53*52*binomial(51,3);
>
La respuesta correcta es la b). 4.- Sea una urna que contiene los nmeros del 1 al 10000. Se extraen dos bolas consecutivamente, reintroduciendo en la urna la bola extrada. Determinar la probabilidad de que ambas bolas sean nmeros primos. a) 0.02145 b) 0.01510 c) 0.01234
>
>
evalf((1229/10^4)^2);
>
La respuesta correcta es la b). 5.- Sea un conjunto de 357 personas. Sea el experimento aleatorio: seleccionar tres personas. Sea el suceso S: las tres personas son rubias. Determinar el nmero mnimo de personas que han de ser rubios para que la probabilidad de S sea mayor o igual que 1/3. a) 248 b) 348 c) 249
>
restart: with(combinat):
Warning, the protected name Chi has been redefined and unprotected
>
p:=n->binomial(n,3)/binomial(357,3);
>
LibroMaple03.html
>
>
La respuesta correcta es la a). 6.- Determinar el nmero de palabras que se pueden construir permutando las letras de la palabra semaforos. a) 90721 b) 91720 c) 90720
>
numbperm([s,e,m,a,f,o,r,o,s]);
>
La respuesta correcta es la c). 7.- Sean los conjuntos A y B descritos abajo. Determinar cuntos subconjuntos de 3 elementos comparten A y B. a) 120 b) 130 c) 134
> >
A:={1,2,3,4,5,e,r,t,y,u,i,o,p}: B:={1,2,3,4,5,e,r,t,g,y,u,h,j,l}: ### WARNING: combinat[choose] with numeric first parameter now returns a sorted list rather than a set ### WARNING: combinat[choose] with numeric first parameter now returns a sorted list rather than a set nops(choose(A,3) intersect choose(B,3));
>
### WARNING: combinat[choose] with numeric first parameter now returns a sorted list rather than a set nops(choose(A intersect B,3));
>
La respuesta correcta es la a). 8.- Cuntos nmeros se pueden representar en el sistema binario con 10 dgitos. a) Menos de 1000 b) Ms de 1500 y menos de 2000 c) Ms de 1000 y menos de 1100
>
2**10;
>
LibroMaple03.html
9.- Sea un alfabeto con 27 letras. Determinar cuntos cdigos alfanumricos (formados por nmeros y letras) de 7 smbolos se pueden establecer, sabiendo que los dos primeros smbolos han de ser letras y los dos ltimos han de ser nmeros. a) b) c)
>
27*27*37*37*37*10*10;
>
La respuesta correcta es la c). 10.- Dados dos nmeros naturales m y n decimos que m es ascendente de n si se verifica que
>
m**3=n**2;
por ejemplo 1 es ascendente de 1 y 4 es ascendente de 8. Determinar la probabilidad de que al escoger aleatoriamente un nmero m menor o igual que 1000 exista n menor o igual que 1000 tal que m sea ascendente de n . a) 0.01 b) 0.11 c) 0.21
>
c:=0: for m from 1 to 1000 do for n from 1 to 1000 do if m^3=n^2 then c:=c+1: fi: od: od: evalf(c/1000);
restart;with(combinat):V:=(m,n)-> binomial(m,n)*n!;
Warning, the protected name Chi has been redefined and unprotected
>
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]
LibroMaple03.html
V(10,4);
2) Determinar el nmero de palabras que se pueden construir permutando las letras de la palabra ALESSANDRA. a) b) c)
>
restart;with(combinat): numbperm([A,L,E,S,S,A,N,D,R,A]);
Warning, the protected name Chi has been redefined and unprotected
restart;with(combinat): binomial(26,25);
Warning, the protected name Chi has been redefined and unprotected
4) Sea un alfabeto con 27 letras. Determinar cuantas contraseas alfanumricas (formadas por nmeros y letras, distinguiendo maysculas y minsculas) de 8 smbolos se pueden establecer, sabiendo que los tres primeros smbolos han de ser letras y los dos ltimos han de ser nmeros. a) b) c)
>
54*54*54*64*64*64*10*10;
5) Sean S y S' dos sucesos de un mismo espacio muestral tales que: p(S)=0.5, p(S')=0.8 y p(S|S')=0.6.
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]
LibroMaple03.html
Se verifica que: a) la probabilidad de S interseccin con S' es 0.4 b) S y S' no son sucesos independientes. c) S y S' son sucesos independientes. Si S y S' fuesen independientes, p(S|S') sera igual a p(S) y la probabilidad de S interseccin con S' sera igual a
>
0.5*0.8;
6) Calcular la probabilidad de que un nmero natural menor o igual a 10000 sea un cubo de un nmero natural y congruente con 3 mdulo 5. a)
b)
c)
>
restart;with(combinat):
Warning, the protected name Chi has been redefined and unprotected
>
floor(10^(4/3));
>
A:={seq(i^3,i=1..21)}:nops(A);
>
solve(3+5*k<=10^4,k);
>
floor(9997/5);
>
B:={seq(3+5*k,k=0..1999)}:nops(B);
>
>
LibroMaple03.html
7) Tomamos una urna con bolas de distintos colores. Si la urna contiene 32 bolas y extraemos 5 bolas, determinar el nmero mnimo de bolas rojas en la urna para que la probabilidad de que las cinco bolas extradas sean todas rojas sea al menos 1/5. a) 24 b) 34 c) 25
>
restart: with(combinat):
Warning, the protected name Chi has been redefined and unprotected
>
p:=n->binomial(n,5)/binomial(32,5);
>
>
evalf(1/5);evalf(p(23)); evalf(p(24));
8) Sea el experimento aleatorio consistente en el tirar dos dados consecutivamente. Calcular la probabilidad que la suma de los resultados de ambos dados sea 7. a)
b)
c)
> >
restart;with(combinat): suma:=partition(7);
Warning, the protected name Chi has been redefined and unprotected
>
c:=0: suma2:=[]: for i from 1 to nops(suma) do if nops(suma[i])=2 then suma2:=[op(suma2),suma[i]]: c:=c+1; fi: od; c;suma2;
LibroMaple03.html
> >
p:=6/36;
9) Sea un experimento de Bernoulli con probabilidad de xito p=1/4. Calcula la probabilidad de obtener exactamente 53 xitos al repetir el experimento 200 veces. La respuesta es:
> >
restart;with(combinat):
Warning, the protected name Chi has been redefined and unprotected
>
evalf(binomial(200,53)*((1/4)^53)*((3/4)^(147)));
10) La probabilidad de extraer un nmero relativamente primo con 567 de una urna que contiene los nmeros enteros entre el 1 y el 567 es:
> >
restart;with(combinat):with(numtheory):
Warning, the protected name Chi has been redefined and unprotected
Warning, the protected name order has been redefined and unprotected
>
phi(567)/567;
Prctica 4
Matemtica Discreta
PRCTICA 4
GRAFOS y RBOLES
LibroMaple03.html
Instrucciones
1. Lee con atencin el texto. Cuando aparezcan lneas de input de comandos intenta averiguar para qu sirven (puedes emplear la ayuda de Maple) y despus ejectalos. Puedes ejecutarlos varias veces y cambiar en ellos lo que te parezca para entenderlos mejor o mejorarlos. 2. Haz los ejercicios propuestos, pues los necesitars para la resolucin de las preguntas del test de evaluacin.
restart; with(networks);
Para definir un grafo, definimos en primer lugar una variable con su nombre. Terminamos la sentencia con dos puntos, porque si ponemos un punto y coma la salida es larga y no aporta nada (puedes comprobarlo t mismo).
>
G1:=new():
addvertex({Mostoles,Alcorcon,Fuenlabrada,Vicalvaro,Pozuelo},G1);
Ahora aadimos las aristas como subconjuntos de dos elementos y entonces estamos trabajando con grafos simples . El programa las asigna ciertos nombres de la forma ei :
>
addedge({{Mostoles,Alcorcon},{Mostoles,Fuenlabrada},{Alcorcon,Fuenlabrada},{Fuenlabrada,Vicalvaro},{Alcorcon,Pozuelo},{Vicalvaro,Pozuelo},{Alcorcon,Vicalvaro}},G1);
Para saber cules son las aristas de nuestro grafo utilizamos el comando ends o edges :
>
ends(G1); edges(G1);
draw(G1);
LibroMaple03.html
Para saber si dos vrtices son los extremos de una arista y recuperar la notacin con la que se las denomina, se emplea el comando edges :
>
Tambin podemos pintar el grafo con unos vrtices a la izquierda y los dems a la derecha (como si se tratara de un grafo bipartido) usando el siguiente comando Linear([...], [...]):
>
draw(Linear([Mostoles,Alcorcon],[Fuenlabrada,Vicalvaro,Pozuelo]),G1);
vertices(G1);
LibroMaple03.html
vdegree(Mostoles,G1);
Si quisiramos trabajar con digrafos, las aristas deben ser un conjunto de pares ordenados:
>
El dibujo no muestra la orientacin de las aristas, ni si hay dos aristas uniendo los mismos vrtices:
>
draw(D1);
Para introducir aristas mltiples , tanto en grafos dirigidos como no dirigidos, basta cambiar el tipo de datos de las aristas: de conjunto a lista. Para introducir lazos basta escribirlos.
>
LibroMaple03.html
draw(M1);
Maple ya lleva incorporados algunos grafos especiales como los grafos completos, los ciclos, los n-cubos, el grafo de Petersen (no visto en clase, mira cmo es ms abajo), los bipartidos completos, etc.
>
draw(complete(5));
>
draw(cycle(7));
LibroMaple03.html
>
draw(cube(3));
>
draw(petersen());
LibroMaple03.html
>
draw(complete(2,6));
>
draw(complete(2,5));
LibroMaple03.html
>
draw(Linear([1,2],[3,4,5,6,7]),complete(2,5));
A lo largo del tema hemos visto varias formas de representar un grafo. Para recuperar una matriz de adyacencia y una matriz de incidencia de un grafo se pueden utilizar los siguientes comandos:
>
adjacency(complete(4));
>
incidence(complete(4));
LibroMaple03.html
>
adjacency(G1);
Conexin
El comando components permite recuperar las componentes conexas de un grafo. Al emplearlo, podemos observar fcilmente si dos vrtices dados estn conectados o no por un camino: deben pertenecer a la misma componente conexa.
> > > >
>
draw(G2);
Tambin se podra disear un procedimiento que usa la matriz de adyacencias para saber si el grafo es o no conexo. Esto lo proponemos como ejercicio al final de la prctica.
degreeseq(G2);
LibroMaple03.html
Euleriano:=proc(G::graph) local c,i,r: c:=degreeseq(G):i:=1: while i<nops(c)+1 do if (c[i] mod 2)<>0 then i:=nops(c)+2: else i:=i+1: fi: od: if i=nops(c)+2 then r:="no euleriano": else r:="euleriano": fi: r; end:
Euleriano(cycle(5));
>
Euleriano(complete(4));
>
Euleriano(complete(5));
>
Como ya comentamos en clase, no tenemos una caracterizacin de los grafos hamiltonianos. El problema es complicado computacionalmente hablando, incluso para grafos relativamente pequeos. An as, cabra pensar en utilizar "la fuerza bruta" creando un algoritmo que vaya construyendo todos los posibles circuitos hamiltonianos, utilizando para ello todas las posibles permutaciones de los vrtices.
Grafos etiquetados
Para definir con Maple un grafo en el que cada arista tiene asignado una etiqueta (tiempo, distancia, coste, etc.) se emplea la opcin weights del comando addedge . Observa que las aristas deben entrar como una lista:
>
draw(G3);
LibroMaple03.html
Pero el comando eweight (edge weight) recupera el peso de cada una de sus aristas.
>
eweight(e1,G3);
>
El algoritmo de Dijkstra
El algoritmo de Dijkstra permite hallar el camino ms corto (en el sentido de que la suma de los pesos de las aristas que recorre es mnima) entre dos vrtices de un grafo en el que cada arista tiene asociado un peso (que representa la distancia, el tiempo, el coste... entre los vrtices que une). Este algoritmo est implementado en el comando shortpathtree y calcula, para cada vrtice, la longitud del camino mnimo entre este vrtice y el resto de los vrtices, asignando este valor (la longitud del camino mnimo entre el vrtice fijado y cada uno de los dems) como peso a cada vrtice. Por ello, para obtener la distancia mnima entre dos vrtices de un grafo etiquetado, emplearemos el comando vweight (vertex weight).
>
A1:=shortpathtree(G3,a): draw(A1);
>
LibroMaple03.html
Ahora, para hallar la distancia mnima entre cualquier vrtice y el vrtice a utilizaremos el comando vweight :
>
vweight(z,A1);
>
vweight(y,A1);
>
vweight(d,A1);
Matrices
Para trabajar con matrices Maple presenta la librera linalg sobre la que se abundar en la asignatura de lgebra. De momento nos vamos a iniciar en los rudimentos para poder trabajar con las matrices de adyacencia e incidencia de un grafo.
>
with(linalg):
Warning, the protected names norm and trace have been redefined and unprotected
Para definir una matriz se utiliza el comando matrix y la entrada se forma como una lista de listas (la lista de las filas de la matriz) :
>
A:= matrix([[1,-alpha,2/3],[-1,0,1],[beta/3,2,-1]]);
matrix(3,3,[1,-alpha,2/3,-1,0,1,beta/3,2,-1]);
transpose(A);
Podemos sumar y restar matrices. Para que la matriz resultado se escriba en pantalla se usa evalm .
>
B:= matrix([[1,2,1],[1,1,0],[-1,0,1]]);
LibroMaple03.html
>
A+B;
>
evalm(A+B);
Tambin es posible multiplicar matrices utilizando Maple. Se puede usar el comando multiply o el producto &* . Se reserva el smbolo * para producto por escalares .
>
C:= multiply(A,B);
>
evalm(A&*B);
>
evalm(A^3);
>
F:=evalm(B^7);
LibroMaple03.html
Una matriz se almacena como una lista de listas. Para recuperar la entrada (i,j) de la matriz C escribiremos C[i,j] . Por ejemplo:
>
F[3,3];
Tambin es posible recuperar el nmero de filas y el nmero de columnas de una matriz, empleando los comandos rowdim y coldim . Por ejemplo:
>
rowdim(F);coldim(F);
Hay muchas otras funciones en la librera de lgebra lineal pero las que hemos presentado son suficientes para realizar esta prctica.
>
restart; with(networks):
G:=complete(9): nops(vertices(G));
>
nops(edges(G));
1.2. Escribir un procedimiento que calcule la sucesin de los grados de un grafo. Recordar que esto lo hace la funcin degreeseq , aunque no necesariamente en el orden que hemos introducido los vrtices:
> > > >
LibroMaple03.html
>
degreeseq(H);
Si quisiramos preestablecer un orden sobre los vrtices, los convertimos en lista y tomamos la sucesin de los grados. As sabemos exactamente a qu ordenacin corresponde la sucesin de los grados:
>
L:=[op(vertices(H))]; vdegree(L[1],H);
>
>
1.3. Escribir un procedimiento que calcule la suma de los grados de todos los vrtices de un grafo. Simplemente sumar los elementos de la lista que da degreeseq. 1.4. Emplearlo para verificar que dicha suma es siempre el doble del nmero de aristas del grafo. 1.5. Escribir un procedimiento que calcule el nmero de vrtices con grado impar de un grafo.
2. Matrices de adyacencia
2.1. Define un procedimiento que convierta una matriz cuadrada A de ceros y unos en un grafo cuya matriz de adyacencia sea A . Se trata de tomar la matriz de ceros y unos y construir un grafo que tiene como vrtices un conjunto del tamao de la matriz y donde {i,j} es una arista si y solamente si A[i,j]=1 .
>
restart; with(linalg):with(networks):
Warning, the protected names norm and trace have been redefined and unprotected
Para construir los vrtices se puede hacer el siguiente procedimiento que toma el tamao n de la matriz y como conjunto de vrtices {1,2,..., n} :
>
LibroMaple03.html
Vertices(matrix(2,2,[0,1,1,0]));
Aristas:=proc(A::matrix) local L,i,j: L:={}: for i from 1 to rowdim(A) do for j from 1 to coldim(A) do if A[i,j]=1 then L:=L union {{i,j}}: fi: od: od: L; end: Aristas(matrix(2,2,[0,1,1,0]));
>
>
Veamos por ejemplo el grafo completo K5 . Su matriz tiene todas las entradas iguales a 1 salvo la diagonal:
>
M:=matrix(5,5,[0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,1,0]);
LibroMaple03.html
>
draw(grafo(M));
M:=matrix(4,4,[0,1,0,0,1,0,1,1,0,1,0,0,0,1,0,0]);
draw(grafo(M));
LibroMaple03.html
>
3. Conexin
3.1. Define un procedimiento Maple para averiguar si un grafo es conexo.. 3.2. Haz lo mismo que en el ejercicio anterior, pero considerando ahora que el dato de entrada ser la matriz de adyacencia del grafo.
. (Se recomienda crear un procedimiento para contar las entradas no nulas de una matriz). Respuesta:
>
LibroMaple03.html
>
>
>
384+18;
restart; with(linalg): A:=matrix([[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1], [1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0], [1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0], [1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0], [1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1], [1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1], [1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0], [1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0], [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0]]);
Warning, the protected names norm and trace have been redefined and unprotected
> >
Es conexo porque todos los vrtices son adyacentes con el primero. Como todos los vrtices son de grado par, es euleriano. La respuesta es la c). 6.- Siendo G el grafo cuya matriz de adyacencia es la matriz A de la cuestin nmero cuatro Cuntos caminos de longitud 3 hay entre el primer y el tercer vrtice?
> >
evalm(A^3)[1,3];
LibroMaple03.html
> >
El primer vrtice es adyacente con todos los dems por tanto hay 10 caminos no simples de longitud 3 de la forma (1a13). Por otro lado el tercer vrtice es adyacente con otros 4 por tanto hay otros 4 caminos no simples de longitud 3 de la forma (13b3). Observar que no hay ms caminos no simples y que (1313) est siendo contado 2 veces.
>
25-13;
with(networks): G:=new():
>
addvertex({1,2,3,4,5,6,7,8,9},G);
>
addedge({{1,2},{1,3},{2,4},{2,5},{3,6},{3,7},{7,8},{7,9}},G);
>
draw(G);
> >
Es un rbol. Respuesta a). 10.- Cuntos vrtices de grado impar tiene la unin disjunta
>
Los vrtices de cada uno de los grafos del enunciado son de grado 4, por tanto respuesta c).
LibroMaple03.html
Warning, the protected names norm and trace have been redefined and unprotected
>
M:=matrix([[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1], [0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1], [0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1], [1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1], [1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0], [1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1], [1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0], [0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1], [0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1], [0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1], [0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0], [1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1], [1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0], [1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0], [1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0], [0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1], [1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0], [1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1], [0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1], [0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1], [1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1], [0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0], [0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0], [0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1], [0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0], [1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0], [0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1], [0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1], [1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1], [0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0], [1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1], [1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0], [1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0], [0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1], [1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1], [0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1], [0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1], [0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0]]):
1.-Sea un grafo simple G una de cuyas matrices de ayacencias es M: a) G tiene 50 vrtices y 601 aristas. b) G tiene 40 vrtices y 550 aristas. c) G tiene 50 vrtices y 400 aristas. El nmero de vrtices de G es el nmero de filas (o de columnas) de M:
>
rowdim(M);
Para calcular el nmero de aristas recordamos que la suma de los grados de los vrtices (esto es el nmero de unos en M) es el doble del nmero de aristas:
>
S:=0: for i from 1 to 50 do: for j from 1 to 50 do: S:=S+M[i,j]: od: od: S/2;
>
Por tanto tiene 601 aristas. La respuesta correcta es la a). 2.- Determinar el grado del vrtice tercero en la ordenacin de los vrtices que define la matriz M. a) 32 b) 54 c) 20 El grado del vrtice tercero es la suma de los elementos de la fila (o columna) tercera
>
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]
LibroMaple03.html
>
La respuesta correcta es la c). 3.- Determinar el nmero de caminos de longitud 3 que hay entre el vrtice 40 y el 50 del grafo G. a) 309 b) c) 290 La matriz M^3 es la que contiene dicha informacin:
>
evalm(M^3)[40,50];
>
evalm(M^3)[50,40];
La respuesta correcta es la b) 4.- El grafo G verifica a) es conexo b) tiene dos componentes conexas c) no se puede saber si es conexo o no Tomamos la matriz al cuadrado, si no tiene entradas no nulas entonces todo par de vrtices est unido por un camino de longitud 2 con lo que el grafo es conexo.
> >
C:=evalm(M^2): S:=0: for z from 1 to 50 do for t from 1 to 50 do if C[z,t]=0 then S:=S+1: fi: od: od: S;
>
La respuesta correcta es la a). 5.- El grafo G verifica: a) es un rbol b) no es un rbol porque es no conexo c) no es un rbol porque contiene ciclos Como un rbol de n vrtices tiene n-1 aristas y G es conexo (con 50 vrtices y 600 aristas) entonces la respuesta correcta es la c). 6.- El grafo completo K6 verifica . a) es conexo tiene 6 vrtices y 15 aristas, el grado de cada vrtice es 6. b) es conexo tiene 6 vrtices y 15 aristas, el grado de cada vrtice es 5.
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]
LibroMaple03.html
restart;with(networks): nops(vertices(complete(6)));
>
nops(ends(complete(6)));
>
degreeseq(complete(6));
>
components(complete(6));
7.- Sea el grafo simple H definido arriba. Dicho grafo verifica: a) es conexo b) no es conexo porque tiene tres componentes conexas c) no es conexo porque tiene ocho componentes conexas
>
draw(H);
Vemos con el dibujo que es no conexo. Podemos computar el nmero de sus componentes conexas.
>
nops(components(H));
LibroMaple03.html
>
La respuesta correcta es la c). 8.- El grado del vrtice de mayor grado de H y el del de menor grado son respectivamente: a) 6 y 0 b) 7 y 0 c) 5 y 0
>
degreeseq(H);
>
La respuesta correcta es la a). 9.- Sea el subgrafo L de H que forma la componente conexa con mayor nmero de vrtices. a) L es euleriano b) L no es euleriano porque es no conexo c) L no es euleriano
>
components(H);
Tomo la componente que tiene el mayor nmero de vrtices. Construyo un nuevo grafo L con dichos vrtices y con todas las aristas de H salvo la {8,9} que es la nica que est en otra componente conexa. Este grafo L es por definicin conexo.
> > > >
L:=new(): addvertex({3, 26, 22, 24, 20, 21, 16, 17, 19, 13, 14, 15, 10, 11, 12, 6, 7, 1, 2, 4, 5, 29},L): addedge({{1,2},{1,4},{3,2},{5,6},{21,12},{21,22},{4,20},{1,7},{1,5},{1,20},{3,24},{21,3},{11,24},{15,26},{16,20},{10,20},{1,29},{21,6},{11,4},{13,22},{15,16},{17,19},{19,20},{14,7},{13,7}},L): degreeseq(L);
> >
Como hay vrtices de grado impar la respuesta correcta es la c). 10.- Determina el nmero de vrtices de grado impar de L. a) L tiene 10 vrtices de grado impar b) L tiene 11 vrtices de grado impar c) L tiene 12 vrtices de grado impar La respuesta correcta es la a).
>
S:=0: for k from 1 to nops(vertices(L)) do if degreeseq(L)[k] mod 2<>0 then S:=S+1: fi: od: S;
>
LibroMaple03.html
>
Warning, the protected names norm and trace have been redefined and unprotected
A:=matrix([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]):
>
1. Sea el grafo simple G=(V,E) una de cuyas matrices de adyacencias es A. a) G tiene 45 vrtices y 506 aristas. b) G tiene 60 vrtices y 206 aristas. c) G tiene 45 vrtices y 1012 aristas.
>
rowdim(A);
>
s:=0: for i from 1 to rowdim(A) do for j from i to coldim(A) do s:=s+A[i,j]: od: od: s;
>
La respuesta correcta es la a). 2. El grafo G verifica: a) tiene 23 vrtices de grado impar. b) tiene 22 vrtices de grado impar. c) tiene 24 vrtices de grado par.
>
LibroMaple03.html
>
>
La respuesta correcta es la b). 3. El nmero de caminos de longitud 27 uniendo el vrtice 1 y el 22 del grafo G es a) b) 1 c) 0
>
evalm(A^27)[1,22];
>
La respuesta correcta es la c). 4. Sealar la respuesta correcta: a) el grafo G es conexo. b) el grafo G tiene dos componentes conexas. c) el grafo G tiene ms de tres componentes conexas .
>
Vertices:=proc(A::matrix) local L,i: L:={}: for i from 1 to rowdim(A) do L:=L union {i}: od: L; end: Aristas:=proc(A::matrix) local L,i,j: L:={}: for i from 1 to rowdim(A) do for j from 1 to rowdim(A) do if A[i,j]=1 then L:=L union {{i,j}}: fi: od: od: L; end: grafo:=proc(A::matrix) local G: G:=new(): addvertex(Vertices(A),G): addedge(Aristas(A),G): G; end: G:=grafo(A): nops(components(G));
>
>
> >
>
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]
LibroMaple03.html
La respuesta correcta es la a). 5. Determinar el nmero de caminos simples de longitud 3 entre el vrtice 1 y el vrtice 45 del grafo G. a) 462 b) 506 c) 461 El nmero total de caminos de longitud 3 es:
>
evalm(A^3)[1,45];
A[1,45];
De esta forma, estamos contando el camino 1(45)1(45) dos veces: cuando a = 45 y cuando b=1. El nmero de caminos simples es
>
506-23-22+1;
La respuesta correcta es la a)
>
6. El grafo G a) es bipartido no completo. b) es bipartido completo. c) no es bipartido. La sucesin de los grados de los vrtices de G es:
>
degreeseq(G);
LibroMaple03.html
y tener
22*23;
L:=[op(vertices(G))];
j:=1: for i from 1 to 45 do if vdegree(L[i],G)=22 then a[j]:=L[i]; j:=j+1; fi; od; s1:=seq(a[i],i=1..23);
>
>
j:=1: for i from 1 to 45 do if vdegree(L[i],G)=23 then b[j]:=L[i]; j:=j+1; fi; od; s2:=seq(b[i],i=1..22);
>
draw(Linear([s1],[s2]),G);
LibroMaple03.html
>
8. Supongamos que los vrtices de G son numerados siguiendo el orden que marca la matriz de adyacencias A de G. Sea el grafo simple H=(W,F) donde:
>
W:={3,5,9,45};
>
F:={[3,5],[5,45],[9,45]};
a) el grafo resultado de unir G y H tiene 1 arista ms que G. b) el grafo resultado de unir G y H tiene 3 aristas ms que G. c) el grafo resultado de unir G y H tiene las mismas aristas que G.
>
LibroMaple03.html
9. Sea el grafo completo K2. El producto cartesiano GxK2 tiene a) 90 vrtices y 506 aristas. b) 45 vrtices y 1012 aristas. c) 90 vrtices y aristas.
Como el conjunto de vrtices del producto cartesiano es el producto de los correspondientes conjuntos de vrtices, tiene 90 elementos. Si G=(V,E), el cardinal del conjunto de aristas del producto cartesiano es 2|E|+|G| :
>
2*506+45;
10. El grafo G a) tiene 45 vrtices de corte b) no tiene vrtices de corte c) tiene aristas de corte La respuesta correcta es la b).
>
#fin
Prctica 5
Matemtica Discreta
PRCTICA 5
RELACIONES
Introduccin
Instrucciones
En esta prctica emplearemos Maple para trabajar con relaciones binarias en un conjunto. Como sabemos, una relacin binaria en un conjunto A es un subconjunto R del producto cartesiano AxA. Las relaciones se pueden representar de distintas maneras: mediante la definicin, esto es, el par (A,R) formado por el conjunto A y la relacin R subconjunto del producto cartesiano AxA; mediante una grfica en un plano coordenado (donde cada eje est representando el conjunto A); mediante el grafo dirigido (A,R) asociado a la relacin o mediante una matriz de adyacencias de dicho grafo. Cada una de estas representaciones tendr ventajas e inconvenientes a la hora de analizar propiedades de las relaciones. En esta prctica veremos cmo construir cada una de estas representaciones de las relaciones y cmo estudiar ciertas propiedades con dichas representaciones.
Representacin de relaciones
La primera de las representaciones de una relacin que se ha comentado en la introduccin es mediante una grfica (lo que resulta muy habitual cuando hablamos de funciones). Para esta representacin usaremos la funcin plot. Sea por ejemplo la relacin:
>
restart;
LibroMaple03.html
A:={a,b,c,d}; R:={[a,a],[b,b],[c,c],[d,d],[a,b],[b,c],[a,c]};
Para representarla mediante el comando plot, necesitamos valores numricos por lo tanto hacemos la sustitucin de las letras por nmeros
>
N:=subs(a=1,b=2,c=3,d=4,R);
plot([op(N)],x=0..4,y=0..4,style=point);
Si queremos trabajar con la representacin por el grafo dirigido asociado, sencillamente cargamos el paquete que permite trabajar con los grafos:
> > >
>
addedge(R,G);
Recordamos que al pintar el grafo dirigido, maple no representa ni lazos, ni direcciones en las aristas, por lo que la representacin grfica de G no ser muy ilustrativa:
>
draw(G);
LibroMaple03.html
adjacency(G);
Por tanto debemos disear un procedimiento que compute la matriz de adyacencias del digrafo G. Cargamos primero el paquete linalg, que contiene ciertos comandos para trabajar con matrices.
>
with(linalg):
Warning, the protected names norm and trace have been redefined and unprotected
Como la matriz de adyacencias depende de una ordenacin en el conjunto de los vrtices (y para evitar ciertos problemas en cmo maple convierte un conjunto en una lista) el procedimiento se aplicar sobre un par formado por una lista y la relacin. Obsrvese que estamos declarando el tipo de datos en el procedimiento.
>
MatrizRelacion:=proc(D::list,R::set([anything,anything])) local i,j,L; L:=[]; for i from 1 to nops(D) do for j from 1 to nops(D) do if member([[op(D)][i],[op(D)][j]],R) then L:=[op(L),1] else L:=[op(L),0]; fi; od; od; evalm(matrix(nops(D),nops(D),L)); end: M:=MatrizRelacion([a,b,c,d],R);
>
LibroMaple03.html
B:={2,a,3}:
[op(B)];
La lista no ha respetado el orden con que nosotros definimos el conjunto B y la matriz del digrafo puede llevarnos a confusin, por eso hemos elegido que el procedimiento funcione sobre listas en vez de sobre conjuntos. Finalmente supongamos que tenemos un conjunto A ordenado y la matriz que representa una relacin en A con esa ordenacin entonces podemos recuperar la relacin mediante el siguiente procedimiento:
>
RelacionMatriz:=proc(M::matrix(square)) local i,j,R; R:={}; for i from 1 to coldim(M) do for j from 1 to coldim(M) do if(M[i,j]=1) then R:=R union {[i,j]}; fi; od; od; RETURN(R); end:
>
S:=RelacionMatriz(M);
Observamos que no aparece la relacin tal y como la definimos sino sobre el conjunto {1,2,3,4} que es biyectivo con A mediante la aplicacin que ha establecido la propia ordenacin. Para recuperar entonces R
>
subs(1=a,2=b,3=c,4=d,S);
> >
se trata de verificar si toda la diagonal est contenida en la grfica, la grfica p1 es larfica de la diagonal cuya ecuacin es y=x:
LibroMaple03.html
Si vemos la relacin por la definicin, esto es, como un subconjunto del producto cartesiano , se trata de ver si la diagonal est totalmente contenida en R.
>
Diagonal:={seq([[op(A)][i],[op(A)][i]],i=1..nops(A))};
Para comprobar la inclusin tomamos el conjunto resultado de restar a la diagonal el conjunto R y debe ser el conjunto vaco:
>
Diagonal minus R;
Como as ocurre en efecto. Para ver esta propiedad sobre el grafo se trata de comprobar si hay un lazo sobre cada vrtice. Como la grfica que presenta maple del digrafo no representa los lazos, no hay una manera de comprobar la propiedad reflexiva diferente de la conjuntista presentada en el prrafo anterior. Para hacer el anlisis sobre la matriz se trata de ver si la diagonal principal est formada por unos:
>
>
seq(M[i,i],i=1..nops(A));
Mref:=proc(M::matrix) local j,S,r: S:=0: for j from 1 to coldim(M) do S:=S+M[j,j]: od: if S=coldim(M) then r:="reflexiva": else r:="no reflexiva": fi: r; end: Mref(M);
>
LibroMaple03.html
>
Mref(matrix(2,2,[1,0,0,0]));
>
A:={1,2,3,4,5}; R:={[1,2],[2,1],[1,3],[3,1],[4,4],[5,5]};
Que es en efecto una grfica simtrica. Para que sea antisimtrica debe verificarse que el simtrico de cada punto de la nube que no est sobre la diagonal no es un punto de la nube. Para ver que la relacin es simtrica mediante la definicin como subconjunto del producto cartesiano se trata de comprobar que el conjunto S formado por los pares (b,a) donde (a,b) es un elemento de la relacin es igual que R.
>
S:={seq([op(R)[i][2],op(R)[i][1]],i=1..nops(R))};
>
R minus S; S minus R;
Por tanto se tiene la simetra de la relacin. Para comprobar si es antisimtrica el conjunto R interseccin S debe estar contenido en la diagonal.
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]
LibroMaple03.html
> >
Como hay puntos de la interseccin que no estn sobre la diagonal, la relacin no puede ser antisimtrica. Sobre el digrafo se tratara de comprobar: a) para la propiedad simtrica: que cada par de vrtices distintos o no son adyacentes o estn unidos por un par de aristas (cada una dirigida en un sentido); b) para la propiedad antisimtrica que cada par de vrtices distintos o no son adyacentes o estn unidos por una nica arista. Como el grfico de maple no presenta las direcciones de las aristas, no hay nada nuevo con respecto al prrafo anterior Sobre la matriz, para la propiedad simtrica, se trata de comprobar si es una matriz simtrica:
>
M:=MatrizRelacion([1,2,3,4,5],R);
>
with(linalg): evalm(M-transpose(M));
Msim:=proc(M::matrix) local N,S,i,j,r: N:=evalm(M-transpose(M)): S:=0: for i from 1 to rowdim(M) while S=0 do for j from 1 to rowdim(M) do if N[i,j]<>0 then S:=1: fi: od: od: if S=1 then r:="no simetrica" else r:="simetrica" fi: r; end: Msim(M);
>
>
Msim(matrix(2,2,[1,0,1,0]));
Para la propiedad antisimtrica se trata de comprobar que no hay ninguna entrada M[i,j]=M[j,i]=1 con i distinto de j.
>
Mantisim:=proc(M::matrix) local N,S,i,j,r: S:=0: for i from 1 to rowdim(M) while S=0 do for j from 1 to rowdim(M) do if M[i,j]=1 and M[j,i]=1 and i<>j then S:=1: fi: od: od:
LibroMaple03.html
Mantisim(M);
A:=matrix(4,4,[1,1,1,1,0,1,1,1,0,0,1,1,0,0,0,1]);
>
Mantisim(A);
>
Propiedad transitiva
La representacin grfica no aporta ningn mtodo reseable para comprobar la transitividad. Diseemos un procedimiento para comprobar la propiedad transitiva en la definicin conjuntista . Los mtodos que se han presentado para la propiedad reflexiva y para la simtrica se pueden escribir como un procedimiento que opere sobre relaciones y aporte una respuesta afirmativa o negativa a la pregunta sobre si una relacin verifica o no una propiedad. En el libro de referencia se pueden encontrar todos estos procedimientos.
>
Transitiva:=proc(A::list,R::set) local u,v,w; for u from 1 to nops(A) do for v from 1 to nops(A) do for w from 1 to nops(A) do if(member([A[u],A[v]],R) and member([A[v],A[w]],R) and not member([A[u],A[w]],R)) fi; od; od; od; RETURN(true); end: A:=[a,b,c,d]; R:={[a,a],[a,b],[b,a],[b,c],[a,c]};
then RETURN(false);
>
>
Transitiva(A,R);
Para preguntarnos sobre la transitividad de una relacin mirando su matriz, recordamos que dicha matriz A debe cumplir que las entradas no nulas de A^2 son entradas no nulas de A. Por tanto, para razonar sobre la matriz ser til un procedimiento que transforme una matriz M en otra matriz con un uno donde M tiene una entrada no nula y un 0 donde M tiene una entrada nula.
>
Matrizdeunosyceros:=proc(M::matrix) local i,j,Mat; Mat:=matrix(rowdim(M),coldim(M),0); for i from 1 to rowdim(M) do for j from 1 to coldim(M) do if(M[i,j]<>0) then Mat[i,j]:=1; fi; od; od; RETURN(eval(Mat)); end: M:=matrix(3,3,[1,1,1,2,1,3,0,9,4]);
>
LibroMaple03.html
>
Matrizdeunosyceros(M);
M:=matrix(3,3,[1,1,1,0,1,0,0,1,1]);
Matrizdeunosyceros(evalm(M^2));
Mtrans:=proc(M::matrix) local N,S,i,j,r: N:=evalm(M^2): S:=0: for i from 1 to rowdim(M) while S=0 do for j from 1 to rowdim(M) do if N[i,j]<>0 and M[i,j]=0 then S:=1: fi: od: od: if S=1 then r:="no transitiva" else r:="transitiva": fi:r; end: Mtrans(M);
>
Si tomamos la siguiente matriz, cuyo cuadrado tiene entradas no nulas nuevas, el procedimiento debe indicar que no es transitiva:
>
A:=matrix(4,4,[1,1,1,1,0,0,0,0,1,0,1,0,1,0,0,0]);
>
Mtrans(A);
>
evalm(A^2);
LibroMaple03.html
Clausuras
Recordamos que la clausura reflexiva, simtrica o transitiva de una relacin R en un conjunto A es la mnima relacin que contiene a R y verifica la propiedad que se necesite.
Clausura reflexiva
Sea una relacin (A,R) la clausura reflexiva es por tanto el mnimo subconjunto de AxA que contiene a R y a la diagonal {(a,a): a elemento de A}. Por tanto se trata simplemente de la unin de R y dicha diagonal.
>
A:={a,s,d,f}; R:={[a,s],[a,d],[d,d],[d,f],[s,f]};
>
Diagonal:={seq([op(A)[i],op(A)[i]],i=1..nops(A))};
La clausura es la unin:
>
R union Diagonal;
La matriz de la clausura reflexiva se construye completando la diagonal de la matriz de la relacin con un uno en aquellos lugares en que la matriz tenga un cero. Es decir sumando la matriz identidad y luego computando la matriz de unos y ceros.
>
Q:=MatrizRelacion([a,s,d,f],R);
>
I4:=diag(1,1,1,1);
>
Matrizdeunosyceros(evalm(Q+I4));
Clausura simtrica
Sea una relacin (A,R) la clausura simtrica es por tanto el mnimo subconjunto de AxA que contiene a R y al conjunto simtrico de R {(b,a): donde (a,b) es un elemento de R}. Por tanto se trata simplemente de la unin de R y dicho conjunto
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]
LibroMaple03.html
simtrico S
>
A:={a,s,d,f}; R:={[a,s],[a,d],[d,d],[d,f],[s,f]};
>
S:={seq([op(R)[i][2],op(R)[i][1]],i=1..nops(R))};
R union S;
Sobre la matriz se trata de sumar la matriz con su transpuesta y computar la matriz de unos y ceros de dicha suma.
>
Q:=MatrizRelacion([a,s,d,f],R);
>
evalm(Q+transpose(Q));
>
C:=Matrizdeunosyceros(%);
evalm(C-transpose(C));
Clausura transitiva
Sea una relacin (A,R) la clausura transitiva es por tanto el mnimo subconjunto de AxA que contiene a R y verifica la propiedad transitiva.Vamos a centrarnos en los algoritmos que tienen como entrada la matriz de la relacin. El primer algoritmo que presentamos en clase es el que relaciona la transitividad con la conexin, de modo que para calcular la clausura transitiva de una relacin de matriz M (de tamao nxn) hay que tomar las sucesivas potencias de M hasta llegar a la potencia n-sima, sumarlas todas y calcular su matriz de unos y ceros.
>
A:={a,s,d,f,g}; R:={[a,s],[a,d],[d,d],[d,f],[s,f],[f,g],[g,g]};
LibroMaple03.html
>
Q:=MatrizRelacion([a,s,d,f,g],R);
>
Matrizdeunosyceros(evalm(add(Q^n,n=1..5)));
Warshall:=proc(M::matrix) local i,j,k,W,n; W:=matrix(rowdim(M),coldim(M),[seq(seq(M[i,j],j=1...coldim(M)),i=1..coldim(M))]): n:=coldim(M); for k from 1 to n do for i from 1 to n do for j from 1 to n do W[i,j]:=W[i,j]+(W[i,k]*W[k,j]); od; od; od; Matrizdeunosyceros(W); end: Warshall(Q);
>
restart; A:={a,b,c,d,e,f,g,h,i,j};
>
R:={[a,b],[a,c],[b,b],[c,b],[c,c],[a,f],[g,h],[h,i],[h,j],[j,i],[j,a],[a,a],[d,d],[j,f],[e,e],[f,j],[g,g],[j,j],[i,i],[e,b],[e,a],[f,f],[h,h]};
> >
LibroMaple03.html
for j from 1 to nops(D) do if member([[op(D)][i],[op(D)][j]],R) then L:=[op(L),1] else L:=[op(L),0]; fi; od; od; evalm(matrix(nops(D),nops(D),L)); end:
Warning, the protected names norm and trace have been redefined and unprotected
> >
Q:=MatrizRelacion([a,b,c,d,e,f,g,h,i,j],R);
Matrizdeunosyceros:=proc(M::matrix) local i,j,Mat; Mat:=matrix(rowdim(M),coldim(M),0); for i from 1 to rowdim(M) do for j from 1 to coldim(M) do if(M[i,j]<>0) then Mat[i,j]:=1; fi; od; od; RETURN(eval(Mat)); end: M:=Matrizdeunosyceros(evalm(add(Q^n,n=1..10)));
>
>
LibroMaple03.html
seq(Matrizdeunosyceros(evalm(Q+transpose(Q)))[7,i],i=1..10);
M:=matrix(11,11,[0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,1,0,1,0,1,1,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,1,2,1,1,0,0,1,1,0,1,0,1,0,0,0,0,0,1,0,1,1,1,0,1,0,0,0,1,1,1,0,2,0,1,0,1,1,1,1,1,0,0,1,0,0,1,0,1,0,0,1,1,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0]);
>
Como no es una matriz de unos y ceros no puede ser la matriz de una relacin. La respuesta correcta es la c).
>
B:={1,2,3,4,5,6,7,8,9}; S:={[1,1],[1,2],[1,3],[1,4],[5,6],[5,7],[5,8],[1,5],[1,6],[1,7],[1,8],[1,9],[2,2],[2,3],[2,4],[2,8],[2,9],[3,3],[3,4],[3,5],[3,6],[3,7],[3,8],[3,9],[4,4],[4,5],[4,6],[4,7],[4,8],[4,9],[5,5],[5,9],[6,6],[6,7],[6,8],[6,9],[7,7],[7,8],[7,9],[2,5],[2,6],[2,7],[8,8],[8,9],[9,9]};
LibroMaple03.html
N:=Matrizdeunosyceros(M);
>
evalm(Matrizdeunosyceros(evalm(N^2))-N);
> >
Como la diagonal de N est formada por ceros, debemos convertirlos todos en unos, por lo que hay 11 entradas diferentes, la respuesta es la a).
> >
9.- Determinar los valores de a y b en la matriz X definida ms abajo para que la relacin que da X sea transitiva.
>
LibroMaple03.html
>
X:=matrix(4,4,[1,1,a,0,1,1,b,0,0,0,a,1,0,0,1,0]);
>
evalm(X^2);
evalm(X-transpose(X));
restart: with(linalg):
Warning, the protected names norm and trace have been redefined and unprotected
>
M:=matrix([[0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1], [0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1], [0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1], [0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1], [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0], [1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1], [1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0], [0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1], [0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1], [0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0], [0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1], [1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1], [0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0], [1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1], [1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0], [1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0], [1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0], [0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1], [1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0], [1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1], [0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1], [0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1], [1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1], [0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0], [0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0], [0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1], [0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0], [1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0], [0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0], [0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1], [0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0], [0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1], [1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1], [0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0], [1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1], [1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0], [1, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0], [0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1], [1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1], [0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1], [0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 1], [0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0]]):
LibroMaple03.html
1.-Sea un conjunto A y una relacin R en A representada por la matriz M: a) el conjunto A tiene 37 elementos b) el conjunto A tiene 50 elementos c) el conjunto A tiene 100 elementos El cardinal de A es el nmero de filas (o de columnas) de M:
>
rowdim(M);
La respuesta correcta es la b). 2.- La relacin R es: a) simtrica y reflexiva b) simtrica pero no reflexiva c) ni simtrica ni reflexiva Traemos los procedimientos que necesitamos.
>
Mref:=proc(M::matrix) local j,S,r: S:=0: for j from 1 to coldim(M) do S:=S+M[j,j]: od: if S=coldim(M) then r:="reflexiva": else r:="no reflexiva": fi: r; end: Msim:=proc(M::matrix) local N,S,i,j,r: N:=evalm(M-transpose(M)): S:=0: for i from 1 to rowdim(M) while S=0 do for j from 1 to rowdim(M) do if N[i,j]<>0 then S:=1: fi: od: od: if S=1 then r:="no simetrica" else r:="simetrica" fi: r; end: Mref(M); Msim(M);
>
>
La respuesta correcta es la c). 3.- La relacin R es: a) transitiva y antisimtrica b) ni antisimtrica ni transitiva c) antisimetrica y no transitiva Traemos los procedimientos que necesitamos.
>
Mantisim:=proc(M::matrix) local S,i,j,r: S:=0: for i from 1 to rowdim(M) while S=0 do for j from 1 to rowdim(M) do if M[i,j]=1 and M[j,i]=1 and i<>j then S:=1: fi: od: od: if S=1 then r:="no antisimetrica" else r:="antisimetrica" fi: r; end:
LibroMaple03.html
>
Mtrans:=proc(M::matrix) local N,S,i,j,r: N:=evalm(M^2): S:=0: for i from 1 to rowdim(M) while S=0 do for j from 1 to rowdim(M) do if N[i,j]<>0 and M[i,j]=0 then S:=1: fi: od: od: if S=1 then r:="no transitiva" else r:="transitiva": fi:r; end: Mantisim(M); Mtrans(M);
>
La respuesta correcta es la b) 4.- La matriz de la clausura reflexiva de R tiene a) 20 entradas distintas a las de M b) 30 entradas distintas a las de M c) 50 entradas distintas a las de M Contamos el nmero de entradas nulas en la diagonal
>
La respuesta correcta es la c). 5.- La matriz de la clausura simtrica de la relacin R tiene: a) 2 entradas distintas a las de M b) 3 entradas distintas a las de M c) 5 entradas distintas a las de M
>
Matrizdeunosyceros:=proc(M::matrix) local i,j,Mat; Mat:=matrix(rowdim(M),coldim(M),0); for i from 1 to rowdim(M) do for j from 1 to coldim(M) do if(M[i,j]<>0) then Mat[i,j]:=1; fi; od; od; RETURN(eval(Mat)); end: N:=Matrizdeunosyceros(evalm(M+transpose(M))):
>
Vamos a construir un procedimiento para contar el nmero de entradas diferentes entre dos matrices:
>
Entradas:=proc(M::matrix, N::matrix) local S,z,t: S:=0: for z from 1 to coldim(M) do for t from 1 to coldim(M) do if N[z,t]<>M[z,t] then S:=S+1: fi: od: od: S; end: Entradas(M,N);
>
LibroMaple03.html
La respuesta correcta es la a). 6.- Sea el conjunto B y la relacin S definidas abajo. Sea Ct la clausura transitiva de S: a) Ct tiene 28 elementos ms que S b) Ct tiene 32 elementos ms que S c) Ct tiene 64 elementos ms que S
>
B:={1,2,3,4,5,6,7,8,9,0}; S:={[1,1],[1,2],[1,3],[2,2],[2,3],[2,5],[3,3],[3,5],[3,5],[3,6],[4,5],[4,6],[4,7],[5,5],[8,5],[8,6],[8,7],[8,8],[8,9],[9,5],[9,9],[9,6],[0,0],[0,1],[0,5],[8,0],[0,4],[4,0],[7,7],[7,8],[4,3],[4,4],[8,3],[0,1],[1,0]};
MatrizRelacion:=proc(D::list,R::set([anything,anything])) local i,j,L; L:=[]; for i from 1 to nops(D) do for j from 1 to nops(D) do if member([[op(D)][i],[op(D)][j]],R) then L:=[op(L),1] else L:=[op(L),0]; fi; od; od; evalm(matrix(nops(D),nops(D),L)); end: A:=MatrizRelacion([1,2,3,4,5,6,7,8,9,0],S);
>
Se trata entonces de calcular la clausura transitiva y ver el nmero de entradas no nulas nuevas que tiene, lo hacemos mediante el algoritmo de Warshall:
>
Warshall:=proc(M::matrix) local i,j,k,W,n; W:=matrix(rowdim(M),coldim(M),[seq(seq(M[i,j],j=1...coldim(M)),i=1..coldim(M))]): n:=coldim(M); for k from 1 to n do for i from 1 to n do for j from 1 to n do W[i,j]:=W[i,j]+(W[i,k]*W[k,j]); od; od; od; Matrizdeunosyceros(W); end: L:=Warshall(A);
>
LibroMaple03.html
>
Entradas(A,L);
J:=Matrizdeunosyceros(evalm(add(A**i,i=1..10))): Entradas(A,J);
>
La respuesta correcta es la c). 8. Determinar los valores de a y b para que la relacin que representa la siguiente matriz P sea reflexiva:
>
P:=matrix(5,5,[1,1,1,1,a,1,1,1,b,1,a,1,1,1,1,0,0,0,0,0,a,a,a,b,1]);
a) No hay ningn valor de a y b que la haga reflexiva b) cualquier valor de a y b la hacen reflexiva c) a=1, b=1.
LibroMaple03.html
Como
>
P[4,4];
La respuesta correcta es la a). 9. Idem que 8 pero para la propiedad simtrica. a) No hay ningn valor de a y b que la haga reflexiva b) cualquier valor de a y b la hacen reflexiva c) a=1, b=0. Como
>
evalm(P-transpose(P));
tiene entradas no nulas la matriz nunca puede ser simtrica, la respuesta correcta es la a). 10. Idem que 8 pero para la propiedad transitiva. a) No hay ningn valor de a y b que la haga reflexiva b) cualquier valor de a y b la hacen reflexiva c) a=1, b=1. Como:
>
evalm(Matrizdeunosyceros(evalm(P^2))-P);
>
Q:=matrix(5,5,[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1]);
>
evalm(Q^2);
LibroMaple03.html
>
restart: with(linalg):
Warning, the protected names norm and trace have been redefined and unprotected
M:=matrix([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]):
>
1.-Sea un conjunto A y una relacin R en A representada por la matriz M: a) el conjunto A tiene 84 elementos b) el conjunto A tiene 50 elementos c) el conjunto A tiene 45 elementos El cardinal de A es el nmero de filas (o de columnas) de M:
>
rowdim(M);
2.- La relacin R es: a) simtrica y reflexiva b) simtrica pero no reflexiva c) ni simtrica ni reflexiva Traemos los procedimientos que necesitamos.
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]
LibroMaple03.html
>
Mref:=proc(M::matrix) local j,S,r: S:=0: for j from 1 to coldim(M) do S:=S+M[j,j]: od: if S=coldim(M) then r:="reflexiva": else r:="no reflexiva": fi: r; end: Msim:=proc(M::matrix) local N,S,i,j,r: N:=evalm(M-transpose(M)): S:=0: for i from 1 to rowdim(M) while S=0 do for j from 1 to rowdim(M) do if N[i,j]<>0 then S:=1: fi: od: od: if S=1 then r:="no simetrica" else r:="simetrica" fi: r; end: Mref(M); Msim(M);
>
>
3.- La relacin R es: a) transitiva y antisimtrica b) ni antisimtrica, ni transitiva c) antisimtrica y no transitiva Traemos los procedimientos que necesitamos.
>
Mantisim:=proc(M::matrix) local S,i,j,r: S:=0: for i from 1 to rowdim(M) while S=0 do for j from 1 to rowdim(M) do if M[i,j]=1 and M[j,i]=1 and i<>j then S:=1: fi: od: od: if S=1 then r:="no antisimetrica" else r:="antisimetrica" fi: r; end: Mtrans:=proc(M::matrix) local N,S,i,j,r: N:=evalm(M^2): S:=0: for i from 1 to rowdim(M) while S=0 do for j from 1 to rowdim(M) do if N[i,j]<>0 and M[i,j]=0 then S:=1: fi: od: od: if S=1 then r:="no transitiva" else r:="transitiva": fi:r; end: Mantisim(M); Mtrans(M);
>
>
LibroMaple03.html
4.- La matriz de la clausura reflexiva de R tiene a) 0 entradas distintas a las de M b) 45 entradas distintas a las de M c) 40 entradas distintas a las de M Contamos el nmero de entradas nulas en la diagonal
>
5.- La matriz de la clausura simtrica de la relacin R tiene: a) 0 entradas distintas a las de M b) 10 entradas distintas a las de M c) 4 entradas distintas a las de M
> >
Matrizdeunosyceros:=proc(M::matrix) local i,j,Mat; Mat:=matrix(rowdim(M),coldim(M),0); for i from 1 to rowdim(M) do for j from 1 to coldim(M) do if(M[i,j]<>0) then Mat[i,j]:=1; fi; od; od; RETURN(eval(Mat)); end: N:=Matrizdeunosyceros(evalm(M+transpose(M))):
Entradas:=proc(M::matrix, N::matrix) local S,z,t: S:=0: for z from 1 to rowdim(M) do for t from 1 to coldim(M) do if N[z,t]<>M[z,t] then S:=S+1: fi: od: od: S; end: Entradas(M,N);
>
Tambin, se puede utilizar el comando de Maple iszero(B), que determina si una matriz B es la matriz cero:
>
iszero(evalm(M-N));
LibroMaple03.html
>
B:={1,2,3,4,5,6,7,8,9,0}: S:={[1,1],[1,2],[1,3],[2,2],[2,3],[2,5],[3,3],[3,5],[3,5],[3,6],[4,5],[4,6],[4,7],[5,5],[8,5],[8,6],[8,7],[8,8],[8,9],[9,5],[9,9],[9,6],[0,0],[0,1],[0,5],[8,0],[0,4],[4,0],[7,7],[7,8],[4,3],[4,4],[8,3],[0,1],[1,0],[6,6]}:
Sea Ct la clausura transitiva de S. Se verifica que: a) Ct no es reflexiva b) Ct es una relacin de orden total c) Ct no es una relacin de orden
>
B:={1,2,3,4,5,6,7,8,9,0}; S:={[1,1],[1,2],[1,3],[2,2],[2,3],[2,5],[3,3],[3,5],[3,5],[3,6],[4,5],[4,6],[4,7],[5,5],[8,5],[8,6],[8,7],[8,8],[8,9],[9,5],[9,9],[9,6],[0,0],[0,1],[0,5],[8,0],[0,4],[4,0],[7,7],[7,8],[4,3],[4,4],[8,3],[0,1],[1,0],[6,6]};
> >
MatrizRelacion:=proc(D::list,R::set([anything,anything])) local i,j,L; L:=[]; for i from 1 to nops(D) do for j from 1 to nops(D) do if member([[op(D)][i],[op(D)][j]],R) then L:=[op(L),1] else L:=[op(L),0]; fi; od; od; evalm(matrix(nops(D),nops(D),L)); end: A:=MatrizRelacion([1,2,3,4,5,6,7,8,9,0],S);
>
Warshall:=proc(M::matrix) local i,j,k,W,n; W:=matrix(rowdim(M),coldim(M),[seq(seq(M[i,j],j=1...coldim(M)),i=1..coldim(M))]): n:=coldim(M); for k from 1 to n do for i from 1 to n do for j from 1 to n do W[i,j]:=W[i,j]+(W[i,k]*W[k,j]); od; od; od; Matrizdeunosyceros(W); end: L:=Warshall(A);
>
LibroMaple03.html
>
Mref(L);
>
Mantisim(L);
7.- Determinar si existen valores de a y b para que la relacin que representa la siguiente matriz P sea reflexiva:
>
P:=matrix(5,5,[[1,1,a*b,a*b,a],[1,1,1,1,a^3],[a,1,1,a*b,a],[a*b,1,a*b,a,b],[a^2,a*b,a*b,b,1]]):
a) no hay valores de a y b que la hagan reflexiva b) es reflexiva para cualquier valor de a y b c) hay valores de a y b que la hagan reflexiva
>
P:=matrix(5,5,[[1,1,a*b,a*b,a],[1,1,1,1,a^3],[a,1,1,a*b,a],[a*b,1,a*b,a,b],[a^2,a*b,a*b,b,1]]);
8.- Idem que 7 pero para la propiedad simtrica: a) no hay valores de a y b que la hagan simtrica b) es simtrica para cualquier valor de a y b c) existen valores de a y b que la hagan simtrica Como la matriz
>
evalm(P-transpose(P));
LibroMaple03.html
= 0,
=0y
=0 y =1 y
=01 y =1.
9.- Determinar si existen valores de a y b para que la relacin que representa la matriz P de los problemas 7 y 8 sea de equivalencia: a) no hay valores de a y b que la hagan de equivalencia b) es de equivalencia para a=1 y b=0 c) es de equivalencia para a=1 y b=1 Como toda relacin de equivalencia tiene que ser reflexiva, necesariamente tiene que ser relacin es transitiva:
>
=1. Si
la
a:=1;b:=1;P:=matrix(5,5,[[1,1,a*b,a*b,a],[1,1,1,1,a^3],[a,1,1,a*b,a],[a*b,1,a*b,a,b],[a^2,a*b,a*b,b,1]]); Mtrans(P);
Tambin
>
Matrizdeunosyceros:=proc(M::matrix) local i,j,Mat; Mat:=matrix(rowdim(M),coldim(M),0); for i from 1 to rowdim(M) do for j from 1 to coldim(M) do if(M[i,j]<>0) then Mat[i,j]:=1; fi; od; od; RETURN(eval(Mat)); end: evalm(Matrizdeunosyceros(evalm(P^2))-P);
>
LibroMaple03.html
B:=matrix([[1, 0, 0, 0, 1, 0, 0, 0], [0, 1, 1, 1, 0, 1, 1, 1], [0, 1, 1, 1, 0, 1, 1, 1], [0, 1, 1, 1, 0, 1, 1, 1], [1, 0, 0, 0, 1, 0, 0, 0], [0, 1, 1, 1, 0, 1, 1, 1], [0, 1, 1, 1, 0, 1, 1, 1], [0, 1, 1, 1, 0, 1, 1, 1]]):
B:=matrix([[1, 0, 0, 0, 1, 0, 0, 0], [0, 1, 1, 1, 0, 1, 1, 1], [0, 1, 1, 1, 0, 1, 1, 1], [0, 1, 1, 1, 0, 1, 1, 1], [1, 0, 0, 0, 1, 0, 0, 0], [0, 1, 1, 1, 0, 1, 1, 1], [0, 1, 1, 1, 0, 1, 1, 1], [0, 1, 1, 1, 0, 1, 1, 1]]);
>
Mref:=proc(M::matrix) local j,S,r: S:=0: for j from 1 to coldim(M) do S:=S+M[j,j]: od: if S=coldim(M) then r:="reflexiva": else r:="no reflexiva": fi: r; end: Mref(B);
>
>
Msim:=proc(M::matrix) local N,S,i,j,r: N:=evalm(M-transpose(M)): S:=0: for i from 1 to rowdim(M) while S=0 do for j from 1 to rowdim(M) do if N[i,j]<>0 then S:=1: fi: od: od: if S=1 then r:="no simetrica" else r:="simetrica" fi: r; end: Msim(B);
>
>
Mtrans:=proc(M::matrix) local N,S,i,j,r: N:=evalm(M^2): S:=0: for i from 1 to rowdim(M) while S=0 do for j from 1 to rowdim(M) do if N[i,j]<>0 and M[i,j]=0 then S:=1: fi: od: od:
LibroMaple03.html
Mtrans(B);
>
#fin