module Factory.Math.Implementations.Pi.BBP.Implementation(
openR
) where
import Data.Ratio((%))
import qualified Factory.Math.Implementations.Pi.BBP.Series as Math.Implementations.Pi.BBP.Series
import qualified Factory.Math.Precision as Math.Precision
import qualified Factory.Math.Summation as Math.Summation
openR
:: Math.Implementations.Pi.BBP.Series.Series
-> Math.Precision.DecimalDigits
-> Rational
openR :: Series -> DecimalDigits -> Rational
openR Math.Implementations.Pi.BBP.Series.MkSeries {
numerators :: Series -> [Integer]
Math.Implementations.Pi.BBP.Series.numerators = [Integer]
numerators,
getDenominators :: Series -> DecimalDigits -> [Integer]
Math.Implementations.Pi.BBP.Series.getDenominators = DecimalDigits -> [Integer]
getDenominators,
seriesScalingFactor :: Series -> Rational
Math.Implementations.Pi.BBP.Series.seriesScalingFactor = Rational
seriesScalingFactor,
base :: Series -> Integer
Math.Implementations.Pi.BBP.Series.base = Integer
base
} DecimalDigits
decimalDigits = (Rational
seriesScalingFactor Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*) (Rational -> Rational)
-> ([Rational] -> Rational) -> [Rational] -> Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DecimalDigits -> [Rational] -> Rational
forall n. (Num n, NFData n) => DecimalDigits -> [n] -> n
Math.Summation.sum' DecimalDigits
8 ([Rational] -> Rational)
-> ([Rational] -> [Rational]) -> [Rational] -> Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DecimalDigits -> [Rational] -> [Rational]
forall a. DecimalDigits -> [a] -> [a]
take (
ConvergenceRate -> DecimalDigits -> DecimalDigits
forall i. Integral i => ConvergenceRate -> DecimalDigits -> i
Math.Precision.getTermsRequired (
ConvergenceRate -> ConvergenceRate
forall a. Fractional a => a -> a
recip (ConvergenceRate -> ConvergenceRate)
-> (Integer -> ConvergenceRate) -> Integer -> ConvergenceRate
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> ConvergenceRate
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Integer -> ConvergenceRate) -> Integer -> ConvergenceRate
forall a b. (a -> b) -> a -> b
$ Integer -> Integer
forall a. Num a => a -> a
abs Integer
base
) DecimalDigits
decimalDigits
) ([Rational] -> [Rational])
-> ([Rational] -> [Rational]) -> [Rational] -> [Rational]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Rational -> Rational -> Rational)
-> [Rational] -> [Rational] -> [Rational]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
(*) (
(Rational -> Rational) -> Rational -> [Rational]
forall a. (a -> a) -> a -> [a]
iterate (Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/ Integer -> Rational
forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
base) Rational
1
) ([Rational] -> Rational) -> [Rational] -> Rational
forall a b. (a -> b) -> a -> b
$ (DecimalDigits -> Rational) -> [DecimalDigits] -> [Rational]
forall a b. (a -> b) -> [a] -> [b]
map (
[Rational] -> Rational
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Rational] -> Rational)
-> (DecimalDigits -> [Rational]) -> DecimalDigits -> Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Integer -> Integer -> Rational)
-> [Integer] -> [Integer] -> [Rational]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
(%) [Integer]
numerators ([Integer] -> [Rational])
-> (DecimalDigits -> [Integer]) -> DecimalDigits -> [Rational]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DecimalDigits -> [Integer]
getDenominators
) [DecimalDigits
0 ..]