Pisano period: Difference between revisions

m (→‎{{header|Perl 6}}: fix silly error.)
Line 341:
main = do
putStrLn $ "PisanoPrime(p,2) for prime p lower than 15"
printputStrLn.see 15.map (flip pisanoPrime 2).filter isPrime $ [1..15]
putStrLn $ "PisanoPrime(p,1) for prime p lower than 180"
printputStrLn.see 15.map (flip pisanoPrime 1).filter isPrime $ [1..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 | pnot <$ 2probablyPrime p = False
isPrime p = go primes
where
Line 415 ⟶ 429:
{{out}}
<pre>PisanoPrime(p,2) for prime p lower than 15
[ 6, 24, 100, 112, 110, 364]
 
PisanoPrime(p,1) for prime p lower than 180
3 8 20 16 10 28 36 18 48 14 30 76 40 88 32
[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]
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
678

edits