Copyright | (c) 2012 Brent Yorgey |
---|---|

License | BSD-style (see LICENSE) |

Maintainer | byorgey@cis.upenn.edu |

Safe Haskell | None |

Language | Haskell2010 |

Factorization diagrams, as seen at http://mathlesstraveled.com/2012/10/05/factorization-diagrams/ and http://mathlesstraveled.com/2012/11/05/more-factorization-diagrams/ and on the cover of Hacker Monthly (http://hackermonthly.com/issue-31.html): visually represent the prime factorization of n by drawing n dots recursively grouped according to the factors.

- primeLayout :: (Renderable (Path V2 n) b, TypeableFloat n) => [Colour Double] -> Integer -> QDiagram b V2 n Any -> QDiagram b V2 n Any
- colorBars :: (Renderable (Path V2 n) b, TypeableFloat n) => [Colour Double] -> Integer -> Path V2 n -> QDiagram b V2 n Any
- defaultColors :: [Colour Double]
- factorDiagram' :: (Renderable (Path V2 n) b, TypeableFloat n) => [Integer] -> QDiagram b V2 n Any
- factorDiagram :: (Renderable (Path V2 n) b, TypeableFloat n) => Integer -> QDiagram b V2 n Any
- factors :: Integer -> [Integer]
- ensquare :: (Renderable (Path V2 n) b, TypeableFloat n) => n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
- fdGrid :: (Renderable (Path V2 n) b, TypeableFloat n) => [[Integer]] -> QDiagram b V2 n Any
- fdGridList :: (Renderable (Path V2 n) b, TypeableFloat n) => Integer -> QDiagram b V2 n Any
- fdMultTable :: (Renderable (Path V2 n) b, TypeableFloat n) => Integer -> QDiagram b V2 n Any

# Documentation

primeLayout :: (Renderable (Path V2 n) b, TypeableFloat n) => [Colour Double] -> Integer -> QDiagram b V2 n Any -> QDiagram b V2 n Any Source

`primeLayout`

takes a positive integer p (the idea is for it to
be prime, though it doesn't really matter) and a diagram, and lays
out p rotated copies of the diagram in a circular pattern.

There is a special case for `p = 2`

: if the given diagram is taller
than it is wide, then the two copies will be placed beside each
other; if wider then tall, they will be placed one above the
other.

The regular `p`

-gon connecting the centers of the laid-out
diagrams is also filled in with vertical bars of color
representing the number `p`

. In particular, there is one color
for each decimal digit (the provided list should have length 10
and represents the digits 0-9), and the colors, read left to
right, give the decimal expansion of `p`

.

import Diagrams.TwoD.Factorization plExample = pad 1.1 . centerXY . hsep 0.5 . map (sized (mkWidth 1)) $ [ primeLayout defaultColors 5 (circle 1 # fc black) , primeLayout defaultColors 103 (square 1 # fc green # lw none) , primeLayout (repeat white) 13 (circle 1 # lc orange) ]

colorBars :: (Renderable (Path V2 n) b, TypeableFloat n) => [Colour Double] -> Integer -> Path V2 n -> QDiagram b V2 n Any Source

Draw vertical bars of color inside a polygon which represent the
decimal expansion of `p`

, using the provided list of colors to
represent the digits 0-9.

import Diagrams.TwoD.Factorization colorBarsEx = colorBars defaultColors 3526 (square 1)

defaultColors :: [Colour Double] Source

A default set of digit colors, based very loosely on the color code for resistors (http://en.wikipedia.org/wiki/Electronic_color_code), lightened up a bit by blending with white.

factorDiagram' :: (Renderable (Path V2 n) b, TypeableFloat n) => [Integer] -> QDiagram b V2 n Any Source

Create a centered factorization diagram from the given list of
factors (intended to be primes, but again, any positive integers
will do; note how the below example uses 6), by recursively
folding according to `primeLayout`

, with the `defaultColors`

and
a base case of a black circle.

import Diagrams.TwoD.Factorization factorDiagram'Ex = factorDiagram' [2,5,6]

factorDiagram :: (Renderable (Path V2 n) b, TypeableFloat n) => Integer -> QDiagram b V2 n Any Source

Create a default factorization diagram for the given integer, by
factoring it and calling `factorDiagram'`

on its prime
factorization (with the factors ordered from smallest to
biggest).

import Diagrams.TwoD.Factorization factorDiagramEx = factorDiagram 700

ensquare :: (Renderable (Path V2 n) b, TypeableFloat n) => n -> QDiagram b V2 n Any -> QDiagram b V2 n Any Source

Place a diagram inside a square with the given side length, centering and scaling it to fit with a bit of padding.

import Diagrams.TwoD.Factorization ensquareEx = ensquare 1 (circle 25) ||| ensquare 1 (factorDiagram 30)

fdGrid :: (Renderable (Path V2 n) b, TypeableFloat n) => [[Integer]] -> QDiagram b V2 n Any Source

`fdGrid n`

creates a grid of factorization diagrams, given a list
of lists of integers: the inner lists represent L-R rows, which
are laid out from top to bottom.

import Diagrams.TwoD.Factorization fdGridEx = fdGrid [[7,6,5],[4,19,200],[1,10,50]]

fdGridList :: (Renderable (Path V2 n) b, TypeableFloat n) => Integer -> QDiagram b V2 n Any Source

`fdGridList n`

creates a grid containing the factorization
diagrams of all the numbers from `1`

to `n^2`

, ordered left to
right, top to bottom (like the grid seen on the cover of Hacker
Monthly, http://hackermonthly.com/issue-31.html).

import Diagrams.TwoD.Factorization grid100 = fdGridList 10 grid100Big = grid100

fdMultTable :: (Renderable (Path V2 n) b, TypeableFloat n) => Integer -> QDiagram b V2 n Any Source

`fdTable n`

creates a "multiplication table" of factorization
diagrams, with the diagrams for `1`

to `n`

along both the top row
and left column, and the diagram for `m*n`

in row `m`

and column
`n`

.

import Diagrams.TwoD.Factorization fdMultTableEx = fdMultTable 13