View difference between Paste ID: SrQrdt0B and AsxTNGLc
SHOW: | | - or go back to the newest paste.
1
-- Tievoli Bruno
2
-- Riso Santiago
3
-- Gozzi Juan
4
5
-- EJERCICIO 1. sonCoprimos
6
sonCoprimos :: Integer -> Integer -> Bool
7
sonCoprimos a b = maximoComunDivisor a b == 1
8
9
-- EJERCICIO 2. es2PseudoPrimo
10
es2PseudoPrimo :: Integer -> Bool
11
es2PseudoPrimo n = esAPseudoPrimo 2 n
12
13
-- EJERCICIO 3. cantidad3PseudoPrimos
14
cantidad3PseudoPrimos :: Integer -> Integer
15
cantidad3PseudoPrimos n = contador3PseudoPrimos n 0
16
17
-- EJERCICIO 4: kesimo2y3Pseudoprimo
18
kesimo2y3Pseudoprimo :: Integer -> Integer
19
kesimo2y3Pseudoprimo n = contadorKEsimo2y3Pseudoprimo n 2 1
20
21
-- EJERCICIO 5: esCarmichael
22
esCarmichael :: Integer -> Bool
23-
esCarmichael n = contadorCarmichael n n-1
23+
esCarmichael 1 = False
24
esCarmichael n = contadorCarmichael n (n-1)
25
26-
-- Funciones extra
26+
27
-- Funciones auxiliares
28
maximoComunDivisor :: Integer -> Integer -> Integer
29
maximoComunDivisor a 0 = a
30
maximoComunDivisor a b = maximoComunDivisor b (a `mod` b)
31
32-
menorDivisor n m | n == 1 = 1
32+
33-
                 | n `mod` m == 0 = m
33+
menorDivisor 1 _ = 1
34
menorDivisor n m | n `mod` m == 0 = m
35
                 | otherwise = menorDivisor n (m+1) 
36
37
esPrimo :: Integer -> Bool
38
esPrimo 1 = False
39
esPrimo n = menorDivisor n 2 == n
40
41
esAPseudoPrimo :: Integer -> Integer -> Bool
42
esAPseudoPrimo a n = (a^(n-1)-1) `mod` n == 0 && not (esPrimo n)
43
44
es3PseudoPrimo :: Integer -> Bool
45
es3PseudoPrimo n = esAPseudoPrimo 3 n
46
47-
contador3PseudoPrimos n m | n == 1 = m
47+
48-
                          | es3PseudoPrimo n = contador3PseudoPrimos (n-1) (m+1)
48+
contador3PseudoPrimos 1 m = m
49
contador3PseudoPrimos n m | es3PseudoPrimo n = contador3PseudoPrimos (n-1) (m+1)
50
                          | otherwise = contador3PseudoPrimos (n-1) m
51
                          
52-
contadorKEsimo2y3Pseudoprimo n m k | n == 0 = k
52+
53-
                                   | es2PseudoPrimo m && es3PseudoPrimo m = contadorKEsimo2y3Pseudoprimo (n-1) (m+1) m
53+
54
contadorKEsimo2y3Pseudoprimo 0 m k = k
55
contadorKEsimo2y3Pseudoprimo n m k | es2PseudoPrimo m && es3PseudoPrimo m = contadorKEsimo2y3Pseudoprimo (n-1) (m+1) m
56
                                   | otherwise = contadorKEsimo2y3Pseudoprimo n (m+1) k
57-
contadorCarmichael n m | m == 0 = True
57+
                                   
58-
                       | sonCoprimos m n && (esAPseudoPrimo m n) = contadorCarmichael n (m-1)
58+
59-
                       | sonCoprimos m n && not (esAPseudoPrimo m n) = False
59+
60-
                       | otherwise = contadorCarmichael n (m-1)
60+
contadorCarmichael n 1 = True
61
contadorCarmichael n m | sonCoprimos m n && not (esAPseudoPrimo m n) = False
62-
62+
                       | otherwise = contadorCarmichael n (m-1)