로그와 지수 테이블을 사용하여 GF (2^8)에서 곱셈과 나눗셈을 구현하려고합니다. here의 지침을 사용하여 3의 지수를 제네레이터로 사용하고 있습니다.갈루아 필드 (2^8)의 잘못된 곱셈/나눗셈
그러나 나는 사소한 테스트 케이스에 실패하고 있습니다.
는예 : 첫 번째 4 개 개의 라인이 통과
//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로 유지되는 "modded"입니다.
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 조건에서'/ ='를 사용하고 결과를 반환하므로 아무 것도 거기에없는 것입니다. 내 대답을 편집했습니다. –