Raíces de la ecuación de segundo grado
Definir la función
1 |
raices :: Double -> Double -> Double -> [Double] |
tal que (raices a b c)
es la lista de las raíces reales de la ecuación . Por ejemplo,
1 2 3 |
raices 1 3 2 == [-1.0,-2.0] raices 1 (-2) 1 == [1.0,1.0] raices 1 0 1 == [] |
Comprobar con QuickCheck que la suma de las raíces de la ecuación (con no nulo) es y su producto es .
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
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 |
import Test.QuickCheck raices :: Double -> Double -> Double -> [Double] raices a b c | d >= 0 = [(-b+e)/t,(-b-e)/t] | otherwise = [] where d = b^2 - 4*a*c e = sqrt d t = 2*a -- Para comprobar la propiedad se usará el operador -- (~=) :: (Fractional a, Ord a) => a -> a -> Bool -- tal que (x ~= y) se verifica si x e y son casi iguales; es decir si -- el valor absoluto de su diferencia es menor que una milésima. Por -- ejemplo, -- 12.3457 ~= 12.3459 == True -- 12.3457 ~= 12.3479 == False (~=) :: (Fractional a, Ord a) => a -> a -> Bool x ~= y = abs (x-y) < 0.001 -- La propiedad es prop_raices :: Double -> Double -> Double -> Property prop_raices a b c = a /= 0 && not (null xs) ==> sum xs ~= (-b/a) && product xs ~= (c/a) where xs = raices a b c -- La comprobación es -- λ> quickCheck prop_raices -- +++ OK, passed 100 tests. |
El código se encuentra en GitHub.
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 |
from math import sqrt from hypothesis import given, assume, strategies as st def raices(a: float, b: float, c: float) -> list[float]: d = b**2 - 4*a*c if d >= 0: e = sqrt(d) t = 2*a return [(-b+e)/t, (-b-e)/t] return [] # Para comprobar la propiedad se usará la función # casiIguales : (float, float) -> bool # tal que casiIguales(x, y) se verifica si x e y son casi iguales; es # decir si el valor absoluto de su diferencia es menor que una # milésima. Por ejemplo, # casiIguales(12.3457, 12.3459) == True # casiIguales(12.3457, 12.3479) == False def casiIguales(x: float, y: float) -> bool: return abs(x - y) < 0.001 # La propiedad es @given(st.floats(min_value=-100, max_value=100), st.floats(min_value=-100, max_value=100), st.floats(min_value=-100, max_value=100)) def test_prop_raices(a, b, c): assume(abs(a) > 0.1) xs = raices(a, b, c) assume(xs) [x1, x2] = xs assert casiIguales(x1 + x2, -b / a) assert casiIguales(x1 * x2, c / a) # La comprobación es # src> poetry run pytest -q raices_de_la_ecuacion_de_segundo_grado.py # 1 passed in 0.35s |
El código se encuentra en GitHub.