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.




BEGIN
    # returns an upper Pascal matrix of size n #
    PROC upper pascal matrix = ( INT n )[,]INT:
         BEGIN
            [ 1 : n, 1 : n ]INT result;
            FOR j        TO n DO result[ 1, j ] := 1 OD;
            FOR i FROM 2 TO n DO
                result[ i, 1 ] := 0;
                FOR j FROM 2 TO n DO
                    result[ i, j ] := result[ i - 1, j - 1 ] + result[ i, j - 1 ]
                OD
            OD;
            result
         END # upper pascal matrix # ;
 
    # returns a lower Pascal matrix of size n #
    PROC lower pascal matrix = ( INT n )[,]INT:
         BEGIN
            [ 1 : n, 1 : n ]INT result;
            FOR i        TO n DO result[ i, 1 ] := 1 OD;
            FOR j FROM 2 TO n DO
                result[ 1, j ] := 0;
                FOR i FROM 2 TO n DO
                    result[ i, j ] := result[ i - 1, j - 1 ] + result[ i - 1, j ]
                OD
            OD;
            result
         END # lower pascal matrix # ;
 
    # returns a symmetric Pascal matrix of size n #
    PROC symmetric pascal matrix = ( INT n )[,]INT:
         BEGIN
            [ 1 : n, 1 : n ]INT result;
            FOR i TO n DO
                result[ i, 1 ] := 1;
                result[ 1, i ] := 1
            OD;
            FOR j FROM 2 TO n DO
                FOR i FROM 2 TO n DO
                    result[ i, j ] := result[ i, j - 1 ] + result[ i - 1, j ]
                OD
            OD;
            result
         END # symmetric pascal matrix # ;
 
    # print the matrix m with the specified field width #
    PROC print matrix = ( [,]INT m, INT field width )VOID:
         BEGIN
             FOR i FROM 1 LWB m TO 1 UPB m DO
                 FOR j FROM 2 LWB m TO 2 UPB m DO
                     print( ( " ", whole( m[ i, j ], - field width ) ) )
                 OD;
                 print( ( newline ) )
             OD
         END # print matrix # ;
 
    print( ( "upper:",     newline ) ); print matrix( upper pascal matrix(     5 ), 2 );
    print( ( "lower:",     newline ) ); print matrix( lower pascal matrix(     5 ), 2 );
    print( ( "symmetric:", newline ) ); print matrix( symmetric pascal matrix( 5 ), 2 )
 
END