Created
February 2, 2020 21:30
-
-
Save sim642/0062a0180084a19a0ae2aad40f69b9c2 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module SICPInfSeries where | |
-- SICP, exercise 3.59 | |
integrateSeries :: Fractional a => [a] -> [a] | |
-- integrateSeries s = helper s 1 | |
-- where helper (a:as) n = a / n : helper as (n + 1) | |
integrateSeries s = zipWith (/) s nats | |
where nats = 1 : map (+1) nats | |
expSeries :: Fractional a => [a] | |
expSeries = 1 : integrateSeries expSeries | |
cosineSeries, sineSeries :: Fractional a => [a] | |
cosineSeries = 1 : map negate (integrateSeries sineSeries) | |
sineSeries = 0 : integrateSeries cosineSeries | |
-- SICP, exercise 3.60 | |
addSeries :: Fractional a => [a] -> [a] -> [a] | |
addSeries = zipWith (+) | |
mulSeries :: Fractional a => [a] -> [a] -> [a] | |
mulSeries (a:as) bb@(b:bs) = a * b : addSeries (map (*a) bs) (mulSeries as bb) | |
squareSeries :: Fractional a => [a] -> [a] | |
squareSeries s = mulSeries s s | |
circleSeries :: Fractional a => [a] | |
circleSeries = addSeries (squareSeries sineSeries) (squareSeries cosineSeries) | |
-- SICP, exercise 3.61 | |
invertUnitSeries :: Fractional a => [a] -> [a] | |
invertUnitSeries (a:as) = x -- a == 1 | |
where x = 1 : map negate (mulSeries as x) | |
-- SICP, exercise 3.62 | |
invertSeries :: Fractional a => [a] -> [a] | |
invertSeries aa@(a:as) = map (/a) (invertUnitSeries (map (/a) aa)) | |
divSeries :: Fractional a => [a] -> [a] -> [a] | |
divSeries aa bb@(b:bs) = mulSeries aa (invertSeries bb) | |
tangentSeries :: Fractional a => [a] | |
tangentSeries = divSeries sineSeries cosineSeries | |
-- extra series | |
listToSeries :: Fractional a => [a] -> [a] | |
listToSeries l = l ++ repeat 0 | |
geometricSeries, geometricSeries' :: Fractional a => [a] | |
geometricSeries = repeat 1 | |
geometricSeries' = invertUnitSeries (listToSeries [1, -1]) -- generating function 1/(1-x) | |
fibonacciSeries :: Fractional a => [a] | |
fibonacciSeries = divSeries (listToSeries [0, 1]) (listToSeries [1, -1, -1]) -- generating function x/(1-x-x²) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment