Add tasks for all the new languages
This commit is contained in:
parent
9dc3c2bb62
commit
bba7bfd280
13208 changed files with 134745 additions and 0 deletions
|
|
@ -0,0 +1,32 @@
|
|||
function ToReducedRowEchelonForm(sequence M)
|
||||
integer lead = 1,
|
||||
rowCount = length(M),
|
||||
columnCount = length(M[1]),
|
||||
i
|
||||
for r=1 to rowCount do
|
||||
if lead>=columnCount then exit end if
|
||||
i = r
|
||||
while M[i][lead]=0 do
|
||||
i += 1
|
||||
if i=rowCount then
|
||||
i = r
|
||||
lead += 1
|
||||
if lead=columnCount then exit end if
|
||||
end if
|
||||
end while
|
||||
-- nb M[i] is assigned before M[r], which matters when i=r:
|
||||
{M[r],M[i]} = {sq_div(M[i],M[i][lead]),M[r]}
|
||||
for j=1 to rowCount do
|
||||
if j!=r then
|
||||
M[j] = sq_sub(M[j],sq_mul(M[j][lead],M[r]))
|
||||
end if
|
||||
end for
|
||||
lead += 1
|
||||
end for
|
||||
return M
|
||||
end function
|
||||
|
||||
? ToReducedRowEchelonForm(
|
||||
{ { 1, 2, -1, -4 },
|
||||
{ 2, 3, -1, -11 },
|
||||
{ -2, 0, -3, 22 } })
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
func rref (Array m) {
|
||||
m.is_empty && return;
|
||||
var (lead, rows, cols) = (0, m.len, m[0].len);
|
||||
|
||||
rows.range.each { |r|
|
||||
lead >= cols && return m;
|
||||
var i = r;
|
||||
|
||||
while (!m[i][lead]) {
|
||||
++i == rows || next;
|
||||
i = r;
|
||||
++lead == cols && return m;
|
||||
}
|
||||
|
||||
m[i, r] = m[r, i];
|
||||
var lv = m[r][lead];
|
||||
m[r] = (m[r] »/» lv);
|
||||
|
||||
rows.range.each { |n|
|
||||
n == r && next;
|
||||
m[n] = (m[n] »-« (m[r] «*« m[n][lead]))
|
||||
}
|
||||
++lead;
|
||||
}
|
||||
return m
|
||||
}
|
||||
|
||||
func say_it (message, array) {
|
||||
say "\n#{message}";
|
||||
array.each { |row|
|
||||
say row.map { |n| " %5s" % n.as_rat }.join
|
||||
}
|
||||
}
|
||||
|
||||
var M = [
|
||||
[ # base test case
|
||||
[ 1, 2, -1, -4 ],
|
||||
[ 2, 3, -1, -11 ],
|
||||
[ -2, 0, -3, 22 ],
|
||||
],
|
||||
[ # mix of number styles
|
||||
[ 3, 0, -3, 1 ],
|
||||
[ .5, 3/2, -3, -2 ],
|
||||
[ .2, 4/5, -1.6, .3 ],
|
||||
],
|
||||
[ # degenerate case
|
||||
[ 1, 2, 3, 4, 3, 1],
|
||||
[ 2, 4, 6, 2, 6, 2],
|
||||
[ 3, 6, 18, 9, 9, -6],
|
||||
[ 4, 8, 12, 10, 12, 4],
|
||||
[ 5, 10, 24, 11, 15, -4],
|
||||
],
|
||||
];
|
||||
|
||||
M.each { |matrix|
|
||||
say_it('Original Matrix', matrix);
|
||||
say_it('Reduced Row Echelon Form Matrix', rref(matrix));
|
||||
say '';
|
||||
}
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
var lead = 0
|
||||
var rowCount = eCount
|
||||
var columnCount = mCount
|
||||
for (var r = 0; r < rowCount; ++r) {
|
||||
if (columnCount <= lead) {
|
||||
break
|
||||
}
|
||||
var i = r
|
||||
while (matrix[i][lead] == 0) {
|
||||
++i
|
||||
if (i == rowCount) {
|
||||
i = r
|
||||
++lead
|
||||
if (columnCount == lead) {
|
||||
--lead
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
for (var j = 0; j < columnCount; ++j) {
|
||||
var temp = matrix[r][j]
|
||||
matrix[r][j] = matrix[i][j]
|
||||
matrix[i][j] = temp
|
||||
}
|
||||
var div = matrix[r][lead]
|
||||
if (div != 0) {
|
||||
for (var j = 0; j < columnCount; ++j) {
|
||||
matrix[r][j] /= div
|
||||
}
|
||||
}
|
||||
for (var j = 0; j < rowCount; ++j) {
|
||||
if (j != r) {
|
||||
var sub = matrix[j][lead]
|
||||
for (var k = 0; k < columnCount; ++k) {
|
||||
matrix[j][k] -= (sub * matrix[r][k])
|
||||
}
|
||||
}
|
||||
}
|
||||
++lead
|
||||
}
|
||||
|
|
@ -0,0 +1,90 @@
|
|||
CLOSE DATABASES ALL
|
||||
LOCAL lnRows As Integer, lnCols As Integer, lcSafety As String
|
||||
LOCAL ARRAY matrix[1]
|
||||
lcSafety = SET("Safety")
|
||||
SET SAFETY OFF
|
||||
CLEAR
|
||||
CREATE CURSOR results (c1 B(6), c2 B(6), c3 B(6), c4 B(6))
|
||||
CREATE CURSOR curs1(c1 I, c2 I, c3 I, c4 I)
|
||||
INSERT INTO curs1 VALUES (1,2,-1,-4)
|
||||
INSERT INTO curs1 VALUES (2,3,-1,-11)
|
||||
INSERT INTO curs1 VALUES (-2,0,-3,22)
|
||||
lnRows = RECCOUNT() && 3
|
||||
lnCols = FCOUNT() && 4
|
||||
SELECT * FROM curs1 INTO ARRAY matrix
|
||||
IF RREF(@matrix, lnRows, lnCols)
|
||||
SELECT results
|
||||
APPEND FROM ARRAY matrix
|
||||
BROWSE NORMAL IN SCREEN
|
||||
ENDIF
|
||||
SET SAFETY &lcSafety
|
||||
|
||||
FUNCTION RREF(mat, tnRows As Integer, tnCols As Integer) As Boolean
|
||||
LOCAL lnPivot As Integer, i As Integer, r As Integer, j As Integer, ;
|
||||
p As Double. llResult As Boolean, llExit As Boolean
|
||||
llResult = .T.
|
||||
llExit = .F.
|
||||
lnPivot = 1
|
||||
FOR r = 1 TO tnRows
|
||||
IF lnPivot > tnCols
|
||||
EXIT
|
||||
ENDIF
|
||||
i = r
|
||||
DO WHILE mat[i,lnPivot] = 0
|
||||
i = i + 1
|
||||
IF i = tnRows
|
||||
i = r
|
||||
lnPivot = lnPivot + 1
|
||||
IF lnPivot > tnCols
|
||||
llExit = .T.
|
||||
EXIT
|
||||
ENDIF
|
||||
ENDIF
|
||||
ENDDO
|
||||
IF llExit
|
||||
EXIT
|
||||
ENDIF
|
||||
ASwapRows(@mat, i, r)
|
||||
p = mat[r,lnPivot]
|
||||
IF p # 0
|
||||
FOR j = 1 TO tnCols
|
||||
mat[r,j] = mat[r,j]/p
|
||||
ENDFOR
|
||||
ELSE
|
||||
? "Divison by zero."
|
||||
llResult = .F.
|
||||
EXIT
|
||||
ENDIF
|
||||
FOR i = 1 TO tnRows
|
||||
IF i # r
|
||||
p = mat[i,lnPivot]
|
||||
FOR j = 1 TO tnCols
|
||||
mat[i,j] = mat[i,j] - mat[r,j]*p
|
||||
ENDFOR
|
||||
ENDIF
|
||||
ENDFOR
|
||||
lnPivot = lnPivot + 1
|
||||
ENDFOR
|
||||
RETURN llResult
|
||||
ENDFUNC
|
||||
|
||||
PROCEDURE ASwapRows(arr, tnRow1 As Integer, tnRow2 As Integer)
|
||||
*!* Interchange rows tnRow1 and tnRow2 of array arr.
|
||||
LOCAL n As Integer
|
||||
n = ALEN(arr,2)
|
||||
LOCAL ARRAY tmp[1,n]
|
||||
STORE 0 TO tmp
|
||||
ACPY2(@arr, @tmp, tnRow1, 1)
|
||||
ACPY2(@arr, @arr, tnRow2, tnRow1)
|
||||
ACPY2(@tmp, @arr, 1, tnRow2)
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE ACPY2(m1, m2, tnSrcRow As Integer, tnDestRow As Integer)
|
||||
*!* Copy m1[tnSrcRow,*] to m2[tnDestRow,*]
|
||||
*!* m1 and m2 must have the same number of columns.
|
||||
LOCAL n As Integer, e1 As Integer, e2 As Integer
|
||||
n = ALEN(m1,2)
|
||||
e1 = AELEMENT(m1,tnSrcRow,1)
|
||||
e2 = AELEMENT(m2,tnDestRow,1)
|
||||
ACOPY(m1, m2, e1, n, e2)
|
||||
ENDPROC
|
||||
Loading…
Add table
Add a link
Reference in a new issue