-
Notifications
You must be signed in to change notification settings - Fork 1
/
Pol_Transformaciones_polinomios_densas.hs
134 lines (106 loc) · 4.64 KB
/
Pol_Transformaciones_polinomios_densas.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
-- Pol_Transformaciones_polinomios_densas.hs
-- TAD de los polinomios: Transformaciones entre polinomios y listas densas.
-- José A. Alonso Jiménez <https://jaalonso.github.io>
-- Sevilla, 21-abril-2023
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
-- Utilizando el [tipo abstracto de datos de los polinomios]
-- (https://bit.ly/3KwqXYu) definir las funciones
-- densaApolinomio :: (Num a, Eq a) => [a] -> Polinomio a
-- polinomioAdensa :: (Num a, Eq a) => Polinomio a -> [a]
-- tales que
-- + (densaApolinomio xs) es el polinomio cuya representación densa es
-- xs. Por ejemplo,
-- λ> densaApolinomio [9,0,0,5,0,4,7]
-- 9*x^6 + 5*x^3 + 4*x + 7
-- + (polinomioAdensa c) es la representación densa del polinomio p. Por
-- ejemplo,
-- λ> ejPol = consPol 6 9 (consPol 3 5 (consPol 1 4 (consPol 0 7 polCero)))
-- λ> ejPol
-- 9*x^6 + 5*x^3 + 4*x + 7
-- λ> polinomioAdensa ejPol
-- [9,0,0,5,0,4,7]
--
-- Comprobar con QuickCheck que ambas funciones son inversas.
-- ---------------------------------------------------------------------
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
module Pol_Transformaciones_polinomios_densas where
import TAD.Polinomio (Polinomio, polCero, esPolCero, consPol, grado,
coefLider, restoPol)
import Pol_Transformaciones_dispersa_y_densa (densaAdispersa,
dispersaAdensa)
import Pol_Transformaciones_polinomios_dispersas (dispersaApolinomio,
polinomioAdispersa)
import Pol_Coeficiente (coeficiente)
import Data.List (sort, nub)
import Test.QuickCheck
-- 1ª definición de densaApolinomio
-- ================================
densaApolinomio :: (Num a, Eq a) => [a] -> Polinomio a
densaApolinomio [] = polCero
densaApolinomio (x:xs) = consPol (length xs) x (densaApolinomio xs)
-- 2ª definición de densaApolinomio
-- ================================
densaApolinomio2 :: (Num a, Eq a) => [a] -> Polinomio a
densaApolinomio2 = dispersaApolinomio . densaAdispersa
-- La función densaAdispersa está definida en el ejercicio
-- "Transformaciones entre las representaciones dispersa y densa" que se
-- encuentra en https://bit.ly/3GTyIqe
-- La función dispersaApolinomio se encuentra en el ejercicio
-- "Transformaciones entre polinomios y listas dispersas" que se
-- encuentra en https://bit.ly/41GgQaB
-- Comprobación de equivalencia de densaApolinomio
-- ===============================================
-- La propiedad es
prop_densaApolinomio :: [Int] -> Bool
prop_densaApolinomio xs =
densaApolinomio xs == densaApolinomio2 xs
-- La comprobación es
-- λ> quickCheck prop_densaApolinomio
-- +++ OK, passed 100 tests.
-- 1ª definición de polinomioAdensa
-- ================================
polinomioAdensa :: (Num a, Eq a) => Polinomio a -> [a]
polinomioAdensa p
| esPolCero p = []
| otherwise = [coeficiente k p | k <- [n,n-1..0]]
where n = grado p
-- La función coeficiente está definida en el ejercicio
-- "Coeficiente del término de grado k" que se encuentra en
-- https://bit.ly/413l3oQ
-- 2ª definición de polinomioAdensa
-- ================================
polinomioAdensa2 :: (Num a, Eq a) => Polinomio a -> [a]
polinomioAdensa2 = dispersaAdensa . polinomioAdispersa
-- La función dispersaAdensa está definida en el ejercicio
-- "Transformaciones entre las representaciones dispersa y densa" que se
-- encuentra en https://bit.ly/3GTyIqe
-- La función polinomioAdispersa se encuentra en el ejercicio
-- "Transformaciones entre polinomios y listas dispersas" que se
-- encuentra en https://bit.ly/41GgQaB
-- Comprobación de equivalencia de polinomioAdensa
-- ===============================================
-- La propiedad es
prop_polinomioAdensa :: Polinomio Int -> Bool
prop_polinomioAdensa p =
polinomioAdensa p == polinomioAdensa2 p
-- La comprobación es
-- λ> quickCheck prop_polinomioAdensa
-- +++ OK, passed 100 tests.
-- Propiedades de inversa
-- ======================
-- La primera propiedad es
prop_polinomioAdensa_densaApolinomio :: [Int] -> Bool
prop_polinomioAdensa_densaApolinomio xs =
polinomioAdensa (densaApolinomio xs') == xs'
where xs' = dropWhile (== 0) xs
-- La comprobación es
-- λ> quickCheck prop_polinomioAdensa_densaApolinomio
-- +++ OK, passed 100 tests.
-- La segunda propiedad es
prop_densaApolinomio_polinomioAdensa :: Polinomio Int -> Bool
prop_densaApolinomio_polinomioAdensa p =
densaApolinomio (polinomioAdensa p) == p
-- La comprobación es
-- λ> quickCheck prop_densaApolinomio_polinomioAdensa
-- +++ OK, passed 100 tests.