Está en la página 1de 45

MATEMÁTICAS DISCRETAS

Marco E. Benalcázar, Ph.D.

12 de abril de 2019
REPRESENTACIÓN
DE NÚMEROS EN
EL COMPUTADOR
Representación de un Número Real:
Conversión de Formato IEEE a Decimal
Simple Precisión

value = (-1)0 *(1 + b21*2-2)*2(124 - 127) = (-1)0 *(1 + 1*2-2)*2(124 - 127) = 0.15625

Doble Precisión
Representación de un Número Real:
Conversión de Decimal a Formato IEEE
Simple Precisión: Para representar un número real en el formato IEEE de 32 bits se deben
aplicar los siguientes pasos:

1. Convertir y normalizar la parte entera en binario.


2. Convertir la parte fraccionaria: multiplicar la fracción por 2, tomar la parte entera y
volver a multiplicar la nueva fracción por 2 hasta que se encuentre una fracción de cero
o hasta que se alcance el límite de precisión que es de 23 dígitos.
3. Juntar los resultados anteriores para generar la representación final.

Ejemplo: Encontrar la representación en Formato IEEE del número 12.375.

Parte entera: 12 = 1100

Parte fraccionaria:
0.375 * 2 = 0.750 = 0 + 0.750  b−1 = 0 y = 3 bits
0.750 * 2 = 1.500 = 1 + 0.500  b−2 = 1
0.500 * 2 = 1.000 = 1 + 0.000  b−3 = 1. La fracción es 0, por lo tanto el cálculo termina aquí

Juntando los resultados:


(12.375)10 = (12)10 + (0.375)10 = (1100)2 + (0.011)2 = (1100.011)2. Representando este
resultado en el formato 1.x1x2...x23*2y se obtiene 1.100011*23. Por lo tanto el signo es 1, el
exponente es: e - 127 = 3  e = 13010 = 100000102 y la parte fraccionaria es 1000112.
Representación de Números Reales en el
Computador

Link: https://www.youtube.com/watch?v=pQs_wx8eoQ8
INTRODUCCIÓN
A MATLAB
Matlab

MATrix - LABoratory

- Creado en 1984 por MathWorks.

- Usado en más de 5000 universidades


alrededor del mundo.

- Versiones disponibles para Windows,


Linux y Mac

Link: http://www.mathworks.com/
Curso Básico de Matlab (1)

Variables:
Aquí se muestra una
Ventana de comandos: lista de todas las
Aquí se escriben las funciones o comandos a variables creadas
ejecutar en Matlab. Por ejemplo: desde el inicio de
Directorio de Trabajo: sesión en Matlab
Path del directorio de
trabajo actual de Matlab y
su contenido

Historial de Comandos:
Aquí se guardan los
comandos ejecutados en la
ventana de comandos de
Matlab desde su instalación
Curso Básico de Matlab (2)

Creación de un nuevo script: Variables:


Al hacer click en esta opción se crea una hoja Aquí se muestra una
en blanco de Matlab, llamada “script”, que lista de todas las
tiene la extensión *.m. En este script se variables creadas
pueden escribir programas a ser ejecutados desde el inicio de
en Matlab. sesión en Matlab

Ejemplos de scripts:
Aquí se muestran algunos ejemplos de scripts
creados en Matlab.
NOTA: Los nombres de los scripts no pueden
contener espacios en blanco, ni carcateres
especiales (+,*,., -, etc.). Si se quiere separar
las palabras que forman el nombre del script
se puede usar guión bajo: nombre1_nombre2.m
Curso Básico de Matlab (3)

Al crear un script en Matlab se verá algo


similar a lo contenido en este slide

Lista de scripts:
Aquí se muestran todos los scripts que han
sido abiertos en Matlab.
Curso Básico de Matlab (4)

Ejecución de programa: Este botón ejecuta el contenido del script

Comentarios:
Note que los comentarios van precedidos del
símbolo de porcentaje “%” y el editor los
muestra en verde.

Instrucciones:
Las instrucciones, comandos y funciones se
marcan con color negro

Lazos, creación de funciones, comparaciones:


Estos ítems se muestran en azul

Texto:
En Matlab el texto se coloca entre comillas
simples ( ‘ ‘ ). Note que el texto se muestra en
color rozado
Curso Básico de Matlab (5)

Ayuda de Matlab:
Esta opción activa la ventana de ayuda de Matlab
Curso Básico de Matlab (6)
Ventana Ayuda de Matlab

Aquí se escribe el nombre del comando o función


del cual se quiere averiguar información
Aquí se muestran todas las opciones que
contienen la palabra buscada
En esta parte derecha se muestra toda la información de la
opción seleccionada de entre los resultados de la búsqueda
Tipos de Variables
Matrices y Vectores
Matlab: Representación de Números Enteros
y Números Reales
eps: devuelve la distancia de 1.0 al siguiente número de doble precisión más
grande
realmax: devuelve el número de punto flotante finito más grande en el formato
IEEE de doble precisión.
realmin: devuelve el número de punto flotante finito positivo más pequeño en el
formato IEEE de doble precisión.
intmax: devuelve el mayor valor entero que Matlab puede representar en un
determinado formato (uint8, uint16, uint32, uint64).
intmin: devuelve el menor valor entero que Matlab puede representar en un
determinado formato (uint8, uint16, uint32, uint64).

Ejemplo 1: Calcule a mano el resultado de la siguiente operación:


Ejemplo 2:
1 - 3*(4/3 - 1)
Realice ahora esta operación en Matlab. ¿El resultado es igual 0?
Fuente: http://www.mathworks.com/help/matlab/matlab_prog/floating-point-numbers.html
Curso Básico de Matlab (7)

Links de consulta:

http://www.mathworks.com/

http://www.maths.dundee.ac.uk/software/MatlabNotes.pdf

http://www.dummies.com/how-to/computers-software/programming/MATLAB.html

http://mat21.etsii.upm.es/ayudainf/aprendainf/Matlab70/matlab70primero.pdf
FUNCIONES
ÚTILES PARA
CIENCIAS DE LA
COMPUTACIÓN
Funciones Útiles para Ciencias de la
Computación
Para las siguientes definiciones asuma que n y a son enteros no negativos:

Función exponencial: an = a*a*…*a (n veces) an = an - 1 * a

Función logarítmica: y = loga (x) loga (x) = logb(x) / logb(a)

Factorial: n! = 1*2*…*(n -1)*n n! = (n - 1)!*n, donde n es un


entero positivo 0! = 1! = 1

Ejemplos:

1) Demuestre que a0 = 1 para cualquier a distinto de 0.


2) Demuestre que 0! = 1
Funciones Útiles para Ciencias de la
Computación: Techo, Piso y Redondeo
(floor and ceil)

Función de redondeo o round: round(x) retorna el entero más cercano a x


round(8.2) = 8 round(2.5) = 3 round(3.1) = 3
Funciones Útiles para Ciencias de la
Computación: Valor Entero y Valor Absoluto

(fix and abs)


Funciones Útiles para Ciencias de la
Computación: Máximo Común Divisor (Método 1)
Máximo Común Divisor: Sean m y n dos enteros diferentes de cero. Un divisor
común de m y n es un entero que divide tanto a m como a n. El máximo común
divisor de m y n, escrito como mcd(m,n) o gcd(m,n) es el divisor común de m y n
más grande.

➢ La función mcd es conmutativa: mcd(m,n) = mcd(n,m).

Ejemplo: Encontrar el valor de mcd(30,105).

Los divisores positivos de 30 son 1, 2, 3, 5, 6, 10, 15, 30.


Los divisores positivos de 105 son 1, 3, 5, 7, 15, 21, 35, 105.
Los divisores comunes de 30 y 105 son 1, 3, 5, 15.
Por lo tanto, mcd(30,105) = 15.
ARITMÉTICA
MODULAR
Aritmética Modular (1)
Aritmética: Rama de la matemática que se dedica al estudio de los números y un
conjunto de operaciones entre ellos.

Aritmética modular: Es un sistema matemático compuesto por clases de


equivalencia de números enteros llamadas clases de congruencia.

La aritmética modular fue introducida en 1801 por Carl Friedrich Gauss en su


libro Disquisitiones Arithmeticae.
De manera coloquial se la llama aritmética del reloj ya
que los números “dan la vuelta” tras alcanzar cierto valor
llamado módulo.

Ejemplo: El tiempo del siguiente reloj analógico es


módulo 12
Función Mod o Residuo
(mod)

entero

➢ La función mod de k y M, k mod M = mod(k,M), se calcula como:

mod(k,M) = k – M*floor(k/M)

➢ Como convención se tiene que mod(k,0) = k

➢ La función mod no es conmutativa: mod(k,M)  mod(M,k)


Aritmética Modular (2)
Definición: a y b se encuentran en la misma "clase de congruencia" módulo n, si
ambos dejan el mismo resto o residuo si los dividimos entre n, o
equivalentemente, si a − b es un múltiplo de n.

a  b (mod n)

Ejemplos:

1) 83  63 (mod 10). Lo anterior se lee como “83 es congruente con 63, módulo
10”. Esto ocurre porque al dividir 83 y 63 por 10, ambos dejan el mismo resto o
residuo que es 3. De manera equivalente, también se puede verificar fácilmente
que 83 – 63 = 20 es un múltiplo de 10.

2) Demuestre que −10  2 (mod 12).

3) mod(9 + 4,12) = 1  13  1 (mod 12)


Propiedades de las Clases de Equivalencia

Propiedad para la suma

Propiedad para el producto


Aplicaciones de la Función Mod: Ejercicios
Ejemplos:

1. ¿Qué día de la semana será 365 después de hoy viernes?


R: Sábado.

El análisis realizado en este ejercicio explica por qué, excepto en año bisiesto
donde se agrega un día a febrero, el mismo mes y día en años consecutivos se
mueve un día de la semana para adelante.

2. Hoy viernes, un amigo le llama por teléfono y le dice que la última vez que se
vieron personalmente fue hace 600 días. Entonces, ¿la última vez que Usted vio
a su amigo personalmente fue un viernes?
R: Falso. Fue domingo.

3. Sean a+ y mod (a,7) = 4. Calcular el resultado de mod (5a,7).


R: 6
Aplicaciones de la Función Mod:
Congruencia de Zeller
La congruencia de Zeller es un algoritmo ideado por Julius Christian Johannes
Zeller para calcular el día de la semana de cualquier fecha del calendario.

donde
h = día de la semana (0 = sábado, 1 = domingo, 2 = lunes,...)
q = día del mes
m = mes (enero*, febrero*, marzo = 3, abril = 4, mayo = 5, ….)
J = la centuria = ⌊año / 100⌋
K = año de la centuria = mod(año,100)

*Enero y febrero se cuentan como meses 13 y 14 del año anterior. Por ejemplo,
que el 2 de enero del 2013, es m =13; año=2012.

Fuente: https://es.wikipedia.org/wiki/Congruencia_de_Zeller

Ejemplo: Encuentre el día de la semana del año 2020 donde festejaré mi


cumpleaños. El día de mi nacimiento es 11 de enero. R: Sábado

DEMO MATLAB: CongruenciaZeller.m


Aplicaciones de la Función Mod:
ISBN
ISBN = International Standard Book Number o en español Número de Libro Estándar Internacional. Es
un código de 10 o 13 caracteres separados por guiones.

Un ISBN de 10 caracteres tiene cuatro partes: un código de grupo (group), un código de editor
(publisher), un código que identifica al libro de manera única entre otros publicados por ese editor (title)
y un carácter de verificación para validar el ISBN (check digit).

Fuente: https://en.wikipedia.org/wiki/International_Standard_Book_Number

Número de Verificación para un ISBN de 10 Caracteres:


El carácter de verificación es mod(s,11), donde s se calcula como:

s = 1*x1 + 2*x2 + 3*x3 + ... + 9*x9, donde xi es el i-esimo número del código
ISBN de izquierda a derecha

Número de Verificación para un ISBN de 13 Caracteres:

El carácter de verificación es 10 - mod(s,10), donde s se calcula como:

s = 1*x1 + 3*x2 + 1*x3 + 3*x4 + ... + 1*x11 + 3*x12, donde xi es el i-esimo


número del código ISBN de izquierda a derecha

Ejemplos: Verificar los siguientes códigos ISBN:


a) 0-8065-0959-7
b) 978-0-306-40615-7
Aplicaciones de la Función Mod:
Dígito Verificador de la Cédula Ecuatoriana

10 – mod(x,10)

10 – mod(25,10) = 5 (10 → 0)

Número de cédula: 171003406-5


Aplicaciones de la Función Mod:
Función de Dispersión o Hashing (1)
Una función de dispersión toma un dato que debe guardarse (o leerse) en una memoria y luego calcula la
primera opción para la ubicación (o lectura) del dato.

Ejemplo 1: consideremos que la memoria de un computador tiene 11 celdas indexadas desde 0 a 10. Para
guardar o recuperar un número n, podemos tomar como primera opción para la localización la función de
dispersión:
h(n) = mod(n,11)

La siguiente figura muestra el resultado de almacenar 15, 558, 32, 132, 102 y 5, en este orden, en celdas
que originalmente estaban vacías:

Colisión: Una colisión ocurre para una función de dispersión h si h(n1) = h(n2), pero n1  n2.

Para manejar colisiones se requiere una política para solución de colisión. Una política sencilla es
encontrar la celda superior inmediata disponible para contener ese dato. En este caso se puede asumir
que la primera celda sigue a la última (En el ejemplo podemos asumir que 0 sigue a 10).

Ejemplo 2: Suponga que queremos guardar 257. Como h(257) = 4, el número 257 debe guardarse en el
lugar 4; sin embargo, esta posición ya está ocupada. La celda superior inmediata a 4 que está vacía es la 6.
Por lo tanto, el número 257 se guarda en la posición 6 de la memoria.
Aplicaciones de la Función Mod:
Función de Dispersión o Hashing (2)
Búsqueda de un número n guardado en base a una función de hashing: Si se quiere
localizar un valor guardado n, se siguen los siguientes pasos:

1. Calcular m = h(n).
2. Buscar el número n en el lugar m.
3. Si n no está en esa posición, se busca en la siguiente posición más alta.
4. Si n no está en esta posición, se procede a la siguiente posición más alta y así
sucesivamente.
5. Si se encuentra una celda vacía o se regresa a la posición original, se concluye
que n no está presente; de otra manera se obtiene la posición de n.

Si las colisiones son poco frecuentes y si cuando ocurre una colisión ésta se
resuelve con rapidez, entonces la función de dispersión proporciona un método
muy rápido para almacenar y recuperar datos.
Aplicaciones de la Función Mod:
Números Seudoaleatorios (1)
Los computadores muchas veces se usan para simular el comportamiento aleatorio: Un
programa para un juego quizá simule el lanzamiento de dados, un programa para el
servicio a clientes quizá simule la llegada de los clientes a un banco, etc.

Números seudoaleatorios: Son números que parecen aleatorios. Si se conoce el


programa que genera los números, es posible predecir qué números se obtendrán.

Método de Congruencia Lineal para Generación de Números Aleatorios:

Es uno de los métodos más antiguos para la generación de números seudoaleatorios


enteros.

Este método requiere cuatro enteros: el módulo m, el multiplicador a, el incremento c


y una semilla s que satisfacen:

2 ≤ a < m, 0 ≤ c < m, 0 ≤ s < m.

Después se hace x0 = s. La sucesión seudoaleatoria generada, x1, x2, ..., está


determinada por la fórmula:

xn = mod(a*xn − 1 + c, m).
Aplicaciones de la Función Mod:
Números Seudoaleatorios (2)
Ejemplo: Si m = 11, a = 7, c = 5, y s = 3, entonces

x1 = mod(a*x0 + c,m) = mod(7*3 + 5,11) = 4

x2 = mod(a*x1 + c,m) = mod(7*4 + 5,11) = 0

Continuando los cálculos se obtiene la seceuncia:

x3 = 5, x4 = 7, x5 = 10, x6 = 9, x7 = 2, x8 = 8, x9 = 6, x10 = 3,...


________________________________________________________________
En la práctica, se usan valores grandes para m y a. Los valores que se utilizan
comúnmente son m = 231 − 1 = 2 147 483 647, a = 75 = 16 807 y c = 0, que generan una
secuencia de 231 − 1 enteros antes de repetir un valor.

Nota curiosa: En la década de 1990, Daniel Corriveau de Quebec ganó tres juegos seguidos de un
juego de lotería en computador en Montreal, eligiendo cada vez 19 de 20 números correctamente. Las
posibilidades en contra de esta hazaña son 6 mil millones a 1. Al principio, los oficiales suspicaces se
rehusaron a pagarle. Aunque Corriveau atribuyó su éxito a la teoría del caos, lo que pasó en realidad fue
que siempre que cortaban la energía eléctrica, el generador de números aleatorios iniciaba con la misma
semilla, y generaba la misma sucesión de números aleatorios. El abatido casino pagó al final a Corriveau
los $600,000 que le debían.
Link: http://www.americancasinoguide.com/gambling-stories/costly-casino-mistakes-the-keno-mix-up.html
Aplicaciones de la Función Mod:
Fórmula Autoreferencial de Tupper

DEMO MATLAB:
FormulaTupper.m

Links: http://mathworld.wolfram.com/TuppersSelf-ReferentialFormula.html
https://www.youtube.com/watch?v=_s5RFgd59ao
Aplicaciones de la Función Mod:
Representación de una Imágen Binaria Mediante la Fórmula de Tupper

17 píxeles

106 píxeles
Pasos para representar una imagen con la fórmula de Tupper:

1. Obtener la secuencia correspondiente de bits recorriendo la imagen binaria de abajo hacia arriba y de izquierda a
derecha.
2. Transformar la secuencia binaria al número decimal m.
3. Multiplicar el número decimal por 17: n = 17*m.
4. Reemplazar el valor obtenido para n en la fórmula de Tupper (slide anterior).
Aplicaciones de la Función Mod:
Máximo Común Divisor (Método 2)

Ejemplo: Encontrar el valor de mcd(30,105) usando el algoritmo euclideano.

a = 105 y b = 30
r = mod(a,b) = mod(105,30) = 15 y a = 30 y b = 15
r = mod(a,b) = mod(30,15) = 0 y a = 15 y b = 0 (el algoritmo termina)
mcd(30,105) = a = 15
Aplicaciones de la Función Mod:
Números Primos
Número Primo: Es un entero mayor que 1 cuyos únicos divisores positivos son 1 y
él mismo.

Un entero mayor que 1 que no es primo se llama número compuesto.

Un entero positivo n mayor que 1 es compuesto si y sólo si n tiene un divisor d


que satisface 2 ≤ d ≤ ⌊√n⌋. Si no existe tal número, entonces n es un número primo
y se cumple que mod(n,d)  0.

Ejemplo: Verificar si el número 43 es número primo.

Para determinar si 43 es primo, se verifica si alguno de los números de la


secuencia 2, 3, 4, 5, 6 = ⌊√43⌋ divide a 43. Como ninguno de estos números divide
a 43, entonces 43 es un número primo.
Pequeño Teorema de Fermat
Teorema: Sea n  1 un número entero y p un número primo, entonces se cumple que
np  n (mod p)

Corolario: Sea n  1 un número entero y p un número primo tales que el gcd(n,p) = 1,


entonces se cumple que
np-1  1 (mod p)
Demostración: Enumeremos los primeros (p – 1) múltiplos positivos de n:

S = n, 2n, 3n, ... (p -1)n

(1) Supongamos que r*n y s*n tienen el mismo módulo p, entonces se tiene que r  s (mod p), lo cual
implica que la operación mod(si, p), con siS e i = 1, 2, …, p – 1, da un resultado diferente para cada
elemento de S. (2) Cuando se calcula mod(sk, p), con (sk = k*n)S y k = 1, 2, 3, …, p - 1, se obtiene un
número diferente de 0 porque k no es divisible por p. (3) En esta última operación tampoco se
obtiene p porque si k*n  p (mod p)  k  1 (mod p)  p = 1, lo cual contradice el hecho que p es un
número primo. De (1), (2) y (3) se concluye que los elementos de la secuencia S deben ser
congruentes, en módulo p, con los elementos de la secuencia 1, 2, 3, ..., p – 1 en algún orden.
Multiplicando todas estas congruencias entre si se tiene que

n*2n*3n* ... *(p - 1)n  1*2*3*...*(p - 1) (mod p)

np-1(p – 1)!  (p - 1)! (mod p)  np-1  1 (mod p)


EJERCICIOS DE
DEBER
Resolver en casa los siguientes ejercicios

1. Demostrar que si:

2. Encuentre analíticamente los meses con viernes 13 en


1945.
3. Encuentre analíticamente los meses con viernes 13 en
el presente año.
Resolver en casa los siguientes ejercicios
Resolver en casa los siguientes ejercicios
HASTA LA
PRÓXIMA
CLASE

También podría gustarte