Cyklický redundantní součet: Porovnání verzí

Smazaný obsah Přidaný obsah
mBez shrnutí editace
Řádek 51:
Před vlastním výpočtem je <math>M(x)</math> doplněn zprava osmi nulovými bity. Výpočet zbytku po dělení polynomu <math>M(x) \cdot x^8</math> polynomem <math>G(x)</math> bude připomínat ruční dělení víceciferných čísel se dvěma zjednodušeními:
* počítá se pouze se symboly 0 a 1, navíc v tělese <math>GF(2^n)</math> (takže např. 1 + 1 = 0; 0 − 1 = 1),
* nezajímanezajímá nás podíl, ale pouze zbytek po dělení.
 
{| border=1 align=center
Řádek 181:
R = 0 '''1 0 1 0 0 0 1 0''' // remainderPolynomial := remainderPolynomial * x + bitString[16]
 
První vadou výše uvedené ukázky je potřeba mít v paměti ''n''+1 bitů pro <tt>remainderPolynomial</tt>, druhou vadou je potřeba doplňovat ''n'' nulových bitů vpravo za <tt>bitString</tt>. První problém lze snadno vyřešit vhodným přehozením operací (např. <tt>rem = (msb(rem)) ? ((rem<<1 + bit) xor gen) : (rem<<1 + bit);</tt>). Druhý problém lze vyřešítvyřešit úpravou posledních ''n'' [[iterace|iterací]], ale existuje i vtipnější optimalizace použitá jak v hardwarových i softwarových implementacích.
 
Protože operace XOR použitá pro odečítání generujícího polynomu od zprávy je asociativní a komutativní, nezáleží na pořadí operandů při výpočtu <tt>remainderPolynomial</tt>. A navíc bit z pole <tt>bitString</tt> stačí přidat až na poslední chvíli před testováním, zda provést <tt>xor</tt>. V následující ukázce také není potřeba předvyplňovat <tt>remainderPolynomial</tt> prvními ''n'' bity.