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.




EnableExplicit
Define.i x=5, I, J
 
Macro Print_Pascal_matrix(typ)
  PrintN(typ)
  For I=1 To x
    For J=1 To x : Print(RSet(Str(p(I,J)),3," ")+Space(3)) : Next  
    PrintN("")
  Next
  Print(~"\n\n")  
EndMacro
 
Procedure Pascal_sym(n.i,Array p.i(2))  
  Define.i I,J  
  p(1,0)=1
  For I=1 To n
    For J=1 To n : p(I,J)=p(I-1,J)+p(I,J-1) : Next
  Next
EndProcedure
 
Procedure Pascal_upp(n.i,Array p.i(2))  
  Define.i I,J  
  p(0,0)=1
  For I=1 To n
    For J=1 To n : p(I,J)=p(I-1,J-1)+p(I,J-1) : Next
  Next  
EndProcedure
 
Procedure Pascal_low(n.i,Array p.i(2))
  Define.i I,J
  Pascal_upp(n,p())
  Dim p2.i(n,n)
  CopyArray(p(),p2())  
  For I=1 To n
    For J=1 To n : Swap p(J,I),p2(I,J) : Next
  Next  
EndProcedure
 
OpenConsole()
 
Dim p.i(x,x)
Pascal_upp(x,p())
Print_Pascal_matrix("Upper:")
 
Dim p.i(x,x)
Pascal_low(x,p())
Print_Pascal_matrix("Lower:")
 
Dim p.i(x,x)
Pascal_sym(x,p())
Print_Pascal_matrix("Symmetric:")
 
Input()
End