Saya mencoba mengimplementasikan perkalian dan pembagian di GF(2^8) menggunakan tabel log dan eksponensial. Saya menggunakan eksponen 3 sebagai generator saya, menggunakan instruksi dari di sini.
Namun saya gagal dalam beberapa uji kasus sepele.
contoh:
//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));
Empat baris pertama lolos, namun gagal pada baris ke-5 dan ke-6.
Setelah diselidiki lebih lanjut saya menemukan bahwa kesalahan ini terjadi ketika ada 'wrap over', yaitu log3(a) + log3(b) > 255
(kasus perkalian) atau log3(a) - log3(b) < 0
. Namun nilainya diubah sedemikian rupa sehingga tetap di 0~255 menggunakan modulus sebenarnya.
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;
}
operator /
diimplementasikan menggunakan override /=
di atas sehingga tidak ada hal istimewa yang terjadi di sana.
Saya telah memeriksa apakah tabel log/exp yang dihasilkan sudah benar.
Apa yang kulewatkan di sini? Terima kasih!
/=
pada ketentuan LHS dan RHS dan mengembalikan hasilnya jadi tidak ada yang mewah di sana. mengedit jawaban saya. - person Jacob Wang   schedule 25.08.2013