Pisano period: Difference between revisions
→{{header|Haskell}}
Thundergnat (talk | contribs) m (→{{header|Perl 6}}: fix silly error.) |
|||
Line 341:
main = do
putStrLn $ "PisanoPrime(p,2) for prime p lower than 15"
putStrLn $ "PisanoPrime(p,1) for prime p lower than 180"
let ns = [1..180] :: [Int]
let xs = map pisanoPeriod ns
Line 372:
go t (0:1:_) = t
go t (_:xs) = go (succ t) xs
powMod :: Integral a => a -> a -> a -> a
powMod m _ _ | 1 == abs m = 0
powMod m p k | 1 == abs p = if 1 == p || even k then mod 1 m else mod p m
powMod m p k = go p k
where
to x y = mod (x*y) m
go _ 0 = 1
go u 1 = mod u m
go u i = let w = go u (quot i 2) in if even i then to w w else to u (to w w)
-- Fermat primality test
probablyPrime :: Integral a => a -> Bool
probablyPrime p = if p <= 2 then 2 == p else 1 == powMod p 2 (p-1)
primes :: Integral a => [a]
Line 380 ⟶ 394:
isPrime :: Integral a => a -> Bool
isPrime p |
isPrime p = go primes
where
Line 415 ⟶ 429:
{{out}}
<pre>PisanoPrime(p,2) for prime p lower than 15
PisanoPrime(p,1) for prime p lower than 180
3 8 20 16 10 28 36 18 48 14 30 76 40 88 32
108 58 60 136 70 148 78 168 44 196 50 208 72 108 76
256 130 276 46 148 50 316 328 336 348 178
Pisano(m) for m from 1 to 180
1 3 8 6 20 24 16 12 24 60 10 24 28 48 40
|