{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Diagrams.TwoD.Factorization where
import Data.Char (digitToInt)
import Data.List.Split (chunksOf)
import Data.Maybe (listToMaybe)
import Diagrams.Prelude
primeLayout :: (Renderable (Path V2 n) b, TypeableFloat n)
=> [Colour Double] -> Integer -> QDiagram b V2 n Any -> QDiagram b V2 n Any
primeLayout :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[Colour Double]
-> Integer -> QDiagram b V2 n Any -> QDiagram b V2 n Any
primeLayout [Colour Double]
_ Integer
2 QDiagram b V2 n Any
d
| forall n a. (InSpace V2 n a, Enveloped a) => a -> n
width QDiagram b V2 n Any
d forall a. Ord a => a -> a -> Bool
>= forall n a. (InSpace V2 n a, Enveloped a) => a -> n
height QDiagram b V2 n Any
d = (QDiagram b V2 n Any
d forall n a.
(InSpace V2 n a, Juxtaposable a, Semigroup a) =>
a -> a -> a
=== forall (v :: * -> *) n b m.
(Metric v, R2 v, OrderedField n) =>
n -> QDiagram b v n m
strutY (forall n a. (InSpace V2 n a, Enveloped a) => a -> n
height QDiagram b V2 n Any
d forall a. Fractional a => a -> a -> a
/ n
3) forall n a.
(InSpace V2 n a, Juxtaposable a, Semigroup a) =>
a -> a -> a
=== QDiagram b V2 n Any
d forall a b. a -> (a -> b) -> b
# forall (v :: * -> *) n t.
(InSpace v n t, R2 v, Transformable t) =>
t -> t
reflectY)
# centerY
| Bool
otherwise = (QDiagram b V2 n Any
d forall n a.
(InSpace V2 n a, Juxtaposable a, Semigroup a) =>
a -> a -> a
||| forall (v :: * -> *) n b m.
(Metric v, R1 v, OrderedField n) =>
n -> QDiagram b v n m
strutX (forall n a. (InSpace V2 n a, Enveloped a) => a -> n
width QDiagram b V2 n Any
d forall a. Fractional a => a -> a -> a
/ n
3) forall n a.
(InSpace V2 n a, Juxtaposable a, Semigroup a) =>
a -> a -> a
||| QDiagram b V2 n Any
d)
# centerX
primeLayout [Colour Double]
colors Integer
p QDiagram b V2 n Any
d
= (forall a. Monoid a => [a] -> a
mconcat forall a b. (a -> b) -> a -> b
$
forall a b. (a -> b) -> [a] -> [b]
map (\Integer
n -> QDiagram b V2 n Any
d forall a b. a -> (a -> b) -> b
# forall (v :: * -> *) n t.
(InSpace v n t, R2 v, Transformable t) =>
n -> t -> t
translateY n
r forall a b. a -> (a -> b) -> b
# forall n t.
(InSpace V2 n t, Transformable t, Floating n) =>
n -> t -> t
rotateBy
(forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
nforall a. Fractional a => a -> a -> a
/forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
p)) [Integer
0..Integer
pforall a. Num a => a -> a -> a
-Integer
1]
)
forall a. Semigroup a => a -> a -> a
<>
forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[Colour Double] -> Integer -> Path V2 n -> QDiagram b V2 n Any
colorBars [Colour Double]
colors Integer
p Path V2 n
poly
where poly :: Path V2 n
poly = forall n t. (InSpace V2 n t, TrailLike t) => PolygonOpts n -> t
polygon (forall d. Default d => d
with forall a b. a -> (a -> b) -> b
& forall n. Lens' (PolygonOpts n) (PolyType n)
polyType forall s t a b. ASetter s t a b -> b -> s -> t
.~ forall n. Int -> n -> PolyType n
PolyRegular (forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
p) n
r
forall a b. a -> (a -> b) -> b
& forall n. Lens' (PolygonOpts n) (PolyOrientation n)
polyOrient forall s t a b. ASetter s t a b -> b -> s -> t
.~ forall n. PolyOrientation n
OrientH
)
w :: n
w = forall a. Ord a => a -> a -> a
max (forall n a. (InSpace V2 n a, Enveloped a) => a -> n
width QDiagram b V2 n Any
d) (forall n a. (InSpace V2 n a, Enveloped a) => a -> n
height QDiagram b V2 n Any
d)
r :: n
r = n
w forall a. Num a => a -> a -> a
* n
c forall a. Fractional a => a -> a -> a
/ forall a. Floating a => a -> a
sin (forall a. Floating a => a
tau forall a. Fractional a => a -> a -> a
/ (n
2 forall a. Num a => a -> a -> a
* forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
p))
c :: n
c = n
0.75
colorBars :: (Renderable (Path V2 n) b, TypeableFloat n)
=> [Colour Double] -> Integer -> Path V2 n -> QDiagram b V2 n Any
colorBars :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[Colour Double] -> Integer -> Path V2 n -> QDiagram b V2 n Any
colorBars [Colour Double]
colors Integer
p Path V2 n
poly | Integer
p forall a. Ord a => a -> a -> Bool
<= Integer
11 = forall n t b.
(InSpace V2 n t, ToPath t, TypeableFloat n,
Renderable (Path V2 n) b) =>
t -> QDiagram b V2 n Any
stroke Path V2 n
poly
# fc (colors!!(fromIntegral p `mod` 10))
# lw none
colorBars [Colour Double]
colors Integer
p Path V2 n
poly = QDiagram b V2 n Any
bars forall a b. a -> (a -> b) -> b
# forall a n.
(HasStyle a, V a ~ V2, N a ~ n, TypeableFloat n) =>
Path V2 n -> a -> a
clipBy Path V2 n
poly
where
barColors :: [Colour Double]
barColors = forall a b. (a -> b) -> [a] -> [b]
map (([Colour Double]
colorsforall a. [a] -> Int -> a
!!) forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
digitToInt) (forall a. Show a => a -> String
show Integer
p)
barW :: n
barW = forall n a. (InSpace V2 n a, Enveloped a) => a -> n
width Path V2 n
poly forall a. Fractional a => a -> a -> a
/ forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall (t :: * -> *) a. Foldable t => t a -> Int
length [Colour Double]
barColors)
barH :: n
barH = forall n a. (InSpace V2 n a, Enveloped a) => a -> n
height Path V2 n
poly
bars :: QDiagram b V2 n Any
bars = (forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
Monoid' a) =>
[a] -> a
hcat forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (\Colour Double
c -> forall n t. (InSpace V2 n t, TrailLike t) => n -> n -> t
rect n
barW n
barH forall a b. a -> (a -> b) -> b
# forall n a.
(InSpace V2 n a, Floating n, Typeable n, HasStyle a) =>
Colour Double -> a -> a
fc Colour Double
c forall a b. a -> (a -> b) -> b
# forall n a.
(InSpace V2 n a, Typeable n, Floating n, HasStyle a) =>
Colour Double -> a -> a
lc Colour Double
c) [Colour Double]
barColors)
# centerX
defaultColors :: [Colour Double]
defaultColors :: [Colour Double]
defaultColors = forall a b. (a -> b) -> [a] -> [b]
map (forall a (f :: * -> *).
(Num a, AffineSpace f) =>
a -> f a -> f a -> f a
blend Double
0.1 forall a. (Ord a, Floating a) => Colour a
white)
[forall a. Num a => Colour a
black,forall a. (Ord a, Floating a) => Colour a
red,forall a. (Ord a, Floating a) => Colour a
orange,forall a. (Ord a, Floating a) => Colour a
yellow,forall a. (Ord a, Floating a) => Colour a
green,forall a. (Ord a, Floating a) => Colour a
blue,forall a. (Ord a, Floating a) => Colour a
gray,forall a. (Ord a, Floating a) => Colour a
purple,forall a. (Ord a, Floating a) => Colour a
white,forall a. (Ord a, Floating a) => Colour a
brown]
factorDiagram' :: (Renderable (Path V2 n) b, TypeableFloat n)
=> [Integer] -> QDiagram b V2 n Any
factorDiagram' :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[Integer] -> QDiagram b V2 n Any
factorDiagram' = forall (v :: * -> *) n a.
(InSpace v n a, R2 v, Fractional n, Alignable a, HasOrigin a) =>
a -> a
centerXY forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[Colour Double]
-> Integer -> QDiagram b V2 n Any -> QDiagram b V2 n Any
primeLayout [Colour Double]
defaultColors) (forall t n.
(TrailLike t, V t ~ V2, N t ~ n, Transformable t) =>
n -> t
circle n
1 forall a b. a -> (a -> b) -> b
# forall n a.
(InSpace V2 n a, Floating n, Typeable n, HasStyle a) =>
Colour Double -> a -> a
fc forall a. Num a => Colour a
black forall a b. a -> (a -> b) -> b
# forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw forall n. OrderedField n => Measure n
none)
factorDiagram :: (Renderable (Path V2 n) b, TypeableFloat n)
=> Integer -> QDiagram b V2 n Any
factorDiagram :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
Integer -> QDiagram b V2 n Any
factorDiagram = forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[Integer] -> QDiagram b V2 n Any
factorDiagram' forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> [Integer]
factors
factors :: Integer -> [Integer]
factors :: Integer -> [Integer]
factors Integer
1 = []
factors Integer
n = forall b a. b -> (a -> b) -> Maybe a -> b
maybe [Integer
n] (\Integer
a -> Integer
a forall a. a -> [a] -> [a]
: Integer -> [Integer]
factors (Integer
n forall a. Integral a => a -> a -> a
`div` Integer
a)) Maybe Integer
mf
where
mf :: Maybe Integer
mf = forall a. [a] -> Maybe a
listToMaybe forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
filter (\Integer
x -> (Integer
n forall a. Integral a => a -> a -> a
`mod` Integer
x) forall a. Eq a => a -> a -> Bool
== Integer
0) [Integer
2 .. Integer
n forall a. Num a => a -> a -> a
- Integer
1]
ensquare
:: (Renderable (Path V2 n) b, TypeableFloat n)
=> n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
ensquare :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
ensquare n
n QDiagram b V2 n Any
d = QDiagram b V2 n Any
d forall a b. a -> (a -> b) -> b
# forall (v :: * -> *) n a.
(InSpace v n a, R2 v, Fractional n, Alignable a, HasOrigin a) =>
a -> a
centerXY forall a b. a -> (a -> b) -> b
# forall (v :: * -> *) n a.
(InSpace v n a, HasLinearMap v, Transformable a, Enveloped a) =>
SizeSpec v n -> a -> a
sized (forall n. n -> n -> SizeSpec V2 n
dims2D (n
0.8forall a. Num a => a -> a -> a
*n
n) (n
0.8forall a. Num a => a -> a -> a
*n
n)) forall a. Semigroup a => a -> a -> a
<> forall n t. (InSpace V2 n t, TrailLike t) => n -> t
square n
n
fdGrid
:: (Renderable (Path V2 n) b, TypeableFloat n)
=> [[Integer]] -> QDiagram b V2 n Any
fdGrid :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[[Integer]] -> QDiagram b V2 n Any
fdGrid = forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
Monoid' a) =>
[a] -> a
vcat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
Monoid' a) =>
[a] -> a
hcat forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a b. (a -> b) -> [a] -> [b]
map forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map) (forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
ensquare n
1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
Integer -> QDiagram b V2 n Any
factorDiagram)
fdGridList
:: (Renderable (Path V2 n) b, TypeableFloat n)
=> Integer -> QDiagram b V2 n Any
fdGridList :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
Integer -> QDiagram b V2 n Any
fdGridList Integer
n = forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[[Integer]] -> QDiagram b V2 n Any
fdGrid forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall e. Int -> [e] -> [[e]]
chunksOf (forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
n) forall a b. (a -> b) -> a -> b
$ [Integer
1..Integer
nforall a. Num a => a -> a -> a
*Integer
n]
fdMultTable
:: (Renderable (Path V2 n) b, TypeableFloat n)
=> Integer -> QDiagram b V2 n Any
fdMultTable :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
Integer -> QDiagram b V2 n Any
fdMultTable Integer
n = forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[[Integer]] -> QDiagram b V2 n Any
fdGrid [ [Integer
rforall a. Num a => a -> a -> a
*Integer
c | Integer
c <- [Integer
1 .. Integer
n]] | Integer
r <- [Integer
1 .. Integer
n] ]