randomness
Version:
Randomness tests
94 lines • 2.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.computeRank = exports.bitsToMatrix = void 0;
const MATRIX_FORWARD_ELIMINATION = 0;
const MATRIX_BACKWARD_ELIMINATION = 1;
const bitsToMatrix = (M, Q, bits) => {
const matrix = [];
for (let rowIndex = 0; rowIndex < Q; rowIndex++) {
const row = bits.slice(rowIndex * M, (rowIndex + 1) * M);
matrix.push(row);
}
return matrix;
};
exports.bitsToMatrix = bitsToMatrix;
const computeRank = (M, Q, matrix) => {
const m = Math.min(M, Q);
for (let i = 0; i < m - 1; i++) {
if (matrix[i][i] == 1)
perform_elementary_row_operations(MATRIX_FORWARD_ELIMINATION, i, M, Q, matrix);
else {
if (find_unit_element_and_swap(MATRIX_FORWARD_ELIMINATION, i, M, Q, matrix) == 1)
perform_elementary_row_operations(MATRIX_FORWARD_ELIMINATION, i, M, Q, matrix);
}
}
for (let i = m - 1; i > 0; i--) {
if (matrix[i][i] == 1)
perform_elementary_row_operations(MATRIX_BACKWARD_ELIMINATION, i, M, Q, matrix);
else {
if (find_unit_element_and_swap(MATRIX_BACKWARD_ELIMINATION, i, M, Q, matrix) == 1)
perform_elementary_row_operations(MATRIX_BACKWARD_ELIMINATION, i, M, Q, matrix);
}
}
return determine_rank(m, M, Q, matrix);
};
exports.computeRank = computeRank;
const perform_elementary_row_operations = (flag, i, M, Q, A) => {
let k;
if (flag == MATRIX_FORWARD_ELIMINATION) {
for (let j = i + 1; j < M; j++)
if (A[j][i] == 1)
for (k = i; k < Q; k++)
A[j][k] = (A[j][k] + A[i][k]) % 2;
}
else {
for (let j = i - 1; j >= 0; j--)
if (A[j][i] == 1)
for (k = 0; k < Q; k++)
A[j][k] = (A[j][k] + A[i][k]) % 2;
}
};
const find_unit_element_and_swap = (flag, i, M, Q, A) => {
let index;
if (flag == MATRIX_FORWARD_ELIMINATION) {
index = i + 1;
while (index < M && A[index][i] == 0)
index++;
if (index < M)
return swap_rows(i, index, Q, A);
}
else {
index = i - 1;
while (index >= 0 && A[index][i] == 0)
index--;
if (index >= 0)
return swap_rows(i, index, Q, A);
}
return 0;
};
const swap_rows = (i, index, Q, A) => {
let temp;
for (let p = 0; p < Q; p++) {
temp = A[i][p];
A[i][p] = A[index][p];
A[index][p] = temp;
}
return 1;
};
const determine_rank = (m, M, Q, A) => {
let rank = m;
let allZeroes;
for (let i = 0; i < M; i++) {
allZeroes = 1;
for (let j = 0; j < Q; j++) {
if (A[i][j] == 1) {
allZeroes = 0;
break;
}
}
if (allZeroes == 1)
rank--;
}
return rank;
};
//# sourceMappingURL=matrix.js.map