TAD de los polinomios - Derivada de un polinomio
Utilizando el tipo abstracto de datos de los polinomios definir la función
derivada :: (Eq a, Num a) => Polinomio a -> Polinomio a
tal que derivada p
es la derivada del polinomio p
. Por ejemplo,
λ> ejPol = consPol 5 1 (consPol 2 5 (consPol 1 4 polCero)) λ> ejPol x^5 + 5*x^2 + 4*x λ> derivada ejPol 5*x^4 + 10*x + 4
Soluciones
Se usará la función sumaPol
definida en el ejercicio Suma de polinomios.
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
Soluciones en Haskell
import TAD.Polinomio (Polinomio, polCero, consPol, grado, coefLider, restoPol) import Pol_Suma_de_polinomios (sumaPol) import Test.QuickCheck derivada :: (Eq a, Num a) => Polinomio a -> Polinomio a derivada p | n == 0 = polCero | otherwise = consPol (n-1) (b * fromIntegral n) (derivada r) where n = grado p b = coefLider p r = restoPol p -- Propiedad. La derivada de la suma es la suma de las derivadas. prop_derivada :: Polinomio Int -> Polinomio Int -> Bool prop_derivada p q = derivada (sumaPol p q) == sumaPol (derivada p) (derivada q) -- Comprobación -- λ> quickCheck prop_derivada -- OK, passed 100 tests.
Soluciones en Python
from typing import TypeVar from hypothesis import given from src.Pol_Suma_de_polinomios import sumaPol from src.TAD.Polinomio import (Polinomio, coefLider, consPol, grado, polCero, polinomioAleatorio, restoPol) A = TypeVar('A', int, float, complex) def derivada(p: Polinomio[A]) -> Polinomio[A]: n = grado(p) if n == 0: return polCero() b = coefLider(p) r = restoPol(p) return consPol(n - 1, b * n, derivada(r)) # Propiedad. La derivada de la suma es la suma de las derivadas. @given(p=polinomioAleatorio(), q=polinomioAleatorio()) def test_derivada(p: Polinomio[int], q: Polinomio[int]) -> None: assert derivada(sumaPol(p, q)) == sumaPol(derivada(p), derivada(q)) # La comprobación es # > poetry run pytest -q Pol_Derivada_de_un_polinomio.py # 1 passed in 0.46s