Teorema de existencia de divisores
El teorema de existencia de divisores afirma que
En cualquier subconjunto de {1, 2, …, 2m} con al menos m+1 elementos existen números distintos a, b tales que a divide a b.
Un conjunto de números naturales xs es mayoritario si existe un m tal que la lista de xs es un subconjunto de {1,2,…,2m} con al menos m+1 elementos. Por ejemplo, {2,3,5,6} porque es un subconjunto de {1,2,…,6} con más de 3 elementos.
Definir las funciones
1 2 |
divisoresMultiplos :: [Integer] -> [(Integer,Integer)] esMayoritario :: [Integer] -> Bool |
tales que
- (divisores xs) es la lista de pares de elementos distintos de (a,b) tales que a divide a b. Por ejemplo,
1 2 3 |
divisoresMultiplos [2,3,5,6] == [(2,6),(3,6)] divisoresMultiplos [2,3,5] == [] divisoresMultiplos [4..8] == [(4,8)] |
- (esMayoritario xs) se verifica xs es mayoritario. Por ejemplo,
1 2 |
esMayoritario [2,3,5,6] == True esMayoritario [2,3,5] == False |
Comprobar con QuickCheck el teorema de existencia de divisores; es decir, en cualquier conjunto mayoritario existen números distintos a, b tales que a divide a b. Para la comprobación se puede usar el siguiente generador de conjuntos mayoritarios
1 2 3 4 5 6 |
mayoritario :: Gen [Integer] mayoritario = do m' <- arbitrary let m = 1 + abs m' xs' <- sublistOf [1..2*m] `suchThat` (\ys -> genericLength ys > m) return xs' |
con lo que la propiedad que hay que comprobar con QuickCheck es
1 2 3 |
teorema_de_existencia_de_divisores :: Property teorema_de_existencia_de_divisores = forAll mayoritario (not . null . divisoresMultiplos) |
Soluciones
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 |
import Data.List (genericLength) import Test.QuickCheck divisoresMultiplos :: [Integer] -> [(Integer,Integer)] divisoresMultiplos xs = [(x,y) | x <- xs , y <- xs , y /= x , y `mod` x == 0] esMayoritario :: [Integer] -> Bool esMayoritario xs = not (null xs) && length xs > ceiling (n / 2) where n = fromIntegral (maximum xs) -- Comprobación del teorema -- ======================== -- La propiedad es teorema_de_existencia_de_divisores :: Property teorema_de_existencia_de_divisores = forAll mayoritario (not . null . divisoresMultiplos) -- mayoritario es un generador de conjuntos mayoritarios. Por ejemplo, -- λ> sample mayoritario -- [1,2] -- [2,5,7,8] -- [1,2,8,10,14] -- [3,8,11,12,13,15,18,19,22,23,25,26] -- [1,3,4,6] -- [3,6,9,11,12,14,17,19] mayoritario :: Gen [Integer] mayoritario = do m' <- arbitrary let m = 1 + abs m' xs' <- sublistOf [1..2*m] `suchThat` (\ys -> genericLength ys > m) return xs' -- La comprobación es -- λ> quickCheck teorema_de_existencia_de_divisores -- +++ OK, passed 100 tests. |
Pensamiento
Guiomar, Guiomar,
mírame en ti castigado:
reo de haberte creado,
ya no te puedo olvidar.Antonio Machado