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 Rational
eps 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 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 Rational
1 CF
x
where
g :: (Rational, Rational) -> Rational -> Rational
g :: (Rational, Rational) -> Rational -> Rational
g (Rational, Rational)
u 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 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' Ratio a
u [(Ratio a, Ratio a)]
lst =
case a
r of
a
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
%a
1),(a
0a -> a -> Ratio a
forall a. Integral a => a -> a -> Ratio a
%a
1))(Ratio a, Ratio a) -> [(Ratio a, Ratio a)] -> [(Ratio a, Ratio a)]
forall a. a -> [a] -> [a]
:[(Ratio a, Ratio a)]
lst)
a
_ -> 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
%a
1),(a
1a -> a -> Ratio a
forall a. Integral a => a -> a -> Ratio a
%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
(a
q,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 Rational
eps [] = Rational
0
approxCF Rational
eps CF
x
= Rational
-> CF
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Int
-> Rational
approxCF' Rational
eps CF
x Rational
0 Rational
1 Rational
1 Rational
q' Rational
p' Int
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
!!Int
0)
(Rational
q', Rational
p') = CF
xCF -> Int -> (Rational, Rational)
forall a. [a] -> Int -> a
!!Int
0
approxCF' :: Rational
-> CF
-> Rational
-> Rational
-> Rational
-> Rational
-> Rational
-> Int
-> Rational
approxCF' Rational
eps CF
x Rational
v2 Rational
v1 Rational
u2 Rational
u1 Rational
a' Int
n
| Rational -> Rational
forall a. Num a => a -> a
abs (Rational
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
== Rational
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
+Int
1)
where
(Rational
b, 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 [a]
s 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 <- [Int
2..]]
where
zero :: (a, a)
zero = ([a]
s[a] -> Int -> a
forall a. [a] -> Int -> a
!!Int
0, [a]
s[a] -> Int -> a
forall a. [a] -> Int -> a
!!Int
1 a -> a -> a
forall a. Num a => a -> a -> a
* a
x)
one :: (a, a)
one = (a
1, -[a]
s[a] -> Int -> a
forall a. [a] -> Int -> a
!!Int
2a -> a -> a
forall a. Fractional a => a -> a -> a
/[a]
s[a] -> Int -> a
forall a. [a] -> Int -> a
!!Int
1 a -> a -> a
forall a. Num a => a -> a -> a
* a
x)
higher :: Int -> (a, a)
higher Int
m = (a
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
-Int
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
+Int
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 Integer
1
integerRoot2 :: Integer -> Integer
integerRoot2 :: Integer -> Integer
integerRoot2 Integer
1 = Integer
1
integerRoot2 Integer
x =
Integer -> Integer -> Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a -> a -> a
integerRoot2' Integer
0 Integer
x (Integer
x Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
`div` Integer
2) Integer
x
where
integerRoot2' :: a -> a -> a -> a -> a
integerRoot2' a
lo a
hi a
r 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` a
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
+a
1)a -> Integer -> a
forall a b. (Num a, Integral b) => a -> b -> a
^Integer
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` a
2) a
y
where c :: a
c = a
ra -> Integer -> a
forall a b. (Num a, Integral b) => a -> b -> a
^Integer
2
pi :: Rational -> Rational
pi :: Rational -> Rational
pi 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 = Integer
1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%(Integer
640320Integer -> Integer -> Integer
forall a b. (Num a, Integral b) => a -> b -> a
^Integer
3)::Rational
s :: [Rational]
s = [((-Integer
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 (Integer
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
^Integer
3Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
*(Integer -> Integer
fac (Integer
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<-[Integer
0..]]
a :: Integer
a = Integer
545140134
b :: Integer
b = Integer
13591409
c :: Integer
c = Integer
426880
d :: Rational
d = Rational
10005
tan :: Rational -> Rational -> Rational
tan :: Rational -> Rational -> Rational
tan Rational
eps Rational
0 = Rational
0
tan Rational
eps 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
- ((Integer
1Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
m)Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
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
+ ((Integer
1Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
m)Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
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
/Rational
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'= Integer
158Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
100
half_pi :: Rational
half_pi = Rational
xpi Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* (Integer
1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
2)
cf :: Ratio a -> [(Ratio a, Ratio a)]
cf Ratio a
u = ((a
0a -> a -> Ratio a
forall a. Integral a => a -> a -> Ratio a
%a
1,a
1a -> a -> Ratio a
forall a. Integral a => a -> a -> Ratio a
%a
1)(Ratio a, Ratio a) -> [(Ratio a, Ratio a)] -> [(Ratio a, Ratio a)]
forall a. a -> [a] -> [a]
:[((Ratio 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
+ Ratio a
1)Ratio a -> Ratio a -> Ratio a
forall a. Fractional a => a -> a -> a
/Ratio a
u, -Ratio a
1) | Ratio a
r <- [Ratio a
0..]])
sin :: Rational -> Rational -> Rational
sin :: Rational -> Rational -> Rational
sin Rational
eps Rational
0 = Rational
0
sin Rational
eps Rational
x = Rational
2Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational
tRational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/(Rational
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
/Rational
2)
cos :: Rational -> Rational -> Rational
cos :: Rational -> Rational -> Rational
cos Rational
eps Rational
0 = Rational
1
cos Rational
eps Rational
x = (Rational
1 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational
p)Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/(Rational
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
/Rational
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 Rational
eps Rational
x
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== Rational
0 = Rational
0
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
> Rational
1 = (Rational -> Rational
pi Rational
eps)Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
2 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational -> Rational -> Rational
atan Rational
eps (Rational
1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
x)
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
< -Rational
1 = -(Rational -> Rational
pi Rational
eps)Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
2 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational -> Rational -> Rational
atan Rational
eps (Rational
1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
x)
| Bool
otherwise = Rational -> CF -> Rational
approxCF Rational
eps ((Rational
0,Rational
x)(Rational, Rational) -> CF -> CF
forall a. a -> [a] -> [a]
:[((Rational
2Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational
m Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational
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
^Integer
2) | Rational
m<- [Rational
1..]])
asin :: Rational -> Rational -> Rational
asin :: Rational -> Rational -> Rational
asin Rational
eps Rational
x
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== Rational
0 = Rational
0
| Rational -> Rational
forall a. Num a => a -> a
abs Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
> Rational
1 = [Char] -> Rational
forall a. HasCallStack => [Char] -> a
error [Char]
"Fraction.asin"
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== Rational
1 = (Rational -> Rational
pi Rational
eps) Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* (Integer
1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
2)
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== -Rational
1 = (Rational -> Rational
pi Rational
eps) Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* (-Integer
1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
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 (Rational
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
^Integer
2)))
acos :: Rational -> Rational -> Rational
acos :: Rational -> Rational -> Rational
acos Rational
eps Rational
x
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== Rational
0 = (Rational -> Rational
pi Rational
eps)Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*(Integer
1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
2)
| Rational -> Rational
forall a. Num a => a -> a
abs Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
> Rational
1 = [Char] -> Rational
forall a. HasCallStack => [Char] -> a
error [Char]
"Fraction.sin"
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== Rational
1 = Rational
0
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== -Rational
1 = Rational -> Rational
pi Rational
eps
| Bool
otherwise = Rational -> Rational -> Rational
atan Rational
eps ((Rational -> Rational -> Rational
sqrt Rational
eps (Rational
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
^Integer
2)) Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/ Rational
x)
sqrt :: Rational -> Rational -> Rational
sqrt :: Rational -> Rational -> Rational
sqrt Rational
eps Rational
x
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
< Rational
0 = [Char] -> Rational
forall a. HasCallStack => [Char] -> a
error [Char]
"Fraction.sqrt"
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== Rational
0 = Rational
0
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
< Rational
1 = Rational
1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/(Rational -> Rational -> Rational
sqrt Rational
eps (Rational
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
^Integer
2)(Rational, Rational) -> CF -> CF
forall a. a -> [a] -> [a]
:[(Rational
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
^Integer
2) | Integer
r<-[Integer
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
%Integer
1
exp :: Rational -> Rational -> Rational
exp :: Rational -> Rational -> Rational
exp Rational
eps Rational
x
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== Rational
0 = Rational
1
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
> Rational
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
*(Integer
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
< (-Rational
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
*(Integer
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 a
y = (a
1,a
y)(a, a) -> [(a, a)] -> [(a, a)]
forall a. 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
/a
2,a
ya -> Integer -> a
forall a b. (Num a, Integral b) => a -> b -> a
^Integer
2a -> a -> a
forall a. Fractional a => a -> a -> a
/a
12)(a, a) -> [(a, a)] -> [(a, a)]
forall a. a -> [a] -> [a]
:[(a
1,a
ya -> Integer -> a
forall a b. (Num a, Integral b) => a -> b -> a
^Integer
2a -> a -> a
forall a. Fractional a => 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
^Integer
2a -> a -> a
forall a. Num a => a -> a -> a
-a
4)) | a
n<-[a
2..]]
cosh :: Rational -> Rational -> Rational
cosh :: Rational -> Rational -> Rational
cosh Rational
eps 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
*(Integer
1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
2)
where
a :: Rational
a = Rational -> Rational -> Rational
exp Rational
eps Rational
x
b :: Rational
b = Rational
1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
a
sinh :: Rational -> Rational -> Rational
sinh :: Rational -> Rational -> Rational
sinh Rational
eps 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
*(Integer
1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
2)
where
a :: Rational
a = Rational -> Rational -> Rational
exp Rational
eps Rational
x
b :: Rational
b = Rational
1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
a
tanh :: Rational -> Rational -> Rational
tanh :: Rational -> Rational -> Rational
tanh Rational
eps 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 = Rational
1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
a
atanh :: Rational -> Rational -> Rational
atanh :: Rational -> Rational -> Rational
atanh Rational
eps Rational
x
| Bool
otherwise = (Integer
1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
2) Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* (Rational -> Rational -> Rational
log Rational
eps ((Rational
1 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ Rational
x) Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/ (Rational
1 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational
x)))
asinh :: Rational -> Rational -> Rational
asinh :: Rational -> Rational -> Rational
asinh Rational
eps 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
^Integer
2 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ Rational
1)))
acosh :: Rational -> Rational -> Rational
acosh :: Rational -> Rational -> Rational
acosh Rational
eps 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
^Integer
2 Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
- Rational
1)))
log :: Rational -> Rational -> Rational
log :: Rational -> Rational -> Rational
log Rational
eps Rational
x
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
<= Rational
0 = [Char] -> Rational
forall a. HasCallStack => [Char] -> a
error [Char]
"Fraction.log"
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
< Rational
1 = -Rational -> Rational -> Rational
log Rational
eps (Rational
1Rational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
x)
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== Rational
1 = Rational
0
| Bool
otherwise =
case ((Rational, Integer) -> (Rational, Integer)
scaled (Rational
x,Integer
0)) of
(Rational
1,Integer
s) -> (Integer
sInteger -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
1) Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
* Rational -> CF -> Rational
approxCF Rational
eps (Rational -> CF
series Rational
1)
(Rational
y,Integer
0) -> Rational -> CF -> Rational
approxCF Rational
eps (Rational -> CF
series (Rational
yRational -> Rational -> Rational
forall a. Num a => a -> a -> a
-Rational
1))
(Rational
y,Integer
s) -> Rational -> CF -> Rational
approxCF Rational
eps (Rational -> CF
series (Rational
yRational -> Rational -> Rational
forall a. Num a => a -> a -> a
-Rational
1)) Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
+ (Integer
sInteger -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
1)Rational -> Rational -> Rational
forall a. Num a => a -> a -> a
*Rational -> CF -> Rational
approxCF Rational
eps (Rational -> CF
series Rational
1)
where
series :: Rational -> CF
series :: Rational -> CF
series Rational
u = (Rational
0,Rational
u)(Rational, Rational) -> CF -> CF
forall a. a -> [a] -> [a]
:(Rational
1,Rational
uRational -> Rational -> Rational
forall a. Fractional a => a -> a -> a
/Rational
2)(Rational, Rational) -> CF -> CF
forall a. a -> [a] -> [a]
:[(Rational
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
%(Integer
4Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
*Integer
m Integer -> Integer -> Integer
forall a. Num a => a -> a -> a
+ Integer
2)))|Integer
m<-[Integer
1..],Integer
n<-[Integer
0,Integer
1]]
scaled :: (Rational,Integer) -> (Rational, Integer)
scaled :: (Rational, Integer) -> (Rational, Integer)
scaled (Rational
x, Integer
n)
| Rational
x Rational -> Rational -> Bool
forall a. Eq a => a -> a -> Bool
== Rational
2 = (Rational
1,Integer
nInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
1)
| Rational
x Rational -> Rational -> Bool
forall a. Ord a => a -> a -> Bool
< Rational
2 = (Rational
x, Integer
n)
| Bool
otherwise = (Rational, Integer) -> (Rational, Integer)
scaled (Rational
xRational -> Rational -> Rational
forall a. Num a => a -> a -> a
*(Integer
1Integer -> Integer -> Rational
forall a. Integral a => a -> a -> Ratio a
%Integer
2), Integer
nInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
+Integer
1)