{-# LANGUAGE PostfixOperators #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Math.NumberTheory.Zeta.Hurwitz
( zetaHurwitz
) where
import Data.List.Infinite (Infinite(..), (....))
import qualified Data.List.Infinite as Inf
import Math.NumberTheory.Recurrences (bernoulli, factorial)
import Math.NumberTheory.Zeta.Utils (skipEvens, skipOdds)
zetaHurwitz :: forall a . (Floating a, Ord a) => a -> a -> Infinite a
zetaHurwitz :: forall a. (Floating a, Ord a) => a -> a -> Infinite a
zetaHurwitz a
eps a
a = forall a b c d.
(a -> b -> c -> d)
-> Infinite a -> Infinite b -> Infinite c -> Infinite d
Inf.zipWith3 (\a
s a
i a
t -> a
s forall a. Num a => a -> a -> a
+ a
i forall a. Num a => a -> a -> a
+ a
t) Infinite a
ss Infinite a
is Infinite a
ts
where
digitsOfPrecision :: Integer
digitsOfPrecision :: Integer
digitsOfPrecision =
let magnitude :: Integer
magnitude = forall a. Integral a => a -> Integer
toInteger forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. Foldable t => t a -> Int
length forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
takeWhile (forall a. Ord a => a -> a -> Bool
>= a
1) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> a) -> a -> [a]
iterate (forall a. Fractional a => a -> a -> a
/ a
10) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Fractional a => a -> a
recip forall a b. (a -> b) -> a -> b
$ a
eps
in forall a. Integral a => a -> a -> a
div (Integer
magnitude forall a. Num a => a -> a -> a
* Integer
33) Integer
10
aPlusN :: a
aPlusN :: a
aPlusN = a
a forall a. Num a => a -> a -> a
+ forall a. Num a => Integer -> a
fromInteger Integer
digitsOfPrecision
powsOfAPlusN :: Infinite a
powsOfAPlusN :: Infinite a
powsOfAPlusN = forall a. (a -> a) -> a -> Infinite a
Inf.iterate (a
aPlusN *) a
1
ss :: Infinite a
ss :: Infinite a
ss = let numbers :: [a]
numbers = forall a b. (a -> b) -> [a] -> [b]
map ((a
a +) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Num a => Integer -> a
fromInteger) [Integer
0..Integer
digitsOfPrecisionforall a. Num a => a -> a -> a
-Integer
1]
denoms :: Infinite [a]
denoms = forall a. Int -> a -> [a]
replicate (forall a. Num a => Integer -> a
fromInteger Integer
digitsOfPrecision) a
1 forall a. a -> Infinite a -> Infinite a
:<
forall a. (a -> a) -> a -> Infinite a
Inf.iterate (forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Num a => a -> a -> a
(*) [a]
numbers) [a]
numbers
in forall a b. (a -> b) -> Infinite a -> Infinite b
Inf.map (forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall a. Fractional a => a -> a
recip) Infinite [a]
denoms
is :: Infinite a
is :: Infinite a
is = let denoms :: Infinite a
denoms = forall a b c.
(a -> b -> c) -> Infinite a -> Infinite b -> Infinite c
Inf.zipWith
(\a
powOfA Integer
int -> a
powOfA forall a. Num a => a -> a -> a
* forall a. Num a => Integer -> a
fromInteger Integer
int)
Infinite a
powsOfAPlusN
((-Integer
1, Integer
0)....)
in forall a b. (a -> b) -> Infinite a -> Infinite b
Inf.map (a
aPlusN /) Infinite a
denoms
constants2 :: Infinite a
constants2 :: Infinite a
constants2 = forall a b. (a -> b) -> Infinite a -> Infinite b
Inf.map forall a. Fractional a => a -> a
recip Infinite a
powsOfAPlusN
pochhammers :: Infinite (Infinite Integer)
pochhammers :: Infinite (Infinite Integer)
pochhammers = let
pochhs :: Infinite (Infinite Integer)
pochhs :: Infinite (Infinite Integer)
pochhs = forall a. (a -> a) -> a -> Infinite a
Inf.iterate (\(Integer
x :< Infinite Integer
xs) -> forall a b. (a -> b) -> Infinite a -> Infinite b
Inf.map (forall a. Integral a => a -> a -> a
`div` Integer
x) Infinite Integer
xs) (forall a. Infinite a -> Infinite a
Inf.tail forall a. (Num a, Enum a) => Infinite a
factorial)
in
forall a. a -> Infinite a
Inf.repeat Integer
0 forall a. a -> Infinite a -> Infinite a
:< forall a b. (a -> b) -> Infinite a -> Infinite b
Inf.map forall a. Infinite a -> Infinite a
skipOdds Infinite (Infinite Integer)
pochhs
second :: [a]
second :: [a]
second =
forall a. Int -> Infinite a -> [a]
Inf.take (forall a. Num a => Integer -> a
fromInteger Integer
digitsOfPrecision) forall a b. (a -> b) -> a -> b
$
forall a b c d.
(a -> b -> c -> d)
-> Infinite a -> Infinite b -> Infinite c -> Infinite d
Inf.zipWith3
(\Rational
bern Integer
evenFac a
denom -> forall a. Fractional a => Rational -> a
fromRational Rational
bern forall a. Fractional a => a -> a -> a
/ (a
denom forall a. Num a => a -> a -> a
* forall a. Num a => Integer -> a
fromInteger Integer
evenFac))
(forall a. Infinite a -> Infinite a
Inf.tail forall a b. (a -> b) -> a -> b
$ forall a. Infinite a -> Infinite a
skipOdds forall a. Integral a => Infinite (Ratio a)
bernoulli)
(forall a. Infinite a -> Infinite a
Inf.tail forall a b. (a -> b) -> a -> b
$ forall a. Infinite a -> Infinite a
skipOdds forall a. (Num a, Enum a) => Infinite a
factorial)
(forall a. Infinite a -> Infinite a
skipEvens Infinite a
powsOfAPlusN)
fracs :: Infinite a
fracs :: Infinite a
fracs = forall a b. (a -> b) -> Infinite a -> Infinite b
Inf.map
(forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\a
s Integer
p -> a
s forall a. Num a => a -> a -> a
* forall a. Num a => Integer -> a
fromInteger Integer
p) [a]
second forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Infinite a -> [a]
Inf.toList)
Infinite (Infinite Integer)
pochhammers
ts :: Infinite a
ts :: Infinite a
ts = forall a b c.
(a -> b -> c) -> Infinite a -> Infinite b -> Infinite c
Inf.zipWith
(\a
constant2 a
frac -> a
constant2 forall a. Num a => a -> a -> a
* (a
0.5 forall a. Num a => a -> a -> a
+ a
frac))
Infinite a
constants2
Infinite a
fracs