Números racionales
Los números racionales pueden representarse mediante pares de números enteros. Por ejemplo, el número 2/5 puede representarse mediante el par (2,5).
Definir las funciones
formaReducida :: (Int,Int) -> (Int,Int) sumaRacional :: (Int,Int) -> (Int,Int) -> (Int,Int) productoRacional :: (Int,Int) -> (Int,Int) -> (Int,Int) igualdadRacional :: (Int,Int) -> (Int,Int) -> Bool
tales que
-
formaReducida x
es la forma reducida del número racionalx
. Por ejemplo,
formaReducida (4,10) == (2,5) formaReducida (0,5) == (0,1)
-
sumaRacional x y
es la suma de los números racionalesx
ey
, expresada en forma reducida. Por ejemplo,
sumaRacional (2,3) (5,6) == (3,2) sumaRacional (3,5) (-3,5) == (0,1)
-
productoRacional x y
es el producto de los números racionalesx
ey
, expresada en forma reducida. Por ejemplo,
productoRacional (2,3) (5,6) == (5,9)
-
igualdadRacional x y
se verifica si los números racionalesx
ey
son iguales. Por ejemplo,
igualdadRacional (6,9) (10,15) == True igualdadRacional (6,9) (11,15) == False igualdadRacional (0,2) (0,-5) == True
Comprobar con QuickCheck la propiedad distributiva del producto racional respecto de la suma.
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
Soluciones en Haskell
import Test.QuickCheck formaReducida :: (Int,Int) -> (Int,Int) formaReducida (0,_) = (0,1) formaReducida (a,b) = (a `div` c, b `div` c) where c = gcd a b sumaRacional :: (Int,Int) -> (Int,Int) -> (Int,Int) sumaRacional (a,b) (c,d) = formaReducida (a*d+b*c, b*d) productoRacional :: (Int,Int) -> (Int,Int) -> (Int,Int) productoRacional (a,b) (c,d) = formaReducida (a*c, b*d) igualdadRacional :: (Int,Int) -> (Int,Int) -> Bool igualdadRacional (a,b) (c,d) = a*d == b*c -- La propiedad es prop_distributiva :: (Int,Int) -> (Int,Int) -> (Int,Int) -> Property prop_distributiva x y z = snd x /= 0 && snd y /= 0 && snd z /= 0 ==> igualdadRacional (productoRacional x (sumaRacional y z)) (sumaRacional (productoRacional x y) (productoRacional x z)) -- La comprobación es -- λ> quickCheck prop_distributiva -- +++ OK, passed 100 tests; 21 discarded.
El código se encuentra en GitHub.
Soluciones en Python
from math import gcd from hypothesis import given, assume, strategies as st Racional = tuple[int, int] def formaReducida(x: Racional) -> Racional: (a, b) = x if a == 0: return (0, 1) c = gcd(a, b) return (a // c, b // c) def sumaRacional(x: Racional, y: Racional) -> Racional: (a, b) = x (c, d) = y return formaReducida((a*d+b*c, b*d)) def productoRacional(x: Racional, y: Racional) -> Racional: (a, b) = x (c, d) = y return formaReducida((a*c, b*d)) def igualdadRacional(x: Racional, y: Racional) -> bool: (a, b) = x (c, d) = y return a*d == b*c # La propiedad es @given(st.tuples(st.integers(), st.integers()), st.tuples(st.integers(), st.integers()), st.tuples(st.integers(), st.integers())) def test_prop_distributiva(x, y, z): (_, x2) = x (_, y2) = y (_, z2) = z assume(x2 != 0 and y2 != 0 and z2 != 0) assert igualdadRacional(productoRacional(x, sumaRacional(y, z)), sumaRacional(productoRacional(x, y), productoRacional(x, z))) # La comprobación es # src> poetry run pytest -q numeros_racionales.py # 1 passed in 0.37s
El código se encuentra en GitHub.