Я пытаюсь реализовать умножение и деление в GF (2 ^ 8), используя логарифмические и экспоненциальные таблицы. Я использую показатель степени 3 в качестве генератора, следуя инструкциям здесь< /а>.
Однако я терплю неудачу в некоторых тривиальных тестовых примерах.
пример:
//passes
assert((GF256elm(4) / GF256elm(1)) == GF256elm(4));
assert((GF256elm(32) / GF256elm(16)) == GF256elm(2));
assert((GF256elm(15) / GF256elm(5)) == GF256elm(3));
assert((GF256elm(88) / GF256elm(8)) == GF256elm(11));
//fails, but should pass
assert((GF256elm(77) / GF256elm(11)) == GF256elm(7));
assert((GF256elm(77) / GF256elm(7)) == GF256elm(11));
Первые четыре строки проходят успешно, однако в 5-й и 6-й строках происходит сбой.
После дальнейшего изучения я обнаружил, что эти ошибки возникают при «переходе», т.е. log3(a) + log3(b) > 255
(случай умножения) или log3(a) - log3(b) < 0
. Однако значение модифицируется таким образом, что они остаются в пределах 0~255 с использованием истинного модуля.
GF256elm& GF256elm::operator/=(const GF256elm& other) { //C++ operator override for division
int t = _logTable[val] - _logTable[other.val]; //log3(a) - log3(b)
int temp = ((t % 255) + 255) % 255; //this wraps the value to between 0~254 inclusive.
val = _expTable[temp];
return *this;
}
оператор /
реализован с использованием вышеописанного переопределения /=
, поэтому здесь ничего особенного не происходит.
Я проверил правильность сгенерированных таблиц log/exp.
Что мне здесь не хватает? Спасибо!
/=
в терминах LHS и RHS и возвращает результат, так что ничего особенного. отредактировал мой ответ. - person Jacob Wang   schedule 25.08.2013