module Data.Number.FixedFunctions where
import Prelude hiding (pi, sqrt, tan, atan, exp, log)
import Data.Ratio
approx :: Rational -> Rational -> Rational
approx :: Rational -> Rational -> Rational
approx eps :: Rational
eps x :: Rational
x = Rational -> Rational -> Rational
forall a. RealFrac a => a -> a -> Rational
approxRational Rational
x Rational
eps
type CF = [(Rational, Rational)]
fromCF :: CF -> Rational
fromCF :: CF -> Rational
fromCF x :: CF
x =
((Rational, Rational) -> Rational -> Rational)
-> Rational -> CF -> Rational
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (Rational, Rational) -> Rational -> Rational
g 1 CF
x
where
g :: (Rational, Rational) -> Rational -> Rational
g :: (Rational, Rational) -> Rational -> Rational
g u :: (Rational, Rational)
u v :: Rational
v = ((Rational, Rational) -> Rational
forall a b. (a, b) -> a
fst (Rational, Rational)
u) Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ ((Rational, Rational) -> Rational
forall a b. (a, b) -> b
snd (Rational, Rational)
u) Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/ Rational
v
toCF :: Rational -> CF
toCF :: Rational -> CF
toCF x :: Rational
x =
Rational -> CF -> CF
forall a a.
(Integral a, Integral a) =>
Ratio a -> [(Ratio a, Ratio a)] -> [(Ratio a, Ratio a)]
toCF' Rational
x []
where
toCF' :: Ratio a -> [(Ratio a, Ratio a)] -> [(Ratio a, Ratio a)]
toCF' u :: Ratio a
u lst :: [(Ratio a, Ratio a)]
lst =
case a
r of
0 -> [(Ratio a, Ratio a)] -> [(Ratio a, Ratio a)]
forall a. [a] -> [a]
reverse (((a
qa -> a -> Ratio a
forall a. Integral a => a -> a -> Ratio a
%1),(0a -> a -> Ratio a
forall a. Integral a => a -> a -> Ratio a
%1))(Ratio a, Ratio a) -> [(Ratio a, Ratio a)] -> [(Ratio a, Ratio a)]
forall a. a -> [a] -> [a]
:[(Ratio a, Ratio a)]
lst)
_ -> Ratio a -> [(Ratio a, Ratio a)] -> [(Ratio a, Ratio a)]
toCF' (a
ba -> a -> Ratio a
forall a. Integral a => a -> a -> Ratio a
%a
r) (((a
qa -> a -> Ratio a
forall a. Integral a => a -> a -> Ratio a
%1),(1a -> a -> Ratio a
forall a. Integral a => a -> a -> Ratio a
%1))(Ratio a, Ratio a) -> [(Ratio a, Ratio a)] -> [(Ratio a, Ratio a)]
forall a. a -> [a] -> [a]
:[(Ratio a, Ratio a)]
lst)
where
a :: a
a = Ratio a -> a
forall a. Ratio a -> a
numerator Ratio a
u
b :: a
b = Ratio a -> a
forall a. Ratio a -> a
denominator Ratio a
u
(q :: a
q,r :: a
r) = a -> a -> (a, a)
forall a. Integral a => a -> a -> (a, a)
quotRem a
a a
b
approxCF :: Rational -> CF -> Rational
approxCF :: Rational -> CF -> Rational
approxCF eps :: Rational
eps [] = 0
approxCF eps :: Rational
eps x :: CF
x
= Rational
-> CF
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Int
-> Rational
approxCF' Rational
eps CF
x 0 1 1 Rational
q' Rational
p' 1
where
h :: Rational
h = (Rational, Rational) -> Rational
forall a b. (a, b) -> a
fst (CF
xCF -> Int -> (Rational, Rational)
forall a. [a] -> Int -> a
!!0)
(q' :: Rational
q', p' :: Rational
p') = CF
xCF -> Int -> (Rational, Rational)
forall a. [a] -> Int -> a
!!0
approxCF' :: Rational
-> CF
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Int
-> Rational
approxCF' eps :: Rational
eps x :: CF
x v2 :: Rational
v2 v1 :: Rational
v1 u2 :: Rational
u2 u1 :: Rational
u1 a' :: Rational
a' n :: Int
n
| Rational -> Rational
forall a. Num a => a -> a
abs (1 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational
f1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
f) Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
< Rational
eps = Rational -> Rational -> Rational
approx Rational
eps Rational
f
| Rational
a Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== 0 = Rational -> Rational -> Rational
approx Rational
eps Rational
f
| Bool
otherwise = Rational
-> CF
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Int
-> Rational
approxCF' Rational
eps CF
x Rational
v1 Rational
v Rational
u1 Rational
u Rational
a (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+1)
where
(b :: Rational
b, a :: Rational
a) = CF
xCF -> Int -> (Rational, Rational)
forall a. [a] -> Int -> a
!!Int
n
u :: Rational
u = Rational
bRational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational
u1 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ Rational
a'Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational
u2
v :: Rational
v = Rational
bRational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational
v1 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ Rational
a'Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational
v2
f :: Rational
f = Rational
uRational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
v
f1 :: Rational
f1 = Rational
u1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
v1
fromTaylorToCF :: Fractional a => [a] -> a -> [(a, a)]
fromTaylorToCF :: [a] -> a -> [(a, a)]
fromTaylorToCF s :: [a]
s x :: a
x =
(a, a)
zero(a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
:(a, a)
one(a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
:[Int -> (a, a)
higher Int
m | Int
m <- [2..]]
where
zero :: (a, a)
zero = ([a]
s[a] -> Int -> a
forall a. [a] -> Int -> a
!!0, [a]
s[a] -> Int -> a
forall a. [a] -> Int -> a
!!1 a -> a -> a
forall a. Num a => a -> a -> a
* a
x)
one :: (a, a)
one = (1, -[a]
s[a] -> Int -> a
forall a. [a] -> Int -> a
!!2a -> a -> a
forall a. Fractional a => a -> a -> a
/[a]
s[a] -> Int -> a
forall a. [a] -> Int -> a
!!1 a -> a -> a
forall a. Num a => a -> a -> a
* a
x)
higher :: Int -> (a, a)
higher m :: Int
m = (1 a -> a -> a
forall a. Num a => a -> a -> a
+ [a]
s[a] -> Int -> a
forall a. [a] -> Int -> a
!!Int
ma -> a -> a
forall a. Fractional a => a -> a -> a
/[a]
s[a] -> Int -> a
forall a. [a] -> Int -> a
!!(Int
mInt -> Int -> Int
forall a. Num a => a -> a -> a
-1) a -> a -> a
forall a. Num a => a -> a -> a
* a
x, -[a]
s[a] -> Int -> a
forall a. [a] -> Int -> a
!!(Int
mInt -> Int -> Int
forall a. Num a => a -> a -> a
+1)a -> a -> a
forall a. Fractional a => a -> a -> a
/[a]
s[a] -> Int -> a
forall a. [a] -> Int -> a
!!Int
m a -> a -> a
forall a. Num a => a -> a -> a
* a
x)
fac :: Integer -> Integer
fac :: Integer -> Integer
fac = [Integer] -> Integer
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
product ([Integer] -> Integer)
-> (Integer -> [Integer]) -> Integer -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Integer -> [Integer]
forall a. Enum a => a -> a -> [a]
enumFromTo 1
integerRoot2 :: Integer -> Integer
integerRoot2 :: Integer -> Integer
integerRoot2 1 = 1
integerRoot2 x :: Integer
x =
Integer -> Integer -> Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a -> a -> a
integerRoot2' 0 Integer
x (Integer
x Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
`div` 2) Integer
x
where
integerRoot2' :: a -> a -> a -> a -> a
integerRoot2' lo :: a
lo hi :: a
hi r :: a
r y :: a
y
| a
c a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
y = a -> a -> a -> a -> a
integerRoot2' a
lo a
r ((a
r a -> a -> a
forall a. Num a => a -> a -> a
+ a
lo) a -> a -> a
forall a. Integral a => a -> a -> a
`div` 2) a
y
| a
c a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y = a
r
| Bool
otherwise =
if (a
ra -> a -> a
forall a. Num a => a -> a -> a
+1)a -> Integer -> a
forall a b. (Num a, Integral b) => a -> b -> a
^2 a -> a -> Bool
forall a. Ord a => a -> a -> Bool
> a
y then
a
r
else
a -> a -> a -> a -> a
integerRoot2' a
r a
hi ((a
r a -> a -> a
forall a. Num a => a -> a -> a
+ a
hi) a -> a -> a
forall a. Integral a => a -> a -> a
`div` 2) a
y
where c :: a
c = a
ra -> Integer -> a
forall a b. (Num a, Integral b) => a -> b -> a
^2
pi :: Rational -> Rational
pi :: Rational -> Rational
pi eps :: Rational
eps =
(Rational -> Rational -> Rational
sqrt Rational
eps Rational
d) Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/ (Rational -> CF -> Rational
approxCF Rational
eps ([Rational] -> Rational -> CF
forall a. Fractional a => [a] -> a -> [(a, a)]
fromTaylorToCF [Rational]
s Rational
x))
where
x :: Rational
x = 1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%(640320Integer -> Integer -> Integer
forall a b. (Num a, Integral b) => a -> b -> a
^3)::Rational
s :: [Rational]
s = [((-1)Integer -> Integer -> Integer
forall a b. (Num a, Integral b) => a -> b -> a
^Integer
kInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
*(Integer -> Integer
fac (6Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
*Integer
k))Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%((Integer -> Integer
fac Integer
k)Integer -> Integer -> Integer
forall a b. (Num a, Integral b) => a -> b -> a
^3Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
*(Integer -> Integer
fac (3Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
*Integer
k))))Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*((Integer
aInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
*Integer
kInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
b)Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
c) | Integer
k<-[0..]]
a :: Integer
a = 545140134
b :: Integer
b = 13591409
c :: Integer
c = 426880
d :: Rational
d = 10005
tan :: Rational -> Rational -> Rational
tan :: Rational -> Rational -> Rational
tan eps :: Rational
eps 0 = 0
tan eps :: Rational
eps x :: Rational
x
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
>= Rational
half_pi' = Rational -> Rational -> Rational
tan Rational
eps (Rational
x Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- ((1Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
m)Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%1)Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational
xpi)
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
<= -Rational
half_pi' = Rational -> Rational -> Rational
tan Rational
eps (Rational
x Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ ((1Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
m)Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%1)Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational
xpi)
| Bool
otherwise = Rational -> CF -> Rational
approxCF Rational
eps (Rational -> CF
forall a a.
(Integral a, Integral a) =>
Ratio a -> [(Ratio a, Ratio a)]
cf Rational
x)
where
absx :: Rational
absx = Rational -> Rational
forall a. Num a => a -> a
abs Rational
x
t :: Rational
t = Rational -> Rational -> Rational
tan Rational
eps (Rational
xRational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/2)
m :: Integer
m = Rational -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
floor ((Rational
absx Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational
half_pi)Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/ Rational
xpi)
xpi :: Rational
xpi = Rational -> Rational
pi Rational
eps
half_pi' :: Rational
half_pi'= 158Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%100
half_pi :: Rational
half_pi = Rational
xpi Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* (1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%2)
cf :: Ratio a -> [(Ratio a, Ratio a)]
cf u :: Ratio a
u = ((0a -> a -> Ratio a
forall a. Integral a => a -> a -> Ratio a
%1,1a -> a -> Ratio a
forall a. Integral a => a -> a -> Ratio a
%1)(Ratio a, Ratio a) -> [(Ratio a, Ratio a)] -> [(Ratio a, Ratio a)]
forall a. a -> [a] -> [a]
:[((2Ratio a -> Ratio a -> Ratio a
forall a. Num a => a -> a -> a
*Ratio a
r Ratio a -> Ratio a -> Ratio a
forall a. Num a => a -> a -> a
+ 1)Ratio a -> Ratio a -> Ratio a
forall a. Fractional a => a -> a -> a
/Ratio a
u, -1) | Ratio a
r <- [0..]])
sin :: Rational -> Rational -> Rational
sin :: Rational -> Rational -> Rational
sin eps :: Rational
eps 0 = 0
sin eps :: Rational
eps x :: Rational
x = 2Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational
tRational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/(1 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ Rational
tRational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational
t)
where
t :: Rational
t = Rational -> Rational -> Rational
tan Rational
eps (Rational
xRational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/2)
cos :: Rational -> Rational -> Rational
cos :: Rational -> Rational -> Rational
cos eps :: Rational
eps 0 = 1
cos eps :: Rational
eps x :: Rational
x = (1 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational
p)Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/(1 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ Rational
p)
where
t :: Rational
t = Rational -> Rational -> Rational
tan Rational
eps (Rational
xRational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/2)
p :: Rational
p = Rational
tRational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational
t
atan :: Rational -> Rational -> Rational
atan :: Rational -> Rational -> Rational
atan eps :: Rational
eps x :: Rational
x
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== 0 = 0
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
> 1 = (Rational -> Rational
pi Rational
eps)Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/2 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational -> Rational -> Rational
atan Rational
eps (1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
x)
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
< -1 = -(Rational -> Rational
pi Rational
eps)Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/2 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational -> Rational -> Rational
atan Rational
eps (1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
x)
| Bool
otherwise = Rational -> CF -> Rational
approxCF Rational
eps ((0,Rational
x)(Rational, Rational) -> CF -> CF
forall a. a -> [a] -> [a]
:[((2Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational
m Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- 1),(Rational
mRational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational
x)Rational -> Integer -> Rational
forall a b. (Num a, Integral b) => a -> b -> a
^2) | Rational
m<- [1..]])
asin :: Rational -> Rational -> Rational
asin :: Rational -> Rational -> Rational
asin eps :: Rational
eps x :: Rational
x
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== 0 = 0
| Rational -> Rational
forall a. Num a => a -> a
abs Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
> 1 = [Char] -> Rational
forall a. HasCallStack => [Char] -> a
error "Fraction.asin"
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== 1 = (Rational -> Rational
pi Rational
eps) Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* (1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%2)
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== -1 = (Rational -> Rational
pi Rational
eps) Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* (-1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%2)
| Bool
otherwise = Rational -> Rational -> Rational
atan Rational
eps (Rational
x Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/ (Rational -> Rational -> Rational
sqrt Rational
eps (1 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational
xRational -> Integer -> Rational
forall a b. (Num a, Integral b) => a -> b -> a
^2)))
acos :: Rational -> Rational -> Rational
acos :: Rational -> Rational -> Rational
acos eps :: Rational
eps x :: Rational
x
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== 0 = (Rational -> Rational
pi Rational
eps)Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*(1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%2)
| Rational -> Rational
forall a. Num a => a -> a
abs Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
> 1 = [Char] -> Rational
forall a. HasCallStack => [Char] -> a
error "Fraction.sin"
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== 1 = 0
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== -1 = Rational -> Rational
pi Rational
eps
| Bool
otherwise = Rational -> Rational -> Rational
atan Rational
eps ((Rational -> Rational -> Rational
sqrt Rational
eps (1 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational
xRational -> Integer -> Rational
forall a b. (Num a, Integral b) => a -> b -> a
^2)) Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/ Rational
x)
sqrt :: Rational -> Rational -> Rational
sqrt :: Rational -> Rational -> Rational
sqrt eps :: Rational
eps x :: Rational
x
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
< 0 = [Char] -> Rational
forall a. HasCallStack => [Char] -> a
error "Fraction.sqrt"
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== 0 = 0
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
< 1 = 1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/(Rational -> Rational -> Rational
sqrt Rational
eps (1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
x))
| Bool
otherwise = Rational -> CF -> Rational
approxCF Rational
eps ((Rational
m,Rational
xRational -> Rational -> Rational
forall a. Num a => a -> a -> a
-Rational
mRational -> Integer -> Rational
forall a b. (Num a, Integral b) => a -> b -> a
^2)(Rational, Rational) -> CF -> CF
forall a. a -> [a] -> [a]
:[(2Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational
m,Rational
xRational -> Rational -> Rational
forall a. Num a => a -> a -> a
-Rational
mRational -> Integer -> Rational
forall a b. (Num a, Integral b) => a -> b -> a
^2) | Integer
r<-[0..]])
where
m :: Rational
m = (Integer -> Integer
integerRoot2 (Rational -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
floor Rational
x))Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%1
exp :: Rational -> Rational -> Rational
exp :: Rational -> Rational -> Rational
exp eps :: Rational
eps x :: Rational
x
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== 0 = 1
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
> 1 = (Rational -> CF -> Rational
approxCF Rational
eps (Rational -> CF
forall a. (Fractional a, Enum a) => a -> [(a, a)]
f (Rational
xRational -> Rational -> Rational
forall a. Num a => a -> a -> a
*(1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
p))))Rational -> Integer -> Rational
forall a b. (Num a, Integral b) => a -> b -> a
^Integer
p
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
< (-1) = (Rational -> CF -> Rational
approxCF Rational
eps (Rational -> CF
forall a. (Fractional a, Enum a) => a -> [(a, a)]
f (Rational
xRational -> Rational -> Rational
forall a. Num a => a -> a -> a
*(1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
q))))Rational -> Integer -> Rational
forall a b. (Num a, Integral b) => a -> b -> a
^Integer
q
| Bool
otherwise = Rational -> CF -> Rational
approxCF Rational
eps (Rational -> CF
forall a. (Fractional a, Enum a) => a -> [(a, a)]
f Rational
x)
where
p :: Integer
p = Rational -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
ceiling Rational
x
q :: Integer
q = -(Rational -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
floor Rational
x)
f :: a -> [(a, a)]
f y :: a
y = (1,a
y)(a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
:(1a -> a -> a
forall a. Num a => a -> a -> a
-a
ya -> a -> a
forall a. Fractional a => a -> a -> a
/2,a
ya -> Integer -> a
forall a b. (Num a, Integral b) => a -> b -> a
^2a -> a -> a
forall a. Fractional a => a -> a -> a
/12)(a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
:[(1,a
ya -> Integer -> a
forall a b. (Num a, Integral b) => a -> b -> a
^2a -> a -> a
forall a. Fractional a => a -> a -> a
/(16a -> a -> a
forall a. Num a => a -> a -> a
*a
na -> Integer -> a
forall a b. (Num a, Integral b) => a -> b -> a
^2a -> a -> a
forall a. Num a => a -> a -> a
-4)) | a
n<-[2..]]
cosh :: Rational -> Rational -> Rational
cosh :: Rational -> Rational -> Rational
cosh eps :: Rational
eps x :: Rational
x =
(Rational
a Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ Rational
b)Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*(1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%2)
where
a :: Rational
a = Rational -> Rational -> Rational
exp Rational
eps Rational
x
b :: Rational
b = 1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
a
sinh :: Rational -> Rational -> Rational
sinh :: Rational -> Rational -> Rational
sinh eps :: Rational
eps x :: Rational
x =
(Rational
a Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational
b)Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*(1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%2)
where
a :: Rational
a = Rational -> Rational -> Rational
exp Rational
eps Rational
x
b :: Rational
b = 1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
a
tanh :: Rational -> Rational -> Rational
tanh :: Rational -> Rational -> Rational
tanh eps :: Rational
eps x :: Rational
x =
(Rational
a Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational
b)Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/ (Rational
a Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ Rational
b)
where
a :: Rational
a = Rational -> Rational -> Rational
exp Rational
eps Rational
x
b :: Rational
b = 1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
a
atanh :: Rational -> Rational -> Rational
atanh :: Rational -> Rational -> Rational
atanh eps :: Rational
eps x :: Rational
x
| Bool
otherwise = (1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%2) Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* (Rational -> Rational -> Rational
log Rational
eps ((1 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ Rational
x) Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/ (1 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational
x)))
asinh :: Rational -> Rational -> Rational
asinh :: Rational -> Rational -> Rational
asinh eps :: Rational
eps x :: Rational
x
| Bool
otherwise = Rational -> Rational -> Rational
log Rational
eps (Rational
x Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ (Rational -> Rational -> Rational
sqrt Rational
eps (Rational
xRational -> Integer -> Rational
forall a b. (Num a, Integral b) => a -> b -> a
^2 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ 1)))
acosh :: Rational -> Rational -> Rational
acosh :: Rational -> Rational -> Rational
acosh eps :: Rational
eps x :: Rational
x
| Bool
otherwise = Rational -> Rational -> Rational
log Rational
eps (Rational
x Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ (Rational -> Rational -> Rational
sqrt Rational
eps (Rational
xRational -> Integer -> Rational
forall a b. (Num a, Integral b) => a -> b -> a
^2 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- 1)))
log :: Rational -> Rational -> Rational
log :: Rational -> Rational -> Rational
log eps :: Rational
eps x :: Rational
x
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
<= 0 = [Char] -> Rational
forall a. HasCallStack => [Char] -> a
error "Fraction.log"
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
< 1 = -Rational -> Rational -> Rational
log Rational
eps (1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
x)
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== 1 = 0
| Bool
otherwise =
case ((Rational, Integer) -> (Rational, Integer)
scaled (Rational
x,0)) of
(1,s :: Integer
s) -> (Integer
sInteger -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%1) Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* Rational -> CF -> Rational
approxCF Rational
eps (Rational -> CF
series 1)
(y :: Rational
y,0) -> Rational -> CF -> Rational
approxCF Rational
eps (Rational -> CF
series (Rational
yRational -> Rational -> Rational
forall a. Num a => a -> a -> a
-1))
(y :: Rational
y,s :: Integer
s) -> Rational -> CF -> Rational
approxCF Rational
eps (Rational -> CF
series (Rational
yRational -> Rational -> Rational
forall a. Num a => a -> a -> a
-1)) Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ (Integer
sInteger -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%1)Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational -> CF -> Rational
approxCF Rational
eps (Rational -> CF
series 1)
where
series :: Rational -> CF
series :: Rational -> CF
series u :: Rational
u = (0,Rational
u)(Rational, Rational) -> CF -> CF
forall a. a -> [a] -> [a]
:(1,Rational
uRational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/2)(Rational, Rational) -> CF -> CF
forall a. a -> [a] -> [a]
:[(1,Rational
uRational -> Rational -> Rational
forall a. Num a => a -> a -> a
*((Integer
mInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
n)Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%(4Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
*Integer
m Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ 2)))|Integer
m<-[1..],Integer
n<-[0,1]]
scaled :: (Rational,Integer) -> (Rational, Integer)
scaled :: (Rational, Integer) -> (Rational, Integer)
scaled (x :: Rational
x, n :: Integer
n)
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== 2 = (1,Integer
nInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
+1)
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
< 2 = (Rational
x, Integer
n)
| Bool
otherwise = (Rational, Integer) -> (Rational, Integer)
scaled (Rational
xRational -> Rational -> Rational
forall a. Num a => a -> a -> a
*(1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%2), Integer
nInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
+1)