{-# LANGUAGE ScopedTypeVariables #-}
module Math.NumberTheory.Zeta.Riemann
( zetas
, zetasEven
, zetasOdd
) where
import Data.ExactPi
import Data.Ratio ((%))
import Math.NumberTheory.Recurrences (bernoulli)
import Math.NumberTheory.Zeta.Hurwitz (zetaHurwitz)
import Math.NumberTheory.Zeta.Utils (intertwine, skipEvens, skipOdds)
zetasEven :: [ExactPi]
zetasEven :: [ExactPi]
zetasEven = forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Integer -> Rational -> ExactPi
Exact [Integer
0, Integer
2 ..] forall a b. (a -> b) -> a -> b
$ forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith forall a. Num a => a -> a -> a
(*) (forall a. [a] -> [a]
skipOdds forall a. Integral a => [Ratio a]
bernoulli) [Rational]
cs
where
cs :: [Rational]
cs = (- Integer
1 forall a. Integral a => a -> a -> Ratio a
% Integer
2) forall a. a -> [a] -> [a]
: forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\Rational
i Integer
f -> Rational
i forall a. Num a => a -> a -> a
* (-Rational
4) forall a. Fractional a => a -> a -> a
/ forall a. Num a => Integer -> a
fromInteger (Integer
2 forall a. Num a => a -> a -> a
* Integer
f forall a. Num a => a -> a -> a
* (Integer
2 forall a. Num a => a -> a -> a
* Integer
f forall a. Num a => a -> a -> a
- Integer
1))) [Rational]
cs [Integer
1..]
zetasOdd :: forall a. (Floating a, Ord a) => a -> [a]
zetasOdd :: forall a. (Floating a, Ord a) => a -> [a]
zetasOdd a
eps = (a
1 forall a. Fractional a => a -> a -> a
/ a
0) forall a. a -> [a] -> [a]
: forall a. [a] -> [a]
tail (forall a. [a] -> [a]
skipEvens forall a b. (a -> b) -> a -> b
$ forall a. (Floating a, Ord a) => a -> a -> [a]
zetaHurwitz a
eps a
1)
zetas :: (Floating a, Ord a) => a -> [a]
zetas :: forall a. (Floating a, Ord a) => a -> [a]
zetas a
eps = a
e forall a. a -> [a] -> [a]
: a
o forall a. a -> [a] -> [a]
: forall a. (a -> a -> a) -> [a] -> [a]
scanl1 forall {a}. (Ord a, Fractional a) => a -> a -> a
f (forall a. [a] -> [a] -> [a]
intertwine [a]
es [a]
os)
where
a
e : [a]
es = forall a b. (a -> b) -> [a] -> [b]
map (forall a. Fractional a => (a -> a -> Bool) -> [Rational] -> a
getRationalLimit (\a
a a
b -> forall a. Num a => a -> a
abs (a
a forall a. Num a => a -> a -> a
- a
b) forall a. Ord a => a -> a -> Bool
< a
eps) forall b c a. (b -> c) -> (a -> b) -> a -> c
. ExactPi -> [Rational]
rationalApproximations) [ExactPi]
zetasEven
a
o : [a]
os = forall a. (Floating a, Ord a) => a -> [a]
zetasOdd a
eps
f :: a -> a -> a
f a
x a
y = a
1 forall a. Ord a => a -> a -> a
`max` (a
y forall a. Ord a => a -> a -> a
`min` (a
1 forall a. Num a => a -> a -> a
+ (a
x forall a. Num a => a -> a -> a
- a
1) forall a. Fractional a => a -> a -> a
/ a
2))