ประการแรก รหัสของคุณเกือบจะถูกต้องสำหรับการคูณ $GF(2^{32})$ โดยมีเงื่อนไขว่า $p$ แสดงถึงค่าสัมประสิทธิ์บิตสำหรับ monomials $x^{31},x^{30},\ldots,x^2,x,1$ ในระดับ 32 พหุนามลดไม่ได้ มีปัญหาเสารั้วว่า $i$ ควรวิ่งจาก 31 ลงไปที่ 0
ตอนนี้ mod การคูณพกพา $2^k$ ไม่สอดคล้องกับการคูณในเขตข้อมูล แต่แทนที่จะเป็นวงแหวน $\mathbb Z[x]/x^k\mathbb Z[x]$. นี่ไม่ใช่วัตถุทางคณิตศาสตร์ที่ดีที่จะทำการเข้ารหัสด้วย ตัวอย่างเช่น บิตต่ำของเอาต์พุตเป็นเพียงฟังก์ชันของบิตต่ำของอินพุตเท่านั้น โดยการเปรียบเทียบคูณด้วย $GF(2^k)$ บิตเอาต์พุตทั้งหมดเป็นฟังก์ชันของบิตอินพุตทั้งหมด คุณสมบัติอีกอย่างของการคูณฟิลด์คือมันกลับด้านได้สำหรับอินพุตที่ไม่ใช่ศูนย์ แต่ในวงแหวนของเรา ฟังก์ชันนี้ไม่สามารถกลับด้านได้สำหรับอินพุตที่ไม่มีการตั้งค่าบิตต่ำ
หากเราพิจารณาคู่ของอินพุตทั้งหมด เอาต์พุตจะไม่ถูกกระจายอย่างสม่ำเสมอ ตัวอย่างเช่น อินพุตเพียง 25% เท่านั้นที่จะสร้างเอาต์พุตด้วยชุดบิตต่ำ หากเราแก้ไขอินพุตตัวใดตัวหนึ่งและตรวจสอบให้แน่ใจว่าตั้งค่าบิตต่ำแล้ว เอาต์พุตจะถูกกระจายอย่างสม่ำเสมอ แต่เอาต์พุตบิตต่ำจะขึ้นอยู่กับอินพุตบิตต่ำเท่านั้น ในระยะสั้นไม่ใช่ทางเลือกที่ดี
ในแง่ของคำถามก่อนหน้านี้ อาจมีการเพิ่มความเร็วบางอย่างที่เป็นไปได้ หากคุณคำนวณรหัสล่วงหน้าสำหรับ $ค$ รับค่า 1<<32, 1<<33,..., 1<<63 และเก็บค่าเหล่านี้เป็น $x[0],\ldots,x[31]$ จากนั้นรหัสจะถูกแทนที่ด้วย
สำหรับ (int i = 31; i-- >= 0; )
{
ถ้า (c & (1L << (i + 32)))
ค ^= x[i];
}
ค %= 1<<32;
หากคุณต้องการบางสิ่งที่เร็วกว่า คุณอาจต้องการดูวิธีอื่นในการแสดงฟิลด์ เช่น ฐานปกติที่เหมาะสมที่สุด หรือ ลอการิทึม Zech