ฉันกำลังพยายามใช้การคูณและการหารใน 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
จากการตรวจสอบเพิ่มเติม ฉันพบว่าข้อผิดพลาดเหล่านี้เกิดขึ้นเมื่อมี 'wrap over' เช่น 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;
}
ตัวดำเนินการ /
ถูกนำมาใช้โดยใช้การแทนที่ /=
ด้านบน ดังนั้นจึงไม่มีอะไรพิเศษเกิดขึ้นที่นั่น
ฉันได้ตรวจสอบแล้วว่าตารางบันทึก/exp ที่สร้างขึ้นนั้นถูกต้อง
ฉันพลาดอะไรไปที่นี่? ขอบคุณ!
/=
กับเงื่อนไข LHS และ RHS แล้วส่งคืนผลลัพธ์ดังนั้นจึงไม่มีอะไรพิเศษ แก้ไขคำตอบของฉัน - person Jacob Wang   schedule 25.08.2013