Jump to content

Sexy primes: Difference between revisions

m
→‎{{header|Haskell}}: improved performance after reviewing strategies used by other languages.
m (→‎{{header|Haskell}}: improved performance after reviewing strategies used by other languages.)
Line 685:
<lang haskell>
import Data.Maybe
import Data.List
import Text.Printf
import Data.Numbers.Primes
 
findPairstype ::Group Int ->= ([[Int] -> Maybe (Int], Int)
type UnSexy = ([Int], Int)
findPairs _ [] = Nothing
findPairs p (x:xs)
| x - p == 6 = Just (p, x)
| x - p > 6 = Nothing
| otherwise = findPairs p xs
 
findTriplets findMore:: [Int] -> ([Int, Int)] -> Maybe ([Int, Int, Int)]
findTripletsfindMore _ [] _ = Nothing[]
findPairsfindMore p ps@(x:xs)
findTriplets xs (p1, p2) = (\(np1, np2) -> (p1, p2, np2)) <$> findPairs p2 xs
| x - p == 6 = Justx (p,: findMore x) xs
| x - p > 6 = Nothing[]
| otherwise = findPairsfindMore p xs
 
findQuadrupletsfindSexy :: [Int] -> ([Int, Int, Int)] -> Maybe ([Int, Int, Int, Int)]
findSexy _ [] = []
findQuadruplets [] _ = Nothing
findSexy p ps@(x:xs)
findQuadruplets xs (p1, p2, p3) = (\(np1, np2) -> (p1, p2, p3, np2)) <$> findPairs p3 xs
| x - p == 6 = p : x : findMore x xs
| x - p > 6 = []
| otherwise = findSexy p xs
 
findQuinTupletsfilterSexy :: [Int] -> ([Int, Int, Int, Int)] -> Maybe ([Int, Int, Int, Int, Int)]
findQuinTupletsfilterSexy [] _ys = Nothingys
filterSexy (x:xs) ys
findQuinTuplets xs (p1, p2, p3, p4) = (\(np1, np2) -> (p1, p2, p3, p4, np2)) <$> findPairs p4 xs
| x `elem` ys = filter (/= x) $ filterSexy xs ys
| otherwise = filterSexy xs ys
 
searchPairssearchPrimes :: [Int] -> ([(IntGroup, Group, Group, [[Int)]], [Int])
searchPairssearchPrimes [] = (([], 0), ([], 0), ([], 0), [], [])
searchPrimes p@(x:xs)
searchPairs p@(x:xs) = case findPairs x p of
| resultSize == 2 = (addPairGroup, triplets, quads, quins, updateUnSexy)
(Just ps) -> (ps : y, filterSecond ps)
| resultSize == 3 = (addPairGroup, addTripletGroup, quads, quins, updateUnSexy)
Nothing -> (y, x : z)
| resultSize == 4 = (addPairGroup, addTripletGroup, addQuadGroup, quins, updateUnSexy)
where (y, z) = searchPairs xs
| resultSize == 5 = (addPairGroup, addTripletGroup, addQuadGroup, trimTo 5 $ result : quins, updateUnSexy)
filterSecond ps2 = if snd ps2 `elem` z
| resultSize == 0 && x /= 1000033 = (pairs, triplets, quads, quins, trimTo 10 $ x : us)
then filter (/= snd ps2) z
| otherwise = ys
else z
where ys@(pairs@(pr, pCount), triplets@(tr, tCount), quads@(qd, qCount), quins, us) = searchPrimes xs
result = findSexy x p
resultSize = length result
trimTo n zs = if length zs > n then drop 1 zs else zs
addPairGroup = (trimTo 5 $ take 2 result : pr, pCount + 1)
addTripletGroup = (trimTo 5 $ take 3 result : tr, tCount + 1)
addQuadGroup = (trimTo 5 $ take 4 result : qd, qCount + 1)
updateUnSexy = filterSexy result us
 
main :: IO ()
main = do
printf "Number of sexy prime pairs: %d\n" $ length(snd pairs)
let ps = takeWhile (< 1000035) primes
printf lastFiveText (show $ lastFivefst pairs)
let (pairs, unsexy) = searchPairs ps
printf "Number of sexy prime triplets: %d\n" $(snd length triplestriplets)
let triples = catMaybes $ map (findTriplets ps) pairs
printf lastFiveText (show $ lastFivefst triplestriplets)
let quads = catMaybes $ map (findQuadruplets ps) triples
printf "Number of sexy prime quadruplets: %d\n" $ length(snd quads)
let quins = catMaybes $ map (findQuinTuplets ps) quads
printf lastFiveText (show $ lastFivefst quads)
 
printf "Number of sexy prime pairs: %d\n" $ length pairs
printf lastFiveText (show $ lastFive pairs)
printf "Number of sexy prime triplets: %d\n" $ length triples
printf lastFiveText (show $ lastFive triples)
printf "Number of sexy prime quadruplets: %d\n" $ length quads
printf lastFiveText (show $ lastFive quads)
printf "Number of sexy prime quintuplets: %d\n" $ length quins
printf " Last 1 : %s\n\n" (show quins)
printf "Number of unsexy primes: %d\n" (totalUnSexy $ (lengthtakeWhile unsexy(< -1000035) 1primes)
printf " Last 10 unsexy primes: %v\n\n" (show $ lastTen unsexy)
 
where lastFive = reverse . take 5 . reverse
where lastFiveText = " Last 5 : %s\n\n"
lastTen = reverse . take 10 . tail . reverse
totalUnSexy = length . filter (\n -> (not $ isPrime(n+6)) && (not $ isPrime(n-6)))
asList = snd . unzip
(pairs, triplets, quads, quins, unsexy) = searchPrimes $ takeWhile (< 1000035) primes
lastFiveText = " Last 5 : %s\n\n"
</lang>
{{out}}
<pre>
Number of sexy prime pairs: 16386
Last 5 : [([999371,999377)],([999431,999437)],([999721,999727)],([999763,999769)],([999953,999959)]]
 
Number of sexy prime triplets: 2900
Last 5 : [([997427,997433,997439)],([997541,997547,997553)],([998071,998077,998083)],([998617,998623,998629)],([998737,998743,998749)]]
 
Number of sexy prime quadruplets: 325
Last 5 : [([977351,977357,977363,977369)],([983771,983777,983783,983789)],([986131,986137,986143,986149)],([990371,990377,990383,990389)],([997091,997097,997103,997109)]]
 
Number of sexy prime quintuplets: 1
Last 1 : [([5,11,17,23,29)]]
 
Number of unsexy primes: 48627
Anonymous user
Cookies help us deliver our services. By using our services, you agree to our use of cookies.