123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- include "primitives.alh"
- include "random.alh"
- Float function v2f(i : Element):
- return cast_s2f(cast_v2s(i))!
- Void function dict_overwrite(d : Element, key : Element, value : Element):
- if (dict_in(d, key)):
- dict_delete(d, key)
- if (dict_in_node(d, key)):
- dict_delete_node(d, key)
- dict_add(d, key, value)
- return !
- Element function create_random_matrix(n : Integer):
- Element m
- Integer i
- Integer j
- Element t
- // Construct the matrix first, with as many rows as there are variables
- // Number of columns is 1 higher
- i = 0
- m = create_node()
- while (i < n):
- j = 0
- t = create_node()
- while (j < (n + 1)):
- list_append(t, random())
- j = j + 1
- list_append(m, t)
- i = i + 1
- return m!
- Void function eliminateGaussJordan(m : Element):
- Integer i
- Integer j
- Integer f
- Integer g
- Boolean searching
- Element t
- Float divisor
- i = 0
- j = 0
- while (i < read_nr_out(m)):
- // Make sure pivot m[i][j] != 0, swapping if necessary
- while (v2f(m[i][j]) == 0.0):
- // Is zero, so find row which is not zero
- f = i + 1
- searching = True
- while (searching):
- if (f >= read_nr_out(m)):
- // No longer any rows left, so just increase column counter
- searching = False
- j = j + 1
- else:
- if (v2f(m[f][j]) == 0.0):
- // Also zero, so continue
- f = f + 1
- else:
- // Found non-zero, so swap row
- t = v2f(m[f])
- dict_overwrite(m, f, v2f(m[i]))
- dict_overwrite(m, i, t)
- searching = False
- // If we have increased j, we will just start the loop again (possibly), as m[i][j] might be zero again
- // Pivot in m[i][j] guaranteed to not be 0
- // Now divide complete row by value of m[i][j] to make it equal 1
- f = j
- divisor = v2f(m[i][j])
- while (f < read_nr_out(m[i])):
- dict_overwrite(m[i], f, float_division(v2f(m[i][f]), divisor))
- f = f + 1
- // Eliminate all rows in the j-th column, except the i-th row
- f = 0
- while (f < read_nr_out(m)):
- if (bool_not(f == i)):
- g = j
- divisor = v2f(m[f][j])
- while (g < read_nr_out(m[f])):
- dict_overwrite(m[f], g, v2f(m[f][g]) - (divisor * v2f(m[i][g])))
- g = g + 1
- f = f + 1
- // Increase row and column
- i = i + 1
- j = j + 1
- return !
|