/usr/share/axiom-20170501/src/algebra/TRIMAT.spad is in axiom-source 20170501-3.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | )abbrev package TRIMAT TriangularMatrixOperations
++ Author: Victor Miller
++ Date Last Updated: 24 Jul 1990
++ Description:
++ This package provides functions that compute "fraction-free"
++ inverses of upper and lower triangular matrices over a integral
++ domain. By "fraction-free inverses" we mean the following:
++ given a matrix B with entries in R and an element d of R such that
++ d * inv(B) also has entries in R, we return d * inv(B). Thus,
++ it is not necessary to pass to the quotient field in any of our
++ computations.
TriangularMatrixOperations(R,Row,Col,M) : SIG == CODE where
R : IntegralDomain
Row : FiniteLinearAggregate R
Col : FiniteLinearAggregate R
M : MatrixCategory(R,Row,Col)
SIG ==> with
UpTriBddDenomInv : (M,R) -> M
++ UpTriBddDenomInv(B,d) returns M, where
++ B is a non-singular upper triangular matrix and d is an
++ element of R such that \spad{M = d * inv(B)} has entries in R.
LowTriBddDenomInv : (M,R) -> M
++ LowTriBddDenomInv(B,d) returns M, where
++ B is a non-singular lower triangular matrix and d is an
++ element of R such that \spad{M = d * inv(B)} has entries in R.
CODE ==> add
UpTriBddDenomInv(A,denom) ==
AI := zero(nrows A, nrows A)$M
offset := minColIndex AI - minRowIndex AI
for i in minRowIndex AI .. maxRowIndex AI
for j in minColIndex AI .. maxColIndex AI repeat
qsetelt_!(AI,i,j,(denom exquo qelt(A,i,j))::R)
for i in minRowIndex AI .. maxRowIndex AI repeat
for j in offset + i + 1 .. maxColIndex AI repeat
qsetelt_!(AI,i,j, - (((+/[qelt(AI,i,k) * qelt(A,k-offset,j)
for k in i+offset..(j-1)])
exquo qelt(A, j-offset, j))::R))
AI
LowTriBddDenomInv(A, denom) ==
AI := zero(nrows A, nrows A)$M
offset := minColIndex AI - minRowIndex AI
for i in minRowIndex AI .. maxRowIndex AI
for j in minColIndex AI .. maxColIndex AI repeat
qsetelt_!(AI,i,j,(denom exquo qelt(A,i,j))::R)
for i in minColIndex AI .. maxColIndex AI repeat
for j in i - offset + 1 .. maxRowIndex AI repeat
qsetelt_!(AI,j,i, - (((+/[qelt(A,j,k+offset) * qelt(AI,k,i)
for k in i-offset..(j-1)])
exquo qelt(A, j, j+offset))::R))
AI
|