Я пытаюсь реализовать алгоритм Howellize матрицы, как описано на странице 5 этого документа (ссылка на документы Google) (ссылка на pdf) .
Мне кажется, большая часть этого достаточно очевидна, но я не уверен насчет строки 16, означает ли >>
правильный сдвиг? Если это так, то как это вообще работает? Конечно, это будет означать, что биты отрубаются? Насколько я знаю, на данный момент нет гарантии, что число, на которое оно сдвигается, сдвигается на величину, которая сохраняет информацию.
И если это не означает правильный сдвиг, что означает ?
Если кто-то может сэкономить время, я также хотел бы иметь контрольный пример (я не верю, что смогу его создать, я недостаточно хорошо его понимаю).
Я реализовал это так, это правильно? (У меня нет контрольного примера, так как я могу узнать?)
int j = 0;
for (int i = 0; i < 2 * k + 1; i++)
{
var R = (from row in rows
where leading_index(row) == i
orderby rank(row[i]) ascending
select row).ToList();
if (R.Count > 0)
{
uint[] r = R[0];
int p = rank(r[i]); // rank counts the trailing zeroes
uint u = r[i] >> p;
invert(r, u); // multiplies each element of r by the
// multiplicative inverse of u
for (int s = 1; s < R.Count; s++)
{
int t = rank(R[s][i]);
uint v = R[s][i] >> t;
if (subtract(R[s], r, v << (t - p)) == 0)
// subtracts (v<<(t-p)) * r from R[s],
// removes if all elements are zero
rows.Remove(R[s]);
}
swap(rows, rows.IndexOf(r), j);
for (int h = 0; h < j - 1; h++)
{
uint d = rows[h][i] >> p;
subtract(rows[h], r, d);
}
if (r[i] != 1)
// shifted returns r left-shifted by 32-p
rows.Add(shifted(r, 32 - p));
j++;
}
}