'Helper function of function upper_triangular_solve.
Without the error checks, to be used privately.'

def _upper_triangular_solve(self, rhs):

    X = zeros(self.rows, rhs.cols)
    for j in range(rhs.cols):
        for i in reversed(range(self.rows)):
            if (self[(i, i)] == 0):
                raise ValueError('Matrix    must    be    non-singular.')
            X[(i, j)] = ((rhs[(i, j)] - sum(((self[(i, k)] * X[(k, j)]) for k in range((i + 1), self.rows)))) / self[(i, i)])
    return self._new(X)
