Safe Haskell | Safe-Infered |
---|
The cyclotomic numbers are a subset of the complex numbers with the following properties:
- The cyclotomic numbers are represented exactly, enabling exact computations and equality comparisons.
- The cyclotomic numbers contain the Gaussian rationals
(complex numbers of the form
p
+q
i
withp
andq
rational). As a consequence, the cyclotomic numbers are a dense subset of the complex numbers. - The cyclotomic numbers contain the square roots of all rational numbers.
- The cyclotomic numbers form a field: they are closed under addition, subtraction, multiplication, and division.
- The cyclotomic numbers contain the sine and cosine of all rational multiples of pi.
- The cyclotomic numbers can be thought of as the rational field extended
with
n
th roots of unity for arbitrarily large integersn
.
Floating point numbers do not do well with equality comparison:
(sqrt 2 + sqrt 3)^2 == 5 + 2 * sqrt 6 -> False
Data.Complex.Cyclotomic represents these numbers exactly, allowing equality comparison:
(sqrtRat 2 + sqrtRat 3)^2 == 5 + 2 * sqrtRat 6 -> True
Cyclotomic
s can be exported as inexact complex numbers using the toComplex
function:
e 6 -> -e(3)^2 real $ e 6 -> 1/2 imag $ e 6 -> -1/2*e(12)^7 + 1/2*e(12)^11 imag (e 6) == sqrtRat 3 / 2 -> True toComplex $ e 6 -> 0.5000000000000003 :+ 0.8660254037844384
The algorithms for cyclotomic numbers are adapted from code by Martin Schoenert and Thomas Breuer in the GAP project http://www.gap-system.org/ (in particular source files gap4r4/src/cyclotom.c and gap4r4/lib/cyclotom.gi).
- data Cyclotomic
- i :: Cyclotomic
- e :: Integer -> Cyclotomic
- sqrtInteger :: Integer -> Cyclotomic
- sqrtRat :: Rational -> Cyclotomic
- sinDeg :: Rational -> Cyclotomic
- cosDeg :: Rational -> Cyclotomic
- gaussianRat :: Rational -> Rational -> Cyclotomic
- polarRat :: Rational -> Rational -> Cyclotomic
- conj :: Cyclotomic -> Cyclotomic
- real :: Cyclotomic -> Cyclotomic
- imag :: Cyclotomic -> Cyclotomic
- isReal :: Cyclotomic -> Bool
- isRat :: Cyclotomic -> Bool
- isGaussianRat :: Cyclotomic -> Bool
- toComplex :: Cyclotomic -> Complex Double
- toReal :: Cyclotomic -> Maybe Double
- toRat :: Cyclotomic -> Maybe Rational
- goldenRatio :: Cyclotomic
- dft :: [Cyclotomic] -> [Cyclotomic]
- dftInv :: [Cyclotomic] -> [Cyclotomic]
Documentation
data Cyclotomic Source
A cyclotomic number.
Eq Cyclotomic | |
Fractional Cyclotomic | |
Num Cyclotomic |
|
Show Cyclotomic |
The square root of -1.
e :: Integer -> CyclotomicSource
sqrtInteger :: Integer -> CyclotomicSource
The square root of an Integer
.
sqrtRat :: Rational -> CyclotomicSource
The square root of a Rational
number.
sinDeg :: Rational -> CyclotomicSource
Sine function with argument in degrees.
cosDeg :: Rational -> CyclotomicSource
Cosine function with argument in degrees.
gaussianRat :: Rational -> Rational -> CyclotomicSource
Make a Gaussian rational; gaussianRat p q
is the same as p + q * i
.
polarRat :: Rational -> Rational -> CyclotomicSource
A complex number in polar form, with rational magnitude r
and rational angle s
of the form r * exp(2*pi*i*s)
; polarRat r s
is the same as r * e q ^ p
,
where s = p/q
.
conj :: Cyclotomic -> CyclotomicSource
Complex conjugate.
real :: Cyclotomic -> CyclotomicSource
Real part of the cyclotomic number.
imag :: Cyclotomic -> CyclotomicSource
Imaginary part of the cyclotomic number.
isReal :: Cyclotomic -> BoolSource
Is the cyclotomic a real number?
isRat :: Cyclotomic -> BoolSource
Is the cyclotomic a rational?
isGaussianRat :: Cyclotomic -> BoolSource
Is the cyclotomic a Gaussian rational?
toComplex :: Cyclotomic -> Complex DoubleSource
Export as an inexact complex number.
toReal :: Cyclotomic -> Maybe DoubleSource
Export as an inexact real number if possible.
toRat :: Cyclotomic -> Maybe RationalSource
Return an exact rational number if possible.
goldenRatio :: CyclotomicSource
The golden ratio, (1 + √5)/2
.
dft :: [Cyclotomic] -> [Cyclotomic]Source
Discrete Fourier transform,
X_k = sum_{n=0}^{N-1} x_n cdot e^{-i 2 pi frac{k}{N} n}
.
dftInv :: [Cyclotomic] -> [Cyclotomic]Source
Inverse discrete Fourier transform,
x_n = frac{1}{N} sum_{k=0}^{N-1} X_k cdot e^{i 2 pi frac{k}{N} n}
.