{-
	Copyright (C) 2011 Dr. Alistair Ward

	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public License
	along with this program.  If not, see <http://www.gnu.org/licenses/>.
-}
{- |
 [@AUTHOR@]	Dr. Alistair Ward

 [@DESCRIPTION@]	Defines /Bellard/'s nega-base-@2^10@ /BBP/-formula; <https://en.wikipedia.org/wiki/Bellard%27s_formula>
-}

module Factory.Math.Implementations.Pi.BBP.Bellard(
-- * Constants
	series
) where

import			Control.Arrow((&&&))
import qualified	Factory.Math.Implementations.Pi.BBP.Series	as Math.Implementations.Pi.BBP.Series

-- | Defines the parameters of this specific series.
series :: Math.Implementations.Pi.BBP.Series.Series
series :: Series
series	= MkSeries :: [Integer] -> (Int -> [Integer]) -> Rational -> Integer -> Series
Math.Implementations.Pi.BBP.Series.MkSeries {
	numerators :: [Integer]
Math.Implementations.Pi.BBP.Series.numerators		= ((Integer -> Integer) -> Integer -> Integer)
-> [Integer -> Integer] -> [Integer] -> [Integer]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (Integer -> Integer) -> Integer -> Integer
forall a b. (a -> b) -> a -> b
($) [Integer -> Integer
forall a. Num a => a -> a
negate, Integer -> Integer
forall a. Num a => a -> a
negate, Integer -> Integer
forall a. a -> a
id, Integer -> Integer
forall a. Num a => a -> a
negate, Integer -> Integer
forall a. Num a => a -> a
negate, Integer -> Integer
forall a. Num a => a -> a
negate, Integer -> Integer
forall a. a -> a
id] ([Integer] -> [Integer]) -> [Integer] -> [Integer]
forall a b. (a -> b) -> a -> b
$ (Integer -> Integer) -> [Integer] -> [Integer]
forall a b. (a -> b) -> [a] -> [b]
map (Integer
2 Integer -> Integer -> Integer
forall a b. (Num a, Integral b) => a -> b -> a
^) [Integer
5 :: Integer, Integer
0, Integer
8, Integer
6, Integer
2, Integer
2, Integer
0],
	getDenominators :: Int -> [Integer]
Math.Implementations.Pi.BBP.Series.getDenominators	= \Int
i -> let
		f, t :: Integer
		(Integer
f, Integer
t)	= (Integer
4 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
*) (Integer -> Integer)
-> (Integer -> Integer) -> Integer -> (Integer, Integer)
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& (Integer
10 Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
*) (Integer -> (Integer, Integer)) -> Integer -> (Integer, Integer)
forall a b. (a -> b) -> a -> b
$ Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i
	in [Integer
f Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
1, Integer
f Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
3, Integer
t Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
1, Integer
t Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
3, Integer
t Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
5, Integer
t Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
7, Integer
t Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
9],
	seriesScalingFactor :: Rational
Math.Implementations.Pi.BBP.Series.seriesScalingFactor	= Rational -> Rational
forall a. Fractional a => a -> a
recip (Rational -> Rational) -> Rational -> Rational
forall a b. (a -> b) -> a -> b
$ Rational
2 Rational -> Int -> Rational
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
6 :: Int),
	base :: Integer
Math.Implementations.Pi.BBP.Series.base			= Integer -> Integer
forall a. Num a => a -> a
negate (Integer -> Integer) -> Integer -> Integer
forall a b. (a -> b) -> a -> b
$ Integer
2 Integer -> Int -> Integer
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
10 :: Int)
}