Sexy primes: Difference between revisions

m
(→‎{{header|Ring}}: needs improvement)
Line 686:
=={{header|Haskell}}==
Uses Library primes. https://hackage.haskell.org/package/primes (wheel sieve).
<lang haskell>import Text.Printf (printf)
import Text.Printf (printf)
import Data.Numbers.Primes (isPrime, primes)
 
maintype ::Pair IO= (Int, Int)
type Triplet = (Int, Int, Int)
main = do
type Quad = (Int, Int, Int, Int)
printf ("Number of sexy prime pairs: %d\n" ++ lastFiveText) (length pairs) (lastFive pairs)
type Quin = (Int, Int, Int, Int, Int)
printf ("Number of sexy prime triplets: %d\n" ++ lastFiveText) (length triplets) (lastFive triplets)
printf ("Number of sexy prime quadruplets: %d\n" ++ lastFiveText) (length quads) (lastFive quads)
printf "Number of sexy prime quintuplets: %d\n Last 1 : %s\n\n" (length quins) (show $ drop (length quins -1) quins)
printf "Number of unsexy primes: %d\n Last 10: %s\n\n" (length unsexy) (show $ drop (length unsexy - 10) unsexy)
where d = takeWhile (< 1000035) primes
unsexy = filter (\n -> (not $ isPrime (n+6)) && (not $ isPrime (n-6))) d
pairs = foldr (\a b -> if isPrime (a-6) then (a-6,a) : b else b) [] d
triplets = foldr (\a b -> if isPrime (a-12) && isPrime (a-6) then (a-12,a-6,a) : b else b) [] d
quads = foldr (\a b -> if isPrime (a-18) && isPrime (a-12) && isPrime (a-6) then (a-18,a-12,a-6,a) : b else b) [] d
quins = foldr (\a b -> if isPrime (a-24) && isPrime (a-18) && isPrime (a-12) && isPrime (a-6) then (a-24, a-18,a-12,a-6,a) : b else b) [] d
lastFive xs = show $ drop (length xs - 5) xs
lastFiveText = " Last 5 : %s\n\n"
</lang>
Or using a single fold for increased efficiency
<lang haskell>
import Text.Printf (printf)
import Data.Numbers.Primes (isPrime, primes)
 
data Result = Result [(Int, Int)] [(Int, Int, Int)] [(Int, Int, Int, Int)] [(Int, Int, Int, Int, Int)] [Int]
 
data Result = Result [Pair] [Triplet] [Quad] [Quin] [Int]
groups :: Int -> Result -> Result
groups n r@(Result p t q qn u)
| isPrime (n-24) && isPrime (n-18) && isPrime (n-12) && isPrime (n-6) = Result asPair asTriplet asQuad asQuin u
| isPrime (n-18) && isPrime (n-12) && isPrime (n-6) = Result asPair asTriplet asQuad qn u
| isPrime (n-12) && isPrime (n-6) = Result asPair asTriplet q qn u
| isPrime (n-6) = Result asPair t q qn u
| (not $ (isPrime (n+6)) && (not $ (isPrime (n-6)) = Result p t q qn (n : u)
| otherwise = r
where asPair = (n-6, n) : p
asTriplet = (n-12, n-6, n) : t
asQuad = (n-18, n-12, n-6, n) : q
asQuin = (n-24, n-18, n-12, n-6, n) : qn
 
main :: IO ()
main = do
printf ("Number of sexy prime pairs: %d\n" ++ lastFiveText) (length pairs) (lastFive pairs)
printf ("Number of sexy prime triplets: %d\n" ++ lastFiveText) (length triplets) (lastFive triplets)
Line 735 ⟶ 718:
where (Result pairs triplets quads quins unsexy) = foldr groups (Result [] [] [] [] []) $ takeWhile (< 1000035) primes
lastFive xs = show $ drop (length xs - 5) xs
lastFiveText = " Last 5 : %s\n\n"</lang>
</lang>
{{out}}
<pre>
Anonymous user