module Math.NumberTheory.RootsOfUnity
(
RootOfUnity (..)
, toRootOfUnity
, toComplex )
where
import Data.Complex (Complex(..), cis)
import Data.Semigroup (Semigroup(..))
import Data.Ratio ((%), numerator, denominator)
newtype RootOfUnity =
RootOfUnity {
RootOfUnity -> Rational
fromRootOfUnity :: Rational }
deriving (RootOfUnity -> RootOfUnity -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: RootOfUnity -> RootOfUnity -> Bool
$c/= :: RootOfUnity -> RootOfUnity -> Bool
== :: RootOfUnity -> RootOfUnity -> Bool
$c== :: RootOfUnity -> RootOfUnity -> Bool
Eq)
instance Show RootOfUnity where
show :: RootOfUnity -> String
show (RootOfUnity Rational
q)
| Integer
n forall a. Eq a => a -> a -> Bool
== Integer
0 = String
"1"
| Integer
d forall a. Eq a => a -> a -> Bool
== Integer
1 = String
"-1"
| Integer
n forall a. Eq a => a -> a -> Bool
== Integer
1 = String
"e^(πi/" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Integer
d forall a. [a] -> [a] -> [a]
++ String
")"
| Bool
otherwise = String
"e^(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Integer
n forall a. [a] -> [a] -> [a]
++ String
"πi/" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Integer
d forall a. [a] -> [a] -> [a]
++ String
")"
where n :: Integer
n = forall a. Ratio a -> a
numerator (Rational
2forall a. Num a => a -> a -> a
*Rational
q)
d :: Integer
d = forall a. Ratio a -> a
denominator (Rational
2forall a. Num a => a -> a -> a
*Rational
q)
toRootOfUnity :: Rational -> RootOfUnity
toRootOfUnity :: Rational -> RootOfUnity
toRootOfUnity Rational
q = Rational -> RootOfUnity
RootOfUnity ((Integer
n forall a. Integral a => a -> a -> a
`rem` Integer
d) forall a. Integral a => a -> a -> Ratio a
% Integer
d)
where n :: Integer
n = forall a. Ratio a -> a
numerator Rational
q
d :: Integer
d = forall a. Ratio a -> a
denominator Rational
q
instance Semigroup RootOfUnity where
RootOfUnity Rational
q1 <> :: RootOfUnity -> RootOfUnity -> RootOfUnity
<> RootOfUnity Rational
q2 = Rational -> RootOfUnity
toRootOfUnity (Rational
q1 forall a. Num a => a -> a -> a
+ Rational
q2)
stimes :: forall b. Integral b => b -> RootOfUnity -> RootOfUnity
stimes b
k (RootOfUnity Rational
q) = Rational -> RootOfUnity
toRootOfUnity (Rational
q forall a. Num a => a -> a -> a
* (forall a. Integral a => a -> Integer
toInteger b
k forall a. Integral a => a -> a -> Ratio a
% Integer
1))
instance Monoid RootOfUnity where
mappend :: RootOfUnity -> RootOfUnity -> RootOfUnity
mappend = forall a. Semigroup a => a -> a -> a
(<>)
mempty :: RootOfUnity
mempty = Rational -> RootOfUnity
RootOfUnity Rational
0
toComplex :: Floating a => RootOfUnity -> Complex a
toComplex :: forall a. Floating a => RootOfUnity -> Complex a
toComplex (RootOfUnity Rational
t)
| Rational
t forall a. Eq a => a -> a -> Bool
== Rational
1forall a. Fractional a => a -> a -> a
/Rational
2 = (-a
1) forall a. a -> a -> Complex a
:+ a
0
| Rational
t forall a. Eq a => a -> a -> Bool
== Rational
1forall a. Fractional a => a -> a -> a
/Rational
4 = a
0 forall a. a -> a -> Complex a
:+ a
1
| Rational
t forall a. Eq a => a -> a -> Bool
== Rational
3forall a. Fractional a => a -> a -> a
/Rational
4 = a
0 forall a. a -> a -> Complex a
:+ (-a
1)
| Bool
otherwise = forall a. Floating a => a -> Complex a
cis forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a
2forall a. Num a => a -> a -> a
*forall a. Floating a => a
piforall a. Num a => a -> a -> a
*) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Fractional a => Rational -> a
fromRational forall a b. (a -> b) -> a -> b
$ Rational
t