module Factory.Math.Implementations.Pi.AGM.BrentSalamin(
openR
) where
import Control.Arrow((&&&))
import qualified Factory.Math.ArithmeticGeometricMean as Math.ArithmeticGeometricMean
import qualified Factory.Math.Power as Math.Power
import qualified Factory.Math.Precision as Math.Precision
import qualified Factory.Math.SquareRoot as Math.SquareRoot
openR :: Math.SquareRoot.Algorithmic squareRootAlgorithm => squareRootAlgorithm -> Math.Precision.DecimalDigits -> Rational
openR :: squareRootAlgorithm -> DecimalDigits -> Rational
openR squareRootAlgorithm
squareRootAlgorithm DecimalDigits
decimalDigits = (Rational -> Rational -> Rational)
-> (Rational, Rational) -> Rational
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
(/) ((Rational, Rational) -> Rational)
-> ([(Rational, Rational)] -> (Rational, Rational))
-> [(Rational, Rational)]
-> Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (
Rational -> Rational
forall n. Num n => n -> n
Math.Power.square (Rational -> Rational)
-> ([(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
uncurry Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
(+) ((Rational, Rational) -> Rational)
-> ([(Rational, Rational)] -> (Rational, Rational))
-> [(Rational, Rational)]
-> Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Rational, Rational)] -> (Rational, Rational)
forall a. [a] -> a
last ([(Rational, Rational)] -> Rational)
-> ([(Rational, Rational)] -> Rational)
-> [(Rational, Rational)]
-> (Rational, Rational)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& Rational -> Rational
forall n. Num n => n -> n
negate (Rational -> Rational)
-> ([(Rational, Rational)] -> Rational)
-> [(Rational, Rational)]
-> Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> Rational
forall a. Enum a => a -> a
pred (Rational -> Rational)
-> ([(Rational, Rational)] -> Rational)
-> [(Rational, Rational)]
-> Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Rational] -> Rational
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ([Rational] -> Rational)
-> ([(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. Num a => a -> a -> a
* Rational
2) Rational
1) ([Rational] -> [Rational])
-> ([(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. (a -> b) -> [a] -> [b]
map (Rational -> Rational
forall n. Num n => n -> n
Math.Power.square (Rational -> Rational)
-> ((Rational, Rational) -> Rational)
-> (Rational, Rational)
-> Rational
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Rational, Rational) -> Rational
Math.ArithmeticGeometricMean.spread)
) ([(Rational, Rational)] -> (Rational, Rational))
-> ([(Rational, Rational)] -> [(Rational, Rational)])
-> [(Rational, Rational)]
-> (Rational, Rational)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DecimalDigits -> [(Rational, Rational)] -> [(Rational, Rational)]
forall a. DecimalDigits -> [a] -> [a]
take (
DecimalDigits -> DecimalDigits -> DecimalDigits -> DecimalDigits
forall i.
Integral i =>
DecimalDigits -> DecimalDigits -> DecimalDigits -> i
Math.Precision.getIterationsRequired DecimalDigits
Math.Precision.quadraticConvergence DecimalDigits
1 DecimalDigits
decimalDigits
) ([(Rational, Rational)] -> Rational)
-> [(Rational, Rational)] -> Rational
forall a b. (a -> b) -> a -> b
$ squareRootAlgorithm
-> DecimalDigits -> (Rational, Rational) -> [(Rational, Rational)]
forall squareRootAlgorithm.
Algorithmic squareRootAlgorithm =>
squareRootAlgorithm
-> DecimalDigits -> (Rational, Rational) -> [(Rational, Rational)]
Math.ArithmeticGeometricMean.convergeToAGM squareRootAlgorithm
squareRootAlgorithm DecimalDigits
decimalDigits (Rational
1, squareRootAlgorithm -> DecimalDigits -> Rational -> Rational
forall algorithm operand.
(Algorithmic algorithm, Real operand, Show operand) =>
algorithm -> DecimalDigits -> operand -> Rational
Math.SquareRoot.squareRoot squareRootAlgorithm
squareRootAlgorithm DecimalDigits
decimalDigits (Rational -> Rational
forall a. Fractional a => a -> a
recip Rational
2 :: Rational))