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.




PASCAL_MATRIX: PROCEDURE OPTIONS (MAIN); /* derived from Fortran version 18 Decenber 2021 */
 
    pascal_lower: procedure(a);
        declare a(*,*) fixed binary;
        declare (n, i, j) fixed binary;
        n = hbound(a,1);
        a = 0;
        a(*, 1) = 1;
        do i = 2 to n;
            do j = 2 to i;
                a(i, j) = a(i - 1, j) + a(i - 1, j - 1);
            end;
        end;
    end pascal_lower;
 
    pascal_upper: procedure(a);
        declare a(*,*) fixed binary;
        declare (n, i, j) fixed binary;
        n = hbound(a,1);
        a = 0;
        a(1, *) = 1;
        do i = 2 to n;
            do j = 2 to i;
                a(j, i) = a(j, i - 1) + a(j - 1, i - 1);
            end;
        end;
    end pascal_upper;
 
    pascal_symmetric: procedure(a);
        declare a(*,*) fixed binary;
        declare (n, i, j) fixed binary;
        n = hbound(a,1);
        a = 0;
        a(*, 1) = 1;
        a(1, *) = 1;
        do i = 2 to n;
            do j = 2 to n;
                a(i, j) = a(i - 1, j) + a(i, j - 1);
            end;
        end;
    end pascal_symmetric;
 
    declare n fixed binary;
    put ('Size of matrix?');
    get (n);
    begin;
       declare a(n, n) fixed binary;
 
       put skip list ('Lower Pascal Matrix');
       call pascal_lower(a);
       put edit (a) (skip, (n) f(3) );
 
       put skip list ('Upper Pascal Matrix');
       call pascal_upper(a);
       put edit (a) (skip, (n) f(3) );
 
       put skip list ('Symmetric Pascal Matrix');
       call pascal_symmetric(a);
       put edit (a) (skip, (n) f(3) );
    end;
 
end PASCAL_MATRIX;
 