RosettaCodeData/Task/Arithmetic-derivative/Miranda/arithmetic-derivative.miranda

25 lines
780 B
Plaintext

main :: [sys_message]
main = [Stdout (table 10 7 (map (show . lagarias) [-99..100])),
Stdout (lay (map ten_pow_m_div_7 [1..20]))]
ten_pow_m_div_7 :: num->[char]
ten_pow_m_div_7 m = "D(10^" ++ rjustify 2 (show m) ++ ") / 7 = " ++
show (lagarias (10^m) div 7)
table :: num->num->[[char]]->[char]
table w cw ls = lay [concat (map (rjustify cw) l) | l <- group w ls]
group :: num->[*]->[[*]]
group n [] = []
group n ls = take n ls : group n (drop n ls)
lagarias :: num->num
lagarias n = -lagarias (-n), if n<0
= sum [n div f | f <- factors n], otherwise
factors :: num->[num]
factors n = f n 2
where f n d = [], if d > n
= d : f (n div d) d, if n mod d = 0
= f n (d+1), otherwise