Raíces de la ecuación de segundo grado
Definir la función
raices :: Double -> Double -> Double -> [Double]
tal que (raices a b c)
es la lista de las raíces reales de la ecuación [latex]ax^2 + bx + c = 0[/latex]. Por ejemplo,
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 [latex]ax^2 + bx + c = 0[/latex] (con [latex]a[/latex] no nulo) es [latex]\dfrac{-b}{a}[/latex] y su producto es [latex]\dfrac{c}{a}[/latex].
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
Soluciones en Haskell
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.
Soluciones en Python
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.