Pisano period: Difference between revisions
m
→{{header|Haskell}}
(Add Haskell) |
|||
Line 372:
go t (0:1:_) = t
go t (_:xs) = go (succ t) xs
primes :: Integral a => [a]
primes = 2:3:5:7:[p | p <- [11,13..], isPrime p]
limitDivisor :: Integral a => a -> a
limitDivisor = floor.(+0.05).sqrt.fromIntegral
isPrime :: Integral a => a -> Bool
isPrime
isPrime p | 0 == rem p 3 = 3 == p
isPrime p | 0 == rem p 5 = 5 == p
isPrime p | 0 == rem p 7 = 7 == p
isPrime p = null $ dropWhile (\n -> 0 /= rem p n) [11,13..limitDivisor p]
factor :: Integral a => a -> [(a,a)]
Line 380 ⟶ 390:
factor n = if null ans then [(n,1)] else ans
where
ans = go n
fun x d c = if 0 /= rem x d then (x,c) else fun (quot x d) d (succ c)
go 1 _ = []
Line 400 ⟶ 410:
pisanoConjecture 1 = 1
pisanoConjecture m = foldl1 lcm.map (uncurry pisanoPrime') $ factor m
where pisanoPrime' p k = (p^(k-1))*(pisanoPeriod p)</lang>
{{out}}
<pre>PisanoPrime(p,2) for prime p lower than 15
|