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