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
1 2 3 4 |
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,
1 2 |
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,
1 2 |
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,
1 |
productoRacional (2,3) (5,6) == (5,9) |
igualdadRacional x y
se verifica si los números racionalesx
ey
son iguales. Por ejemplo,
1 2 3 |
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.
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 |
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.
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 |
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.