Proyecto Clases de Tipos: Polinomios

Documentos relacionados
Tema 7. El sistema de clases

Tema 3: Tipos y clases

Tema 3: Tipos y clases

UNIDAD DOS FACTORIZACIÓN

Aritmética de Enteros

EXPRESIONES ALGEBRAICAS. POLINOMIOS

Eje temático: Álgebra y funciones Contenidos: Raíces cuadradas y cúbicas - Racionalización Ecuaciones irracionales. Nivel: 3 Medio

Conversión entre Tipos

Operaciones con monomios y polinomios


EL LENGUAJE ALGEBRAICO

Vamos a ver por separado las operaciones básicas con expresiones algebraicas para monomios y polinomios.

Representación Gráfica (recta numérica)

2. EXPRESIONES ALGEBRAICAS

Expresiones Algebraicas en los Números Reales

Universidad de Puerto Rico en Arecibo Departamento de Matemáticas Sec. 5.1: Polinomios

LOS NUMEROS IRRACIONALES Y SU REPRESENTACIÓN EN LA RECTA NUMERICA

24 = = = = = 12. 2

Introducción al Álgebra

Matemáticas 2º E.S.P.A. Pág.1 C.E.P.A. Plus Ultra. Logroño

EXPRESIONES ALGEBRAICAS EXPRESIONES ALGEBRAICAS Y POLINOMIOS

TEMA 3 POTENCIAS Y RAÍCES

MATEMÁTICAS ÁLGEBRA (TIC)

RADICACIÓN EN LOS REALES

Los números enteros. Dado que los enteros contienen los enteros positivos, se considera a los números naturales son un subconjunto de los enteros.

Opuesto de un número +3 + (-3) = (+5) = 0. N = 0,1, 2,3,4, Conjunto de los números naturales

Factorización ecuación identidad condicional término coeficiente monomio binomio trinomio polinomio grado ax3

Conoce y representa fracciones de manera gráfica usando figuras geométricas regulares.

Datos y tipos de datos

Elementos de un programa en C

Lección 5: Ecuaciones con números naturales

Trabajo Práctico Nro. 1

Universidad de Puerto Rico en Arecibo Departamento de Matemáticas Expresiones Algebraicas y Polinomios

1. NUMEROS REALES a. Los Números Reales

TEMA 1.- POLINOMIOS Y FRACCIONES ALGEBRAICAS

Métodos que devuelven valor Dado el siguiente triángulo rectángulo:

NÚMEROS ENTEROS. En la recta numérica se pueden representar los números naturales, el cero y los números negativos.

La lección de hoy es sobre resolver valores absolutos por Inecualidades. El cuál es la expectativa para el aprendizaje del estudiante SEI.2.A1.

GUION TÉCNICO AUDIO. Propiedades de Campo y Orden de los Números Reales (1). estructurados, y ello les obliga a "funcionar" o a

FACTORIZACIÓN. De acuerdo con lo anterior, el resultado de una factorización siempre será un producto.

4 CAJA DE POLINOMIOS C A P Í T U L O 4.1 MANUAL BÁSICO DE LA CAJA DE POLINOMIOS

Curso Completo de Electrónica Digital

Desde los programas más simples escritos en un lenguaje de programación suelen realizar tres tareas en forma secuencial.

TEMA 2 FRACCIONES MATEMÁTICAS 2º ESO

Algoritmos y programas. Algoritmos y Estructuras de Datos I

Todo programa en 'C' consta de una o más funciones, una de las cuales se llama main.

CAPÍTULO 3: PORCIONES Y NÚMEROS ENTEROS

Operaciones de números racionales

El Teorema Fundamental del Álgebra

TEMA 1 CONJUNTOS NUMÉRICOS

Ficha de Aprendizaje N 13

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

FUNCIONES PHP: DECLARACIÓN Y LLAMADAS. PARÁMETROS, RETURN. EJERCICIOS EJEMPLOS RESUELTOS. (CU00827B)

Representación de la Información.... en los Computadores

Es toda la información que utiliza el computador. Según sea la información que guardemos en los datos, se clasifican en los siguientes tipos:

Prueba de Aptitud Académica. Profesor José A. Barreto G. Caracas Venezuela

Carlos Montenegro. Programación Orientada a Objetos Proyecto Curricular de Ingeniería de Sistemas

Colegio San Patricio A Incorporado a la Enseñanza Oficial Fundación Educativa San Patricio

Materia: Matemática de Octavo Tema: Conjunto Q (Números Racionales)

TEMA: FACTORIZACIÓN MAXIMO COMÚN DIVISOR (MCD) DE EXPRESIONES ALGEBRAICAS

TEMA 2. POLINOMIOS Y FRACCIONES ALGEBRAICAS

1. El sistema de los números reales

Espacios Vectoriales

Lección 10: División de Polinomios. Dra. Noemí L. Ruiz Limardo 2009

Tipos algebraicos y abstractos. Algoritmos y Estructuras de Datos I. Tipos algebraicos

1. dejar a una lado de la igualdad la expresión que contenga una raíz.

Multiplicación Algebraica

RECONOCER EL GRADO, EL TÉRMINO Y LOS COEFICIENTES DE UN POLINOMIO

Ámbito Científico-Tecnológico Módulo III Bloque 3 Unidad 3 Las letras y los números: un cóctel perfecto

MATEMÁTICAS 1º DE ESO

$0 Representa al parámetro cero o nombre del programa $1 Representa al parámetro uno $2 Representa al parámetro dos

MATE IV Serie Álgebra 2015/01/26 NOMENCLATURA ALGEBRAICA

SUMADOR RESTADOR DE 3 BITS EN BINARIO NATURAL.

MONOMIOS Y POLINOMIOS

Números reales Conceptos básicos Algunas propiedades

Factorización de polinomios FACTORIZACIÓN DE POLINOMIOS

Materia: Matemática de Octavo Tema: Operaciones en Q Adición de fracciones con diferente denominador

POLINOMIOS Y FRACCIONES ALGEBRAICAS

Vamos a profundizar un poco sobre los distintos tipos de datos que podemos introducir en las celdas de una hoja de cálculo

REPASO DE Nºs REALES y RADICALES

Lección 2: Notación exponencial

SISTEMAS DE NUMERACION

Los Números Enteros (Z)

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Tabla de Contenidos. Resolviendo Ecuaciones. Operaciones Inversas. Slide 1 / 107. Slide 2 / 107. Slide 4 / 107. Slide 3 / 107.

Slide 1 / 107. Resolviendo Ecuaciones

Materia: Matemática de séptimo Tema: El Concepto de Fracciones

FICHAS REPASO 3º ESO. Para restar números enteros, se suma al minuendo el opuesto del sustraendo y después se aplican las reglas de la suma.

Destrezas algebraicas: de lo concreto a lo abstracto MARIA DE L. PLAZA BOSCANA

Los Conjuntos de Números

GUIA DE APRENDIZAJE No.01 Actividades Ejercicio No.1 Ingrese a Microsoft Excel y guarde el archivo con el nombre de EVIDENCIA 1.

Ámbito Científico-Tecnológico Módulo IV Bloque 2 Unidad 1 Tan real como la vida misma

En este artículo vamos a conocer los tipos de datos que podemos manejar programando en C.

RAMÓN GALÁN GONZÁLEZ

Los números naturales están ordenados, lo que nos permite comparar dos números naturales:

El número áureo,, utilizado por artistas de todas las épocas (Fidias, Leonardo da Vinci, Alberto Durero, Dalí,..) en las proporciones de sus obras.

Qué son los monomios?

Transcripción:

Proyecto Clases de Tipos: Polinomios Preparación Bajar el archivo pre-llenado: Poly.hs. Qué es un número? Parece una pregunta profunda y filosófica, pero el sistema de tipos de Haskell nos da una respuesta simple. Un número es cualquier tipo que tiene una instancia de la clase de tipos Num. Veamos la definición de Num: class Num a where (+), (-), (*) :: a -> a -> a negate :: a -> a abs :: a -> a signum :: a -> a frominteger :: Integer -> a Entonces, para Haskell, un número es simplemente algo que puede ser sumado, restado, multiplicado, negado, etc. (La división no es parte de la clase Num a propósito, dado que es definida de manera distinta para los enteros y los flotantes.) El Prelude de Haskell viene con varias instancias de Num que ya conocemos. Incluyen los sospechosos de siempre: Int, Integer, Float y Double. Pero la diversión no termina acá. Podemos definir nuestros propios números, del momento que podemos proveer definiciones sensatas para las operaciones numéricas básicas. Polinomios Un polinomio puede ser un número? Cómo no! Los polinomios pueden sumarse, restarse y multiplicarse como cualquier otro número. En estos ejercicios, vamos a escribir una instancia de Num para un tipo de polinomios. Antes de empezar, definamos una representación de los polinomios que vamos a usar en los ejercicios. Un polinomio es simplemente una secuencia de términos, y cada término tiene un 1

coeficiente y un grado. Por ejemplo, el polinomio x 2 + 5x + 3 tiene tres términos, uno de grado 2 con coeficiente 1, uno de grado 1 con coeficiente 5, y uno de grado 0 con coeficiente 3. En Haskell, vamos a evitar de especificar explicitamente los grados, y vamos a representar un polinomio como una lista de coeficientes, cada uno teniendo un grado igual a su posición en la lista. Vamos a permitir que el tipo de los coeficientes sea polimórfico, así podemos tener coeficientes que sean de tipo Int, Double, etc. data Poly a = P [a] En esta representación, el polinomio x 2 + 5x + 3 se escribe P [3, 5, 1]. Ejercicio 1 Observamos que nuestro tipo Poly a no deriva las clases Eq y Show. Hay una excelente razón para eso! Las instancias por defecto de esas clases de tipo no funcionarían tal como quisieramos. En este ejercicio, vamos a escribir una instancia de la clase Eq para el Poly a. Si hubieramos derivado esa instancia, Haskell simplemente compararía las listas dentro del constructor P. Pensemos en porqué esto no alcanza. Cuándo es el caso que dos Poly son equivalentes, pero sus representaciones en lista no lo son? Implementar la función (==). Acordarse que no es necesario implementar explicitamente la función (/=); tiene una implementation por defecto en términos de (==). Ejemplos: P [1, 2, 3] == P [1, 2, 3] P [1, 2] /= P [1, 2, 3] Algunas funciones útiles pueden ser takewhile, dropwhile, reverse... Ejercicio 2 La instancia por defecto de Show muestra simplemente valores tal como están escritos en Haskell. Sería mucho mejor si un Poly a como P [1, 2, 3] pudiera ser mostrado de manera más legible por un humano, como 3xˆ2 + 2x + 1. Esto facilitaría mucho razonar sobre su código a través de estos ejercicios. Una instancia completa del tipo Show tendrá las características siguientes: los términos son mostrados como cxˆe donde c es el coeficiente y e es el exponente. Si e es 0, entonces se muestra solo el coeficiente. Si e es 1, entonces el formato es simplemente cx. los términos son separados por el símbolo + con un solo espacio de cada lado los términos son listados en orden decreciente de grado 2

los términos que tienen coeficiente 0 no se muestran, salvo si el polinomio es igual a 0 ningún coeficiente se muestra para un término cuyo coeficiente es 1, (o sea x en lugar de 1x), salvo si su grado es 0 ningún tratamiento especial es necesario para los términos con coeficiente negativo. Por ejemplo, 2xˆ2 + -3 es la representación correcta de 2x 2 3. Implementar la función show según esta especificación. Ejemplos: show (P [1, 0, 0, 2]) == "2x^3 + 1" show (P [0, -1, 2]) == "2x^2 + -x" Algunas funciones útiles pueden ser: zip, reverse, intercalate (del módulo Data.List)... Ejercicio 3 Ahora vamos a definir la suma para el tipo Poly a. La suma para polinomios es bastante simple, todo lo que tenemos que hacer es sumar los pares de coeficientes para cada grado de los dos polinomios. Por ejemplo, (x 2 + 5) + (2x 2 + x + 1) = 3x 2 + x + 6. Se considera como buen estilo Haskell definir las funciones importantes fuera de la instancia de clase de tipo. Por esa razón, vamos a escribir la función plus que suma dos valores de tipo Poly a: plus :: Num a => Poly a -> Poly a -> Poly a Observamos que el protótipo de plus indica la restricción que a tiene una instancia Num. Esto significa que solo podemos sumar polinomios que tienen coeficientes numéricos. Como a tiene que ser un Num, podemos usar todas las funciones Num usuales (i.e., (+)) sobre los coeficientes de los polinomios. Ejemplos: P [5, 0, 1] + P [1, 1, 2] == P [6, 1, 3] P [1, 0, 1] + P [1, 1] == P [2, 1, 1] Ejercicio 4 En este ejercicio vamos a implementar la multiplicación de polinomios. Para multiplicar dos polinomios, cada término del primer polinomio debe ser multiplicado por cada término del segundo. La manera más simple de lograr esto es de construir un [Poly a] donde cada elemento es el polinomio que resulta de la multiplicación de un solo coeficiente en el primer polinomio por cada coeficiente en el segundo. 3

Dado que los términos no dicen explicitamente sus exponentes, vamos a tener que desplazar la salida antes de multiplicarla por cada coeficiente consecutivo. Por ejemplo, P [1, 1, 1] * P [2, 2] va a producir la lista [P [2, 2], P [0, 2, 2], P [0, 0, 2, 2]]. Luego, podemos simplemente sumar esta lista. La función sum de Haskell es definida en términos de (+), pero también utiliza el literal numérico 0. Si queremos usar la función sum entonces tenemos que implementar la función frominteger en la instancia de Num para Poly a primero (lo vamos a hacer en el próximo ejercicio de todos modos). Sino, podemos también usar foldr (+) (P [0]) en lugar de sum hasta que implementemos frominteger Implementar la función: times :: Num a => Poly a -> Poly a -> Poly a Ejemplo: P [1, 1, 1] * P [2, 2] == P [2, 4, 4, 2] Ejercicio 5 Ya llegó la hora de completar nuestra definición de la instancia Num para los polinomios. Las funciones (+) y (*) ya fueron completadas en los ejercicios anteriores. Solo necesitamos implementar dos funciones más. La primera función que vamos a implementar es negate. Esta función debe devolver la negación de un Poly a. En otros términos, el resultado de negar todos sus términos. Observamos que (-) falta a nuestra definición de instancia de Num. Esto se debe a que la clase de tipo Num tiene una implementación por defecto de (-) en términos de (+) y negate, entonces no tenemos que implementarla. negate :: Num a => Poly a -> Poly a Ejemplo: negate (P [1, 2, 3]) == P [-1, -2, -3] Luego, implementar frominteger. Esta función debe tomar un Integer y devolver un Poly a. Un entero (o cualquier número estandard) se puede ver como un polinomio de grado 0. Acordémonos que tenemos que convertir ese Integer a un valor de tipo a antes de poder usarlo como coeficiente en un polinomio. frominteger :: Num a => Integer -> Poly a La clase de tipo Num tiene dos funciones más que no tienen realmente sentido para los polinomios (capaz que los polinomios no son números, después de todo... ). 4

Esas funciones son absy signum. Las vamos a dejar como undefined dado que el valor absoluto de un polinomio no es un polinomio, y los polinomios no tienen realmente un signo. Ejercicio 6 Ahora queremos poder escribir expresiones como 3xˆ2 + xˆ2 + 8, y que sea interpretado como polinomio por Haskell, directamente. Primero necesitamos hacer un truco para que x sea interpretado como esperamos. Agregar la definición para el tipo siguiente: x :: Num a => Poly Agregar la definición correspondiente para que x sea el polinomio x. Ahora que hemos terminado de definir una instancia Num para el tipo Poly a, podemos dejar de usar la sintaxis en lista de coeficientes. En Haskell, el polinomio x 2 + 5x + 3 se puede escribir xˆ2 + 5*x + 3 porque los valores x, 5 y 3 son todos valores válidos del tipo Poly Int, y hemos definido (+) y (*) como parte de la instancia Num para polinomios. Observamos que ahora podemos usar (ˆ) para la exponenciación, por más que no lo hayamos implementado. En Haskell, (ˆ) es definido en términos de (*), por lo cual lo tenemos gratis. Definir la función applyp que aplica un Poly a a un valor de tipo a: applyp (x^2 + 2*x + 1) 1 == 4 applyp (x^2 + 2*x + 1) 2 == 9 Fuente Introduction to Haskell, Homework 4, University of Pennsylvania 5