A pascal matrix is a two-dimensional square matrix holding numbers from   Pascal's triangle,   also known as   binomial coefficients   and which can be shown as   nCr.

Shown below are truncated   5-by-5   matrices   M[i, j]   for   i,j   in range   0..4. 


A Pascal upper-triangular matrix that is populated with   jCi:

[[1, 1, 1, 1, 1],
 [0, 1, 2, 3, 4],
 [0, 0, 1, 3, 6],
 [0, 0, 0, 1, 4],
 [0, 0, 0, 0, 1]]

A Pascal lower-triangular matrix that is populated with   iCj   (the transpose of the upper-triangular matrix):

[[1, 0, 0, 0, 0],
 [1, 1, 0, 0, 0],
 [1, 2, 1, 0, 0],
 [1, 3, 3, 1, 0],
 [1, 4, 6, 4, 1]]

A Pascal symmetric matrix that is populated with   i+jCi:

[[1, 1, 1, 1, 1],
 [1, 2, 3, 4, 5],
 [1, 3, 6, 10, 15],
 [1, 4, 10, 20, 35],
 [1, 5, 15, 35, 70]]



Task

Write functions capable of generating each of the three forms of   n-by-n   matrices.

Use those functions to display upper, lower, and symmetric Pascal   5-by-5   matrices on this page.

The output should distinguish between different matrices and the rows of each matrix   (no showing a list of 25 numbers assuming the reader should split it into rows).



Note
 
The   Cholesky decomposition   of a Pascal symmetric matrix is the Pascal lower-triangle matrix of the same size.




import math, sequtils, strutils
 
type SquareMatrix = seq[seq[Natural]]
 
func newSquareMatrix(n: Positive): SquareMatrix =
  ## Create a square matrix.
  newSeqWith(n, newSeq[Natural](n))
 
func pascalUpperTriangular(n: Positive): SquareMatrix =
  ## Create an upper Pascal matrix.
  result = newSquareMatrix(n)
  for i in 0..<n:
    for j in i..<n:
      result[i][j] = binom(j, i)
 
func pascalLowerTriangular(n: Positive): SquareMatrix =
  ## Create a lower Pascal matrix.
  result = newSquareMatrix(n)
  for i in 0..<n:
    for j in i..<n:
      result[j][i] = binom(j, i)
 
func pascalSymmetric(n: Positive): SquareMatrix =
  ## Create a symmetric Pascal matrix.
  result = newSquareMatrix(n)
  for i in 0..<n:
    for j in 0..<n:
      result[i][j] = binom(i + j, i)
 
proc print(m: SquareMatrix) =
  ## Print a square matrix.
  let matMax = max(m.mapIt(max(it)))
  let length = ($matMax).len
  for i in 0..m.high:
    echo "| ", m[i].mapIt(($it).align(length)).join(" "), " |"
 
echo "Upper:"
print pascalUpperTriangular(5)
echo "\nLower:"
print pascalLowerTriangular(5)
echo "\nSymmetric:"
print pascalSymmetric(5)