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.




 
# Project : Pascal matrix generation
 
load "stdlib.ring"
res = newlist(5,5)
 
see "=== Pascal upper matrix ===" + nl
result = pascalupper(5)
showarray(result)
 
see nl + "=== Pascal lower matrix ===" + nl
result = pascallower(5)
showarray(result)
 
see nl + "=== Pascal symmetrical matrix ===" + nl
result = pascalsymmetric(5)
showarray(result)
 
func pascalupper(n)
    for m=1 to n
          for p=1 to n
               res[m][p] = 0
          next
    next 
    for p=1 to n
         res[1][p] = 1
    next    
    for i=2 to n 
        for j=2 to i 
            res[j][i] = res[j][i-1]+res[j-1][i-1]
        end 
    end 
    return res
 
func pascallower(n)
        for m=1 to n
              for p=1 to n
                   res[m][p] = 0
              next
        next
       for p=1 to n  
             res[p][1] = 1
       next
       for i=2 to n 
            for j=2 to i 
                 res[i][j] = res[i-1][j]+res[i-1][j-1]
            next
        next
        return res
 
func pascalsymmetric(n)
        for m=1 to n
              for p=1 to n
                   res[m][p] = 0
              next
        next
        for p=1 to n 
              res[p][1] = 1
              res[1][p] = 1
        next
        for i=2 to n 
             for j = 2 to n 
                  res[i][j] = res[i-1][j]+res[i][j-1]
             next
        next
        return res
 
func showarray(result)
        for n=1 to 5
              for m=1 to 5
                   see "" + result[n][m] + " "
              next
             see nl
        next
 