Aritmética en Haskell

Documentos relacionados
Manos a la obra: Recursión, división y listas

Algoritmo de Euclides y ecuaciones de congruencia

Divisibilidad y congruencia

Listas y Recursión. Taller de Álgebra I. Primer Cuatrimestre de 2015

Números primos y criterios de divisibilidad

Euclides Extendido y Teorema Chino del Resto

ALGEBRA I - Práctica N 4 (Primera parte) - Primer cuatrimestre de Números enteros

Algoritmo de Euclides

Aritmética entera. AMD Grado en Ingeniería Informática. AMD Grado en Ingeniería Informática (UM) Aritmética entera 1 / 15

El Algoritmo de Euclides

1.1 Define un operador ( ) que devuelva True si y solo si tan solo uno de sus argumentos es True. Por ejemplo:? (3 > 2) (2 > 5)

Números primos en Haskell

UNIDAD 1. Números naturales y enteros 1º ESO. Contenidos, objetivos y criterios de evaluación DEPARTAMENTO DE MATEMÁTICAS

Relaciones de orden. Definición 1. Llamamos conjunto ordenado a un par (E, ) donde E es un conjunto y es un orden definido en E

Algoritmos en teoría de números

Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática

Tema 1 Aritmética entera

Divisibilidad (en N = N {0})

Tipos de datos algebraicos

Estructura de datos y de la información Boletín de problemas - Tema 9

Guia para el exámen parcial 1 - unas soluciones

PROGRAMACION ALGORITMOS Y ESTRUCTURAS DE DATOS PRACTICA N 4

Capitulo 4. Introducción a Haskell. Instalación de Haskell. Primeros pasos con Haskell.

La recursividad forma parte del repertorio para resolver problemas en Computación y es de los métodos más poderosos y usados.

OCW-V.Muto Sistemas de numeración Cap. III CAPITULO III. SISTEMAS DE NUMERACION 1. REPRESENTACION DE LA INFORMACION

Álgebra I Práctica 3 - Números enteros (Parte 1)

El algoritmo de Euclides con residuos de menor valor absoluto

Práctica 2 - Ejercicio 2.8

Índice La División Entera El Máximo Común Divisor Algoritmo de Euclides Ecuaciones Diofánticas Factorización. Aritmética I.

Ecuaciones de recurrencia. Abraham Sánchez López FCC/BUAP Grupo MOVIS

Recursión. Capítulo 4

Ecuaciones Diofánticas

1. Escribir un algoritmo que resuelva A-B*((B+C) / (C-C 2 ). Considerar que no es posible la división por 0, detectar este caso y salvar el error.

Recursividad Definición

Aritmética Entera MATEMÁTICA DISCRETA I. F. Informática. UPM. MATEMÁTICA DISCRETA I () Aritmética Entera F. Informática.

ARITMÉTICA ENTERA LOS NÚMEROS ENTEROS. = {..., n,..., 3, 2, 1, 0, 1, 2, 3,..., n,...} (Zahlen, en alemán, números)

Aritmética modular. AMD Grado en Ingeniería Informática. AMD Grado en Ingeniería Informática (UM) Aritmética modular 1 / 16

Enteros Primera parte.

Álgebra I Práctica 5 - Polinomios

11 Secuencias, Series y Probabilidad

Mecanismo de Reducción

Álgebra y Matemática Discreta

Introducción al Análisis del Coste de Algoritmos

ESCUELA PREPARATORIA OFICIAL NO.16 MATERÍA: PENSAMIENTO NUMÉRICO Y ALGEBRAICO I

Valentín Moreno Programación en FORTRAN ESQUEMA DE SELECCIÓN

Conjuntos Numéricos I

DIVISIBILIDAD: Resultados

Introducción a la Teoría de Números

RECORDAR TIPOS DE DATOS

Teoría de números. Herbert Kanarek Universidad de Guanajuato Enero Junio Eugenio Daniel Flores Alatorre

Aritmética. 7. Si MCD(a; ab)=b, cuántos valores toma ab? 8. Si el MCD(abaa; ac(a 1)(a+2))=28, además MCM(abaa; ac(a 1)(a+2))=...

a) Si ch tiene el valor X y numero el valor 5, cuál sería el efecto de ejecutar cada una de las siguientes llamadas al procedimiento:

Tipos de datos en Haskell

Introducción a la Matemática Discreta

Álgebra y Matemática Discreta

Dra. Jessica Andrea Carballido

Algoritmos y Estructuras de Datos: Introducción a la Recursión de Programas. Guillermo Román Díez

Teoría de Números. Orlando Ochoa Castillo 25 de septiembre de 2011

Capítulo IV. Divisibilidad y Primalidad. Algoritmo de la División

Práctica 5.- Recursividad

Álgebra I Práctica 5 - Polinomios

Complejidad de algoritmos recursivos

Lección 4.2. Sucesiones Infinitas y Notación de Suma. Prof. José G. Rodríguez Ahumada 1 de 18

Dulcinea Raboso 18 de Noviembre, 2017

DIVISIBILIDAD NÚMEROS NATURALES

Álgebra y Matemática Discreta

Temario. Tipos de recursión. Eficiencia y recursión

Exponencial, lineal y logarítmico

Las demostraciones de las propiedades (1) y (2) quedan a cargo del estudiante.

MEL* Ejercicios - Inducción 1

Trabajo Práctico Nº 13 Tema: RECURSIVIDAD

3.3 (parte II) División de números cardinales

UNIDAD 2. MÚLTIPLOS Y DIVISORES

open green road Guía Matemática MÚLTIPLOS Y DIVISORES profesor: Nicolás Melgarejo .cl

Programación 2. Lección 3. Introducción a la recursividad

Ejercicio 4. Graficar los siguientes conjuntos en el plano complejo:

Álgebra I Práctica 7 - Polinomios

Univ. Nacional de Colombia, Medellín Escuela de Matemáticas Matemáticas Discretas Marzo 8, Soluciones Taller 5

6. Estructuras básicas de control 1. Pseudocódigo

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Transcripción:

Aritmética en Haskell Taller de Álgebra I Primer cuatrimestre de 2014

Algoritmo de división Para obtener el cociente y resto entre dos números enteros, tenemos las funciones div y mod, respectivamente.

Algoritmo de división Para obtener el cociente y resto entre dos números enteros, tenemos las funciones div y mod, respectivamente. Sin embargo, no necesitamos que estas funciones sean primitivas, sino que... podemos programarlas nosotros mismos!

Algoritmo de división Para obtener el cociente y resto entre dos números enteros, tenemos las funciones div y mod, respectivamente. Sin embargo, no necesitamos que estas funciones sean primitivas, sino que... podemos programarlas nosotros mismos! Esto corresponde a programar algún algoritmo de división...

Algoritmo de división Para obtener el cociente y resto entre dos números enteros, tenemos las funciones div y mod, respectivamente. Sin embargo, no necesitamos que estas funciones sean primitivas, sino que... podemos programarlas nosotros mismos! Esto corresponde a programar algún algoritmo de división... Alguna idea?

Algoritmo de división Para obtener el cociente y resto entre dos números enteros, tenemos las funciones div y mod, respectivamente. Sin embargo, no necesitamos que estas funciones sean primitivas, sino que... podemos programarlas nosotros mismos! Esto corresponde a programar algún algoritmo de división... Alguna idea? Idea: Para calcular div n m podemos usar la fórmula recursiva: { 0 si n < m div n m = 1 + div (n-m) m si n m

Algoritmo de división Para obtener el cociente y resto entre dos números enteros, tenemos las funciones div y mod, respectivamente. Sin embargo, no necesitamos que estas funciones sean primitivas, sino que... podemos programarlas nosotros mismos! Esto corresponde a programar algún algoritmo de división... Alguna idea? Idea: Para calcular div n m podemos usar la fórmula recursiva: { 0 si n < m div n m = 1 + div (n-m) m si n m Cómo sería el código Haskell?

Algoritmo de división Para obtener el cociente y resto entre dos números enteros, tenemos las funciones div y mod, respectivamente. Sin embargo, no necesitamos que estas funciones sean primitivas, sino que... podemos programarlas nosotros mismos! Esto corresponde a programar algún algoritmo de división... Alguna idea? Idea: Para calcular div n m podemos usar la fórmula recursiva: { 0 si n < m div n m = 1 + div (n-m) m si n m Cómo sería el código Haskell? Cómo calculamos el resto?

Algoritmo de Euclides El Algoritmo de Euclides calcula el máximo común divisor entre dos números a, b Z +.

Algoritmo de Euclides El Algoritmo de Euclides calcula el máximo común divisor entre dos números a, b Z +. Recordemos el algoritmo en su versión imperativa: 1 r 0 := a; 2 r 1 := b; 3 Mientras r i 0, hacer: 4 r i+1 := r i 1 mod r i ; 5 i := i + 1; 6 Fin 7 El resultado es r i 1 ;

Algoritmo de Euclides Cómo sería en Haskell?

Algoritmo de Euclides Cómo sería en Haskell? mcd :: Int -> Int -> Int

Algoritmo de Euclides Cómo sería en Haskell? mcd :: Int -> Int -> Int mcd a 0 = a

Algoritmo de Euclides Cómo sería en Haskell? mcd :: Int -> Int -> Int mcd a 0 = a mcd a b = mcd b (mod a b)

Algoritmo de Euclides Cómo sería en Haskell? mcd :: Int -> Int -> Int mcd a 0 = a mcd a b = mcd b (mod a b) El peor caso del algoritmo se obtiene cuando a y b son dos números consecutivos de la sucesión de Fibonacci (Lamé, 1795 1870).

Algoritmo de Euclides Cómo sería en Haskell? mcd :: Int -> Int -> Int mcd a 0 = a mcd a b = mcd b (mod a b) El peor caso del algoritmo se obtiene cuando a y b son dos números consecutivos de la sucesión de Fibonacci (Lamé, 1795 1870). En general, el número de divisiones que realiza el algoritmo nunca supera 5 veces el número de dígitos de a y b, con lo cual la cantidad de llamadas recursivas está acotada por 5 log 10 (a).

Cambio de base en Haskell Problema: Dados a, b Z + con b > 1, escribir el número a en base b.

Cambio de base en Haskell Problema: Dados a, b Z + con b > 1, escribir el número a en base b. Por ejemplo... 1 Si a = 10 y b = 2, entonces la respuesta es 1010 2. 2 Si a = 17 y b = 3, entonces la respuesta es 122 3. 3 Si a = 145 y b = 10, entonces la respuesta es 145 10.

Cambio de base en Haskell Problema: Dados a, b Z + con b > 1, escribir el número a en base b. Por ejemplo... 1 Si a = 10 y b = 2, entonces la respuesta es 1010 2. 2 Si a = 17 y b = 3, entonces la respuesta es 122 3. 3 Si a = 145 y b = 10, entonces la respuesta es 145 10. Cómo lo haríamos en Haskell si representamos la salida como una lista de enteros?

Cambio de base en Haskell Problema: Dados a, b Z + con b > 1, escribir el número a en base b. Por ejemplo... 1 Si a = 10 y b = 2, entonces la respuesta es 1010 2. 2 Si a = 17 y b = 3, entonces la respuesta es 122 3. 3 Si a = 145 y b = 10, entonces la respuesta es 145 10. Cómo lo haríamos en Haskell si representamos la salida como una lista de enteros? Cómo cambiamos el programa si queremos representar la salida como una cadena de caracteres?

Cambio de base en Haskell Problema: Dados a, b Z + con b > 1, escribir el número a en base b. Por ejemplo... 1 Si a = 10 y b = 2, entonces la respuesta es 1010 2. 2 Si a = 17 y b = 3, entonces la respuesta es 122 3. 3 Si a = 145 y b = 10, entonces la respuesta es 145 10. Cómo lo haríamos en Haskell si representamos la salida como una lista de enteros? Cómo cambiamos el programa si queremos representar la salida como una cadena de caracteres? Qué problema tiene esta representación si luego queremos usar el resultado para cálculos posteriores?

Ejercicios 1 Consideremos la sucesión t 1, t 2,..., tal que t n es la cantidad de llamadas recursivas del Algoritmo de Euclides cuando se ejecuta con a = F n y b = F n 1 (donde F n representa el n-ésimo número de Fibonacci). Escribir un programa que tome como parámetro un entero n y que retorne t n. 2 Graficar la sucesión t 1, t 2,... definida en el ejercicio anterior. 3 Escribir un programa que tome un entero b > 1 y un entero a representado en base b (expresado como una lista de enteros) y que retorne un Int con el entero a. 4 Escribir un programa que tome un entero b > 1 y un entero a representado en base b (expresado como una lista de enteros) y que retorne una lista de enteros con el entero representado en base 10.