Pisano period: Difference between revisions

m
(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 np | 0 == 1rem <p n2 &&= [(n,1)]2 == factor np
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 $ 2:3:5:7:[11,13..]primes
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>
 
</lang>
{{out}}
<pre>PisanoPrime(p,2) for prime p lower than 15
678

edits