-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPol_Division_de_Ruffini_con_representacion_densa.hs
56 lines (45 loc) · 1.81 KB
/
Pol_Division_de_Ruffini_con_representacion_densa.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
-- Pol_Division_de_Ruffini_con_representacion_densa.hs
-- TAD de los polinomios: Regla de Ruffini con representación densa.
-- José A. Alonso Jiménez <https://jaalonso.github.io>
-- Sevilla, 16-mayo-2023
-- ---------------------------------------------------------------------
-- ---------------------------------------------------------------------
-- Usando el [tipo abstracto de los polinomios](https://bit.ly/3KwqXYu)
-- definir la función
-- ruffiniDensa :: Int -> [Int] -> [Int]
-- tal que (ruffiniDensa r cs) es la lista de los coeficientes del
-- cociente junto con el rsto que resulta de aplicar la regla de Ruffini
-- para dividir el polinomio cuya representación densa es cs entre
-- x-r. Por ejemplo,
-- ruffiniDensa 2 [1,2,-1,-2] == [1,4,7,12]
-- ruffiniDensa 1 [1,2,-1,-2] == [1,3,2,0]
-- ya que
-- | 1 2 -1 -2 | 1 2 -1 -2
-- 2 | 2 8 14 1 | 1 3 2
-- --+-------------- --+-------------
-- | 1 4 7 12 | 1 3 2 0
-- ---------------------------------------------------------------------
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}
module Pol_Division_de_Ruffini_con_representacion_densa where
import Test.QuickCheck
-- 1ª solución
-- ===========
ruffiniDensa :: Int -> [Int] -> [Int]
ruffiniDensa _ [] = []
ruffiniDensa r p@(c:cs) =
c : [x+r*y | (x,y) <- zip cs (ruffiniDensa r p)]
-- 2ª solución
-- ===========
ruffiniDensa2 :: Int -> [Int] -> [Int]
ruffiniDensa2 r =
scanl1 (\s x -> s * r + x)
-- Comprobación de equivalencia
-- ============================
-- La propiedad es
prop_ruffiniDensa :: Int -> [Int] -> Bool
prop_ruffiniDensa r cs =
ruffiniDensa r cs == ruffiniDensa2 r cs
-- La comprobación es
-- λ> quickCheck prop_ruffiniDensa
-- +++ OK, passed 100 tests.