module Math.TriangularNumbers where
triangularNumber :: Int -> Int
triangularNumber :: Int -> Int
triangularNumber Int
x = (Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
* (Int
xInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1)) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
2
{-# INLINE triangularNumber #-}
linearizeUppertri :: (Int,Int) -> Int
linearizeUppertri :: (Int, Int) -> Int
linearizeUppertri (Int
i,Int
j) = Int -> Int
triangularNumber (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Int
jInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1
{-# INLINE linearizeUppertri #-}
toLinear :: Int -> (Int,Int) -> Int
toLinear :: Int -> (Int, Int) -> Int
toLinear Int
n (Int
i,Int
j) = Int -> (Int, Int) -> Int
adr Int
n (Int
i,Int
j)
where
adr :: Int -> (Int, Int) -> Int
adr Int
n (Int
i,Int
j) = (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1)Int -> Int -> Int
forall a. Num a => a -> a -> a
*Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int -> Int
triangularNumber Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
j
{-# Inline adr #-}
{-# INLINE toLinear #-}
fromLinear :: Int -> Int -> (Int,Int)
fromLinear :: Int -> Int -> (Int, Int)
fromLinear Int
n' Int
k' = (Int
i,Int
j)
where ll :: Double
ll = (Double
2Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
nDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
1) Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
2
rr :: Double
rr = Double -> Double
forall a. Floating a => a -> a
sqrt (Double -> Double) -> Double -> Double
forall a b. (a -> b) -> a -> b
$ ((Double
2Double -> Double -> Double
forall a. Num a => a -> a -> a
*(Double
nDouble -> Double -> Double
forall a. Num a => a -> a -> a
+Double
1)Double -> Double -> Double
forall a. Num a => a -> a -> a
+Double
1) Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Double
2)Double -> Integer -> Double
forall a b. (Num a, Integral b) => a -> b -> a
^Integer
2 Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
2Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double
k
n :: Double
n = Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n'
k :: Double
k = Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
k'
i :: Int
i = Double -> Int
forall a b. (RealFrac a, Integral b) => a -> b
floor (Double -> Int) -> Double -> Int
forall a b. (a -> b) -> a -> b
$ Double
ll Double -> Double -> Double
forall a. Num a => a -> a -> a
- Double
rr Double -> Double -> Double
forall a. Num a => a -> a -> a
+ Double
1
j :: Int
j = Int
k' Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int -> (Int, Int) -> Int
toLinear Int
n' (Int
i,Int
0)
{-# Inline fromLinear #-}