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.




BYTE FUNC Index(BYTE i,j,dim)
RETURN (i*dim+j)
 
PROC PascalUpper(BYTE ARRAY mat BYTE dim)
  BYTE i,j
 
  FOR i=0 TO dim-1
  DO
    FOR j=0 TO dim-1
    DO
      IF i>j THEN
        mat(Index(i,j,dim))=0
      ELSEIF i=j OR i=0 THEN
        mat(Index(i,j,dim))=1
      ELSE
        mat(Index(i,j,dim))=mat(Index(i-1,j-1,dim))+mat(Index(i,j-1,dim))
      FI
    OD
  OD
RETURN
 
PROC PascalLower(BYTE ARRAY mat BYTE dim)
  BYTE i,j
 
  FOR i=0 TO dim-1
  DO
    FOR j=0 TO dim-1
    DO
      IF i<j THEN
        mat(Index(i,j,dim))=0
      ELSEIF i=j OR j=0 THEN
        mat(Index(i,j,dim))=1
      ELSE
        mat(Index(i,j,dim))=mat(Index(i-1,j-1,dim))+mat(Index(i-1,j,dim))
      FI
    OD
  OD
RETURN
 
PROC PascalSymmetric(BYTE ARRAY mat BYTE dim)
  BYTE i,j
 
  FOR i=0 TO dim-1
  DO
    FOR j=0 TO dim-1
    DO
      IF i=0 OR j=0 THEN
        mat(Index(i,j,dim))=1
      ELSE
        mat(Index(i,j,dim))=mat(Index(i-1,j,dim))+mat(Index(i,j-1,dim))
      FI
    OD
  OD
RETURN
 
PROC PrintMatrix(BYTE ARRAY mat BYTE dim)
  BYTE i,j,v
 
  FOR i=0 TO dim-1
  DO
    FOR j=0 TO dim-1
    DO
      v=mat(Index(i,j,dim))
      IF v<10 THEN
        Print("   ")
      ELSEIF v<100 THEN
        Print("  ")
      FI
      PrintB(v)
    OD
    PutE()
  OD
RETURN
 
PROC Main()
  BYTE ARRAY mat(25)
  BYTE dim=[5]
 
  PrintE("Pascal upper matrix:")
  PascalUpper(mat,dim)
  PrintMatrix(mat,dim)
  PutE()
 
  PrintE("Pascal lower matrix:")
  PascalLower(mat,dim)
  PrintMatrix(mat,dim)
  PutE()
 
  PrintE("Pascal symmetric matrix:")
  PascalSymmetric(mat,dim)
  PrintMatrix(mat,dim)
RETURN