Vous êtes sur la page 1sur 102

LibroMaple03.

html

Matemtica Discreta
Ingeniera Tcnica en Informtica de Sistemas y Gestin
ESCET

Prcticas y problemas resueltos con Maple V


Prctica 1 Introduccin a la PROGRAMACIN EN MAPLE Introduccin
En la primera prctica de Bases de Matemticas se han introducido los rudimentos de Maple (primeros comandos, sintaxis bsica...), en esta prctica introduciremos las nociones elementales para poder programar con Maple. El objetivo es que tras esta prctica y un poco de ejercicio por parte del alumno se puedan desarrollar los primeros y elementales procedimientos en maple.

Tipos de datos fundamentales


Para programar en Maple, es fundamental manejar los tipos bsicos de datos, como son por ejemplo secuencia , lista y conjunto , sus caractersticas y qu tipos de comandos se pueden aplicar a qu tipo de datos. No entraremos en otros tipos de datos como matrices y arrays. En la ayuda se puede leer la informacin sobre cada uno de los tipos de datos.

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];

El sexto parece una funcin:


>

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;

Para construir la secuencia de los 20 primeros nmeros impares:


>

seq(2*i-1,i=1..20);

O los 10 primeros mltiplos de 3:


>

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);

(1) Qu comando te devuelve el sptimo elemento de sec1?


> > >

(2) Escribe un comando que devuelva una secuencia con once palabras `bien`.
> > >

(3) Otra manera de hacer esto es....


> > >

(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);

>

Para sustituir elementos en una lista se usa el comando subsop


> >

meses:=[enero, febrero, marzo, abril, mayo]: subsop(2=junio,meses);

>

subsop(3=febrero,meses);

Y sirve para borrar elementos de una lista, sustituyendo por NULL


>

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;

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

(1) Determinar el nmero de elementos de la secuencia s :


> >

(2) Construir la lista de los 30 primeros cuadrados (esto es, 1^2, 2^2, 3^2....)
> >

( 3) Determinar el trmino que ocupa el lugar vigsimo en la lista [s].


> >

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;

Ejercicios. Definimos los siguientes conjuntos, listas y secuencias:


>

s:={Luisa, Juan, Alicia, Pedro, Susana};

>

t:={Pedro, Julian, Sebastian, Juan, Ana};

>

lista:=[Lunes,Martes,Sabado,Jueves];

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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 ?
> > >

(2) Reemplaza el elemento S abado por un nuevo elemento Miercoles en lista.


> > >

(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:

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

si condicin entonces operacin1 si no operacin 2


lo que significa que si se verifica la condicin entonces se realiza la operacin 1 y si no la operacin 2. O de la forma:

mientras condicin operacin


lo que significa que mientras se verifique la condicin ha de realizarse la operacin. Y combinaciones de las mismas. Veremos algunos ejemplos. Si se verifica la condicin se realiza la operacin 1, en caso contrario se realiza la operacin 2 (si no se indica nada por defecto no se hace ninguna operacin). Generemos un procedimiento que calcula el mximo de dos nmeros. Los procedimientos en maple se denotan con proc y se terminan con end . Las variables que se involucran en el procedimiento se definen como locales para que luego se puedan usar fuera de el procedimientos. Las condicionales se empiezan por if y se terminan con fi. if condicin then operacin1 else operacin 2 fi Que significa que si se cumple la condicin entonces se realiza la operacin 1 y en caso contrario la operacin 2. Despus de else pueden abrirse nuevas condicionales que se escriben else if o de manera ms abreviada elif . Por ejemplo para calcular el mximo de dos nmeros:
>

maximo:=proc(a,b) local c: if (a>b) then c:=a else c:=b fi: c; end:

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);

Veamos un procedimiento que indica el signo de un nmero real:


>

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.
>

S:=0: for i from 1 to 10^4 do S:=S+i: od: S;

Que coincide con el valor de la suma de los trminos de una sucesin aritmtica:
>

(10^4)*(10^4+1)/2;

Para sumar los elementos de una lista numrica:


>

a:=[1,2,3,4,5,6,7,8];

>

S:=0: for i from 1 to nops(a) do S:=S+a[i]: od: S;

> >

Primeros programas en Maple


Suma de los trminos de una sucesin
En la seccin anterior fuimos capaces de sumar los elementos de una lista, esto lo podemos hacer como un procedimiento y as poder llamarlo cuando lo necesitemos:
> >

restart; suma:=proc(A::list) local S,i: S:=0: for i from 1 to nops(A) do S:=S+A[i]: od: S;

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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);

>

Generar coordenadas de un rectngulo


Por ejemplo, queremos escribir una subrutina que tome como entrada un valor x y una altura h y que nos devuelva las coordenadas de un rectngulo cuyos lados estn paralelos a los ejes de coordenadas, que tenga anchura 0.5 y altura h , y cuyo borde inferior est en el eje de las x y centrado sobre el punto ( x ,0). La primera lnea de la subrutina especifica su nombre y los argumentos de entrada: rectangulo:=proc(x,h::positive) Esta lnea de cdigo informa a Maple que queremos escribir una subrutina que se llama rectangulo y que toma como argumentos a x y a h . Si no se especifica el tipo de argumentos, maple acepta cualquiera. Especificamos h positivo. El cdigo que ejecuta la subrutina ser el siguiente. No queremos nada ms que la lista de las coordenadas de los extremos del rectngulo, las cuales a su vez consisten de listas de dos valores.
>

rectangulo:=proc(x,h) [[x-.25,0],[x+.25,0],[x+.25,h],[x-.25,h]]: end;

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);

>

Y se pueden representar grficamente:


>

with(plots): polygonplot(rectangulo(5,3));

Warning, the name changecoords has been redefined

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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:

Veamos algunos ejemplos:


>

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);

>

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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]);

>

>

Prueba con otros ejemplos.


> >

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:

Veamos algunos ejemplos.


>

Maximo([44,55,6,7,10]);

>

Maximo([45,789,10^6,45,6]);

Puedes probar con otros ejemplos.


> >

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.
>

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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.

2. Prate cada vez que aparezca la seal

y trata de responder a la cuestin propuesta.

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;

>

10375378 mod 124903;

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);

De esta forma hemos resuelto la congruencia puesto que:


>

3*5-1 mod 7;

Ahora resolvamos un problema similar cambiando 7 por 6:


> >

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.
>

seq(3*i mod 6,i=0..5);

>

Cul es la razn de que no tenga solucin esta ecuacin y sin embargo s la tenga la anterior?

2.2. Mximo comn divisor. Mnimo comn mltiplo


La funcin igcd ( i nteger g reatest c ommon d ivisor) de Maple sirve para calcular el mximo comn divisor de un conjunto de enteros. En clase hemos definido el mximo comn divisor de dos nmeros pero la definicin se ampla naturalmente para definir el mcd(a1,...,a_n) como el mximo del conjunto de divisores comunes a a1, ..., an. Veamos algunos ejemplos de uso de la funcin igcd y otras funciones relacionadas:
>

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));

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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;

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

324*x+779*y;

>

2.3. Teorema chino del resto


Maple se puede usar para resolver sistemas de congruencias mediante el teorema chino del resto. Observa el siguiente ejemplo: Para resolver el sistema formado por las tres congruencias siguientes, X = 2 (mod 3) X = 3 (mod 5) X = 2 (mod 7) empleamos la funcin chrem ( ch inese rem ainder theorem) del siguiente modo:
>

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.
> >

2.4. Factorizacin de enteros


Para descomponer nmeros enteros en sus factores primos debemos cargar el paquete numtheory (si no lo hemos hecho antes).
>

with(numtheory);

La funcin ifactor descompone un nmero entero en sus factores primos:


>

ifactor(100);

>

ifactor(12345);

>

ifactor(39248675928359283654928364);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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.
> > >

2.5. Test de primalidad


Obtener nmeros primos grandes es muy importante en criptografa como se puede ver en la seccin de aplicaciones. Aqu mostraremos algunas de las capacidades de Maple para encontrar nmeros primos. Hemos visto ya cmo factorizar un nmero entero en sus factores primos. En consecuencia, podramos usar como test de primalidad de un nmero su descomposicin en factores. Si al factorizar el nmero a el resultado es el mismo nmero a, el nmero es primo. Esto constituye un test de primalidad:
> >

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:

Veamos algunos ejemplos:


>

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);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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.

primo. As podemos determinar, mediante la funcin

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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);

Esto indica que 13 es un nmero primo.


>

phi(5);

>

phi(10);

>

phi(107);

As construimos otro test de primalidad:


>

Testprimo2:=proc(a) local c: if is(phi(a)=a-1)=true then c:=si else c:=no fi: c; end:

Veamos algunos ejemplos:


>

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);

>

Los nicos nmeros cuyo valor de phi es 2 son el 3, el 4 y el 6.


>

phi(3),phi(4),phi(6);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

Otro ejemplo:
>

s:=invphi(6);

>

p:=[]: for i from 1 to nops(s) do p:=[op(p),phi(s[i])]: od: p;

>

3. Aplicaciones
En esta seccin veremos algunas aplicaciones de la aritmtica modular y las congruencias.

3.1. Criptografa clsica


Vamos a emplear ecuaciones lineales en congruencias para cifrar y descifrar mensajes como lo haca Julio Csar durante la guerra de las Galias. Necesitamos convertir letras en nmeros, para lo cual emplearemos la funcin letranumero. Para asignar un nmero a cada letra definimos la funcin letranumero, antes debemos escribir la siguiente lnea porque I y E tienen valores preasignados:
>

alias(I=I); alias(E=E);

Error, use interface(imaginaryunit=...) to set the imaginary unit

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"]:

Y la funcin letranumero es, en general:


>

letranumerogen:=proc(a::list) local i: for i from 1 to nops(a) do letranumero(a[i]):=i-1; od: end:

En nuestor ejemplo
>

letranumerogen(alfabeto): letranumero("U");

>

Tambin necesitamos convertir nmeros en letras. Para ello emplearemos la funcin inversa numeroletra :
>

numeroletragen:=proc(a::list,b::list) local i: for i from 0 to nops(b) do numeroletra(i):=a[i+1]; od: end:

En nuestro ejemplo:
>

numeroletragen(alfabeto,[seq(i,i=0..nops(alfabeto)-2)]): numeroletra(21);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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.
> > >

3.2. Criptografa de clave pblica


Veremos ahora cmo implementar con Maple el sistema RSA de encriptado, que se explica a continuacin. Construiremos procedimientos de Maple para generar claves, para encriptar y para descifrar mensajes. Haremos una simplificacin para hacer ms gil la prctica: en lugar de emplear nmeros primos grandes (para que el sistema sea seguro conviene emplear dos nmeros primos de 100 cifras) lo haremos con nmeros ms pequeos, sino las
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

operaciones tardaran mucho tiempo.

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);

Efectivamente cumplen lo que deben:


>

is(2537=43*59); is(13*937 mod phi(2537)=1);

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.
>

alias(I=I); alias(E=E); 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"," "]: for i from 1 to nops(alfabeto) do letranumero(op(i,alfabeto)):=i+9: od:

Error, use interface(imaginaryunit=...) to set the imaginary unit

>

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:

letranumero(substring(msg,i..i)) * 100 + letranumero(substring

(msg ,i+1..i+1))]:i:=i+2:

> >

bloques("HOLA QUE TAL");

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:
>

RSA([5063, 13],bloques("HOLA QUE TAL"));

>

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:
>

RSA([5063, 757],[2780, 980, 2926, 3809, 119, 798]);

>

Como vemos esta lista se corresponde con el mensaje "HOLAQUETAL":


>

bloques("HOLA QUE TAL");

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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.

4. Test resuelto del curso 2000/2001


> > >

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]);

La respuesta correcta es la b).


> > > >

[nextprime(10^6),nextprime(2*10^6),nextprime(3*10^6)];

La respuesta correcta es la c).


>

4. Calcula cuntos nmeros primos hay entre 100.000 y 200.000.


> >

c:=0; for i from 10^5 to 2*10^5 do if isprime(i) then c:=c+1 fi; od; c;

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 b).


>

5. Sea la funcin f(n)=n^17 mod 17. Seala la respuesta correcta:


> >

seq([n,n^(17) mod 17], n=0..16);

La respuesta correcta es la a).


> > > >

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

La respuesta correcta es la c).


>

7. Y en el conjunto {g(0),g(1),...,g(10.000)}, cul es el porcentaje de nmeros primos?


> >

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

La respuesta correcta es la c).


> > >

(1513 mod 7, 1513 mod 13, 1513 mod 19);

>

(1206 mod 7, 1206 mod 13, 1206 mod 19);

La respuesta correcta es la c). 9. La funcin f(p)=77p+42 (mod 98) es:


> >

{seq(77*p+42 mod 98,p=0..97)};

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). 10. Los nmeros menores que 1000 que tienen exactamente 100 nmeros ms pequeos que son relativamente primos con ellos:
> >

invphi(100);

La respuesta correcta es la a).


>

5. Test resuelto del curso 2001/2002


1. Dados los nmeros enteros 712504 y 985898 determinar el conjunto de divisores comunes a ambos y su mcd.
> >

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;

La respuesta correcta es la c).


>

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;

La respuesta correcta es la a).


>

4. Calcula el porcentaje de nmeros primos entre el 30.000 y el 40.000 (ambos inclusive)


>
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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);

La respuesta correcta es la b).


>

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:
> >

seq([n,n^(13)+1 mod 13], n=0..12);

La respuesta correcta es la b).


>

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)};

> >

La respuesta correcta es la c).


>

7. Determinar la cantidad de nmeros enteros menores o iguales que 1000 relativamente primos con 1000.
> >

phi(1000);

La respuesta correcta es la a).


> > >

(1513 mod 11, 1513 mod 13, 1513 mod 17);

>

(1206 mod 11, 1206 mod 13, 1206 mod 17);

La respuesta correcta es la b).


http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

9. El inverso de 7 mdulo 5, el de 4 mdulo 9 y el de 8 mdulo 11 son:


> >

msolve(7*x=1,5);msolve(4*x=1,9);msolve(8*x=1,11);

La respuesta correcta es la c). 10. El mcd(a,b,c) verifica que:


> >

igcd(14,67,89); igcd(14,igcd(67,89));

>

igcd(1445,6785,8900); igcd(1445,igcd(6785,8900));

>

La respuesta correcta es la a).


>

6. Test resuelto del curso 2002/2003


1. Los nmeros enteros 9755076 y 3489755: a) Son relativamente primos entre s. b) No tienen divisores comunes. c) Tienen 4 divisores comunes.
>

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;

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

chrem([42,-8,25,0],[99,52,17,19]);

La respuesta correcta es la b).


> > > >

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(%);

La respuesta correcta es la a).


> > > >

restart; with(numtheory):

Warning, the protected name order has been redefined and unprotected

>

f:=n->4*n^32+4 mod 8;

>

seq([n,4*n^32+4 mod 8], n=0..7);

La respuesta correcta es la b).


>

5. Calcula la cantidad de nmeros primos entre los nmeros del tipo


> >

, menores que 100000.

restart; with(numtheory):

Warning, the protected name order has been redefined and unprotected

>

solve(2^n-1<100000,n);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

floor(ln(100001)/ln(2));

Tambin,
>

seq(2^n-1,n=2..16);2^17-1;

>

c:=0:for i from 2 to 16 do if isprime(2^i-1) then c:=c+1: fi; od; c;

La respuesta correcta es la a).


> > > >

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);

>

c:=0: for i from 1 to floor(995/7) do if isprime(7*i+5) then c:=c+1 fi: od: c;

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).


> > >

restart; with(numtheory):

Warning, the protected name order has been redefined and unprotected

>

chrem([1,1],[5,3]); chrem([1,1],[10,3]);

>

La respuesta correcta es la c).


> > > >

restart; with(numtheory):

Warning, the protected name order has been redefined and unprotected

>

f:=n->a*n+2 mod 7;simplify(f(f(n))-n);

>

for a from 0 to 6 do if simplify(f(f(n))-n)=0 then print(a); fi; od;

La respuesta correcta es la c).


>

10. Los inversos de 3, 5 y 7 modulo 12 son respectivamente:


> >

restart; with(numtheory):

Warning, the protected name order has been redefined and unprotected

>

msolve(5*n-1,12); msolve(7*n-1,12);

La respuesta correcta es la a).

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

1 1, 1 1, 2, 1 1, 3, 3, 1 1, 4, 6, 4, 1 1, 5, 10, 10, 5, 1 1, 6, 15, 20, 15, 6, 1 1, 7, 21, 35, 35, 21, 7, 1

Introduccin a la Combinatoria con Maple


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 entenderlos mejor o mejorarlos. 2. Realiza el test de evaluacin (en un fichero aparte), ayudndote de los test de otros cursos.

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;

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

A minus B;

Podemos hacer un procedimiento simple para construir el conjunto producto cartesiano:


>

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:

Veamos unos ejemplos:


>

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)};

Definimos el conjunto de los mltiplos de 4 menores o iguales que 1000.


>

G:={seq(4*n,n=1..250)}:

Por tanto debemos calcular el cardinal de la interseccin.


>

nops(F intersect G);

Los nmeros enteros que cumplen ambas condiciones son exactamente:


>

F intersect G;

>

En efecto todos ellos son mltiplos de 4 y el cuadrado de un nmero entero.

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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);

La funcin numbperm se puede aplicar a un conjunto en lugar de a su cardinal:


>

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));

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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,
>

numbcomb({Maria, Juan, Eva, Luis, Teresa, Pablo},2);

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);

Si lo que queremos es obtener la lista de todas las combinaciones empleamos choose :


>

### 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.
>

numbcomb({Maria, Juan, Eva, Luis, Teresa, Pablo});

Que es el cardinal del conjunto partes de {Mara , Juan , Eva , Luis , Teresa, Pablo} formado por todos sus subconjuntos.
>

2^6;

Este conjunto es:


>

### WARNING: combinat[choose] with numeric first parameter now returns a sorted list rather than a set choose({Maria, Juan, Eva, Luis, Teresa, Pablo});

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

Podemos generar una combinacin de forma aleatoria con randcomb


>

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)

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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:

Veamos algunos ejemplos:


>

variaciones({a,b,c,d},3);

En efecto, se han obtenido todas:


>

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!);

>

Otras funciones combinatorias


Las funciones partition, numbpart y randpart sirven para calcular el nmero de formas distintas en que se puede descomponer un nmero natural en suma de otros, para hallar todas las posibles descomposiciones y para hallar una de ellas al azar
http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

respectivamente. Veamos un ejemplo:


>

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);

Y en efecto calcula el cardinal del conjunto anterior:


>

nops(partition(10));

De igual manera si se quiere conseguir una particin aleatoriamente:


>

randpart(10);

Observa que si se repite el comando anterior:


>

randpart(10);

>

Como la eleccin es aleatoria, es demasiada casualidad que haya salido igual.

Test resuelto curso 2000/2001


1.-Sea un experimento de Bernoulli con probabilidad de xito p=1/3. Entendiendo que las repeticiones del experimento son sucesos independientes. Calcula la probabilidad de obtener exactamente 3 xitos al repetir el experimento 154 veces. La respuesta es:
> > >

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:
>

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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));

La respuesta correcta es la a).


>

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

y la palabra q es una palabra de 11 letras obtenida permutando las letras de la palabra

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);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

> > >

A:={seq(i^2,i=1..100)}: B:={seq(i^3,i=1..100)}: nops(A intersect B);

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.
> >

restart; C:={seq(5*n,n=1..2000)}: E:={seq(7*n,n=1..2000)}: nops(C minus E);

La respuesta correcta es la c).

Test resuelto curso 2001/2002


1.-Determinar cuntos nmeros naturales menores que 10000 son mltiplos de 7 pero no son pares ni mltiplos de 3: a) 477 b) 476 c) 478
>

evalf(10000/7);

> > > >

A:={seq(7*i,i=1..1428)}: B:={seq(2*i,i=1..5000)}: C:={seq(3*i,i=1..3333)}: nops(A minus B minus C);

>

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}:

a) 432 b) 554 c) 562


>

nops(E);

>

c:=binomial(11,0):

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

for i from 1 to 4 do c:=c+binomial(11,i): od: c;

>

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
>

c:=0: for i from 1 to 10000 do if isprime(i) then c:=c+1: fi: od: c;

>

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);

>

i:=0: while(evalf(p(i))<1/3) do i:=i+1: od: i;

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

evalf(p(247)); evalf(p(248)); evalf(p(249));

>

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;

>

La respuesta correcta es la c).

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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);

> > >

La respuesta correcta es la a).

Test resuelto curso 2002/2003


1) En un taller hay 10 coches que necesitan reparaciones. Calcular de cuantas formas distintas se pueden elegir y ordenar los primeros 4 coches que se van a arreglar. a) b) c)
>

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);

La respuesta correcta es la c).


>

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

La respuesta correcta es la c).


>

3) Determinar cuantos posibles resultados pueden acontecer al lanzar 25 monedas simultneamente. a) b) c) 26


>

restart;with(combinat): binomial(26,25);

Warning, the protected name Chi has been redefined and unprotected

La respuesta correcta es la c).


>

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;

La respuesta correcta es la b).


>

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;

Pero p(S|S') no es igual a p(S). La respuesta correcta es la b).


>

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);

>

nops(A intersect B)/10^4;

>

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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);

>

i:=0: while(evalf(p(i))<1/5) do i:=i+1: od: i;

>

evalf(1/5);evalf(p(23)); evalf(p(24));

La respuesta correcta es la a).


>

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;

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

> >

p:=6/36;

La respuesta correcta es la a).


>

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)));

La respuesta correcta es la b).


>

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;

La respuesta correcta es la b).


>

#fin (Libro de referencia: "EXPLORING DISCRETE MATHEMATICS WITH MAPLE"


de K.H.Rosen, McGraw Hill 1997

Prctica 4
Matemtica Discreta
PRCTICA 4

GRAFOS y RBOLES

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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.

Grafos con Maple


Comandos bsicos
Maple tiene una librera de comandos relacionados con la teora de grafos denominada networks:
>

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():

A continuacin aadimos los vrtices al grafo, por ejemplo:


>

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);

Y para representar grficamente el grafo utilizamos el comando draw :


>

draw(G1);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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 :
>

edges({Mostoles,Alcorcon},G1); edges({Pozuelo, Alcorcon},G1); edges({Mostoles,Pozuelo},G1);

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);

El comando vertices se emplea para recuperar los vrtices del grafo:


>

vertices(G1);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

El comando vdegre nos permite obtener el grado de cualquier vrtice:


>

vdegree(Mostoles,G1);

Si quisiramos trabajar con digrafos, las aristas deben ser un conjunto de pares ordenados:
>

D1:=new(): addvertex({Mostoles,Alcorcon,Fuenlabrada,Vicalvaro,Pozuelo},D1): addedge({[Mostoles,Alcorcon],[Mostoles,Fuenlabrada],[Alcorcon,Fuenlabrada],[Fuenlabrada,Vicalvaro],[Alcorcon,Pozuelo],[Vicalvaro,Pozuelo],[Alcorcon,Vicalvaro],[Vicalvaro,Alcorcon]},D1): vertices(D1); edges(D1); ends(D1);

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.
>

M1:=new(): addvertex({Mostoles,Alcorcon,Fuenlabrada,Vicalvaro,Pozuelo},M1): addedge([{Mostoles,Mostoles},{Mostoles,Alcorcon},{Mostoles,Alcorcon},{Mostoles,Fuenlabrada},{Alcorcon,Fuenlabrada},{Fuenlabrada,Vicalvaro},{Alcorcon,Pozuelo},{Vicalvaro,Pozuelo},{Alcorcon,Vicalvaro}],M1): vertices(M1); edges(M1); ends(M1);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

De nuevo el dibujo no es ilustrativo:


>

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));

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

draw(cube(3));

>

draw(petersen());

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

draw(complete(2,6));

>

draw(complete(2,5));

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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));

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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.
> > > >

G2:=new(): addvertex({v1,v2,v3,v4,v5,v6,v7,v8,v9},G2): addedge({{v1,v2},{v1,v3},{v5,v6},{v6,v7},{v7,v8},{v8,v9}},G2): components(G2);

>

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.

Grafos eulerianos y hamiltonianos


Segn sabemos, un grafo con todos los vrtices en la misma componente conexa es euleriano si y solo si todos sus vrtices tienen grado par. Teniendo en cuenta este hecho, podemos crear un procedimiento que nos permita averiguar si un grafo conexo es, o no, euleriano. Dado un grafo la funcin degreeseq da la lista de los grados de sus vrtices:
>

degreeseq(G2);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

Entonces podemos crear un procedimiento para saber si un grafo conexo es euleriano:


>

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:

Analicemos algunos ejemplos:


>

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:
>

new(G3): addvertex({a,b,c,d,y,z},G3); addedge( [{a,b},{a,d},{b,c},{b,y},{c,z},{d,y},{y,z}], weights=[4,2,3,3,2,3,1], G3);

Al pintarlo no seala las etiquetas.


>

draw(G3);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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);

>

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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 names charpoly and rank have been redefined

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]]);

Que tambin se puede escribir sealando primero el tamao de la matriz:


>

matrix(3,3,[1,-alpha,2/3,-1,0,1,beta/3,2,-1]);

Podemos transponer matrices:


>

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]]);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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 &* B - 1/3*C);

Podemos hacer potencias de matrices:


>

evalm(A^3);

>

F:=evalm(B^7);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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.
>

Ejercicios previos al test de evaluacin


Proponemos algunos ejercicios simples que necesitaremos para resolver el test de la prctica. Algunos ejercicios los resolvemos como ejemplo.
>

restart; with(networks):

1. Grados de los vrtices


1.1. Cmo se puede calcular el nmero de aristas de un grafo? Y el nmero de vrtices?. Si tenemos un grafo definido, las funciones vertices y edges obtienen el conjunto de vrtices y aristas del grafo. Entonces basta contar el nmero de elementos de cada uno de los conjuntos:
> >

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:
> > > >

H:=new(): addvertex({a1,a2,a3,a4,a5,a6,a7},H): addedge({{a1,a2},{a1,a3},{a6,a7},{a5,a6}},H): draw(H);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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);

>

for i from 1 to nops(L) do c[i]:=vdegree(L[i],H):od: seq(c[j],j=1..nops(L));

>

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

Warning, the names charpoly and rank have been redefined

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} :
>

Vertices:=proc(A::matrix) local L,i:

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

L:={}: for i from 1 to rowdim(A) do L:=L union {i}: od: L; end:


>

Vertices(matrix(2,2,[0,1,1,0]));

Para construir las aristas:


>

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]));

>

Para construir el grafo:


>

grafo:=proc(A::matrix) local G: G:=new(): addvertex(Vertices(A),G): addedge(Aristas(A),G): G; end: draw(grafo(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]);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

draw(grafo(M));

Por ejemplo dada la matriz:


>

M:=matrix(4,4,[0,1,0,0,1,0,1,1,0,1,0,0,0,1,0,0]);

El grafo que la tiene como matriz de adyacencias es:


>

draw(grafo(M));

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.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.

Test curso 2000/2001


1.- Calcula el nmero de entradas no nulas de la matriz de adyacencias de
> > > >

. (Se recomienda crear un procedimiento para contar las entradas no nulas de una matriz). Respuesta:

with(networks): M:=adjacency(cube(6)): with(linalg): coldim(M);

Warning, the names charpoly and rank have been redefined

>

c:=0; for i from 1 to 64 do for j from 1 to 64 do c:=c+M[i,j] od; od; c;

> > > >

N:=incidence(cube(6)): coldim(N); rowdim(N);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

c:=0; for i from 1 to 64 do for j from 1 to 192 do c:=c+N[i,j] od; od; c;

> > > >

M:=adjacency(complete(3,3)): with(linalg): coldim(M);

>

c:=0; for i from 1 to 6 do for j from 1 to 6 do c:=c+M[i,j] od; od; c;

>

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];

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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():

Warning, the names charpoly and rank have been redefined

>

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).

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

Test curso 2001/2002


>

restart: with(networks): with(linalg):

Warning, the names charpoly and rank have been redefined

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

gr(3):=0: for t from 1 to 50 do: gr(3):=gr(3)+M[3,t]: od: gr(3);

>

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

c) es conexo tiene 6 vrtices y 21 aristas, el grado de cada vrtice es 5.


> >

restart;with(networks): nops(vertices(complete(6)));

>

nops(ends(complete(6)));

>

degreeseq(complete(6));

>

components(complete(6));

La respuesta correcta es la b).


> > >

H:=new(): addvertex({seq(i,i=1..30)},H): addedge({{1,2},{1,4},{3,2},{5,6},{21,12},{21,22},{4,20},{1,7},{8,9},{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}},H):

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));

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). 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;

>

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

Test curso 2002/2003


>

restart: with(networks): with(linalg):

Warning, the names charpoly and rank have been redefined

Warning, the protected names norm and trace have been redefined and unprotected

Sea A la matriz definida por


>

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.
>

for i from 1 to rowdim(A) do

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

g[i]:=add(A[i,j],j=1..rowdim(A)): od: seq(g[i],i=1..rowdim(A));

>

s:=0: for i from 1 to rowdim(A) do if g[i] mod 2 =1 then s:=s+1 fi od: s;

>

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];

Obsrvese que 1 y 45 son adyacentes:


>

A[1,45];

El nmero de caminos no simples de la forma 1a1(45) es el grado del vrtice 1:


>

L:=seq(A[1,i],i=1..rowdim(A)): g:=0: for i from 1 to rowdim(A) do g:=g+L[i]: od: g;

El nmero de caminos no simples de la forma 1(45)b(45) es el grado del vrtice 45:


>

L:=seq(A[45,i],i=1..rowdim(A)): g:=0: for i from 1 to rowdim(A) do g:=g+L[i]: od: g;

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);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

Si G es bipartido completo, tiene que ser isomorfo a


>

y tener

22*23;

aristas. Para verificar si G es bipartido, ordenamos sus vrtices


>

L:=[op(vertices(G))];

y definimos las sucesiones


>

de los vrtices de grado 22 y 23, respectivamente.

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);

>

Finalmente, podemos dibujar G:


>

draw(Linear([s1],[s2]),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 b).


>

7. El grafo G a) es Euleriano. b) no es Euleriano. c) no se puede saber si es o no Euleriano.


> >

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.
>

A[3,5]; A[5,45]; A[9,45];

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).


>

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;

La respuesta correcta es la c).


>

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;

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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);

Ahora mediante plot podemos representar la secuencia de los pares de N


>

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:
> > >

with(networks): G:=new(): addvertex(A,G);

>

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);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

Tampoco la matriz de adyacencias de G recoge toda esta informacin.


>

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 names charpoly and rank have been redefined

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);

>

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

Observamos que si se toma el conjunto :


>

B:={2,a,3}:

Y hacemos una lista con los elementos del conjunto:


>

[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);

> >

Estudio de las propiedades de una relacin


Propiedad reflexiva
Para comprobar si una relacin R definida sobre un conjunto A es reflexiva hay que verificar que cada par (a,a) (con a un elemento de A) es un elemento de R. Si miramos la representacin grfica
> > >

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:

p1:=plot(x,x=0..4): p2:=plot([op(N)],style=point): plots[display](p1,p2);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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:
>

M := matrix([[1, 1, 1, 0], [0, 1, 1, 0], [0, 0, 1, 0], [0, 0, 0, 1]]);

>

seq(M[i,i],i=1..nops(A));

No es difcil disear un procedimiento que lo compruebe sobre una matriz:


>

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);

>

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

Mref(matrix(2,2,[1,0,0,0]));

>

Propiedad simtrica y antisimtrica


Sobre la representacin grfica se trata de observar si la nube de puntos es simtrica con respecto a la diagonal del primer cuadrante, esto es, si (a,b) es un punto de la grfica, tambin lo es (b,a). Sea la relacin:
>

A:={1,2,3,4,5}; R:={[1,2],[2,1],[1,3],[3,1],[4,4],[5,5]};

La representamos mediante una tabla.


> > >

p1:=plot([op(R)],x=0..5,y=0..5,style=point): p2:=plot(x,x=0..5): plots[display]({p1,p2});

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

> >

Diagonal:={seq([[op(A)][i],[op(A)][i]],i=1..nops(A))}: (R intersect S) minus Diagonal;

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));

Esto se puede escribir en un procedimiento:


>

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:

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

if S=1 then r:="no antisimetrica" else r:="antisimetrica" fi: r; end:


>

Mantisim(M);

Si tomamos la matriz de una relacin antisimtrica por ejemplo:


>

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]);

>

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

Matrizdeunosyceros(M);

Por tanto dada la matriz de una relacin:


>

M:=matrix(3,3,[1,1,1,0,1,0,0,1,1]);

Calculamos la matriz de unos y ceros del cuadrado de M


>

Matrizdeunosyceros(evalm(M^2));

Como son iguales la relacin es transitiva. Podemos escribir un procedimiento:


>

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);

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

Con, en efecto, entradas no nulas con respecto a A.


>

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))};

La clausura simtrica es simplemente hacer la unin:


>

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(%);

Que es una matriz simtrica


>

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]};

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

Q:=MatrizRelacion([a,s,d,f,g],R);

>

Matrizdeunosyceros(evalm(add(Q^n,n=1..5)));

El otro algoritmo que se presentaba es el Algoritmo de Warshall que reduce la complejidad:


>

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);

>

Test del curso 2000/2001


Sea la siguiente relacin.
>

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]};

> >

with(linalg): MatrizRelacion:=proc(D::list,R::set([anything,anything])) local i,j,L; L:=[]; for i from 1 to nops(D) do

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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)));

>

>

c:=0; for i from 1 to 10 do for j from 1 to 10 do c:=c+M[i,j] od; od; c;

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

> > >

seq(Matrizdeunosyceros(evalm(Q+transpose(Q)))[7,i],i=1..10);

Luego la respuesta correcta es la b).


>

4.- Sea la matriz M definida abajo:


> >

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).
>

5.- La relacin (B,S) definida abajo:


> >

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]};

> > >

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

6.- La clausura simtrica de la relacin anterior es:


> > > >

7.- Sea la matriz N definida ms abajo,


> >

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.
>

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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));

La respuesta correcta es la a).


>

Test del curso 2001/2002


>

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]]):

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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:

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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
>

S:=0: for z from 1 to 50 do if M[z,z]=0 then S:=S+1: fi: od: S;

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);

>

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). 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]};

Calculamos la matriz de la relacin:


>

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);

>

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

Entradas(A,L);

La respuesta correcta es la a). Si lo hacemos mediante el otro algoritmo:


>

J:=Matrizdeunosyceros(evalm(add(A**i,i=1..10))): Entradas(A,J);

7.- La relacin S: a) es antisimtrica y transitiva b) es simtrica y reflexiva c) no es reflexiva ni simtrica ni transitiva


>

Msim(A); Mref(A); Mantisim(A); Mtrans(A);

>

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.

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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);

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).

Test del curso 2002/2003


>

restart: with(linalg):

Warning, the protected names norm and trace have been redefined and unprotected

Sea M la matriz definida por


>

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);

La respuesta correcta es la c).


>

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);

>

>

La respuesta correcta es la b).


>

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);

>

>

La respuesta correcta es la b).


>

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.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
>

S:=0: for z from 1 to rowdim(M) do if M[z,z]=0 then S:=S+1: fi: od: S;

La respuesta correcta es la b).


>

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));

La respuesta correcta es la a).


>

6.- Sea el conjunto B y la relacin S definidas abajo.


http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

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);

>

Se trata entonces de calcular la clausura transitiva. 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);

>

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

>

Mref(L);

>

Mantisim(L);

La respuesta correcta es la c).


>

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]]);

La respuesta correcta es la c).


>

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));

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

tiene todas las entradas nulas si

= 0,

=0y

= 0, los posibles valores son

=0 y =1 y

=01 y =1.

La respuesta correcta es la c).


>

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

=1, por el problema 8 anterior, la relacin es tambin simtrica si

=1. Tenemos que verificar que para estos valores de

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);

>

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).


> > > > >

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:

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

LibroMaple03.html

if S=1 then r:="no transitiva" else r:="transitiva": fi:r; end:


>

Mtrans(B);

>

La respuesta correcta es la a).


> >

#fin

http://www.escet.urjc.es/~matemati/md_iti/practicas/Libromaple03/LibroMaple031.html[12/06/2011 03:45:24 p.m.]

Vous aimerez peut-être aussi