📄 gf2n_8cpp-source.html
字号:
<a name="l00194"></a>00194 <span class="keyword"></span>{<a name="l00195"></a>00195 <span class="keywordtype">unsigned</span> wordCount = <a class="code" href="class_polynomial_mod2.html#88292d16af59aaed460503b6339145b3" title="number of significant words = ceiling(ByteCount()/sizeof(word))">WordCount</a>();<a name="l00196"></a>00196 <span class="keywordflow">if</span> (wordCount)<a name="l00197"></a>00197 <span class="keywordflow">return</span> (wordCount-1)*WORD_BITS + BitPrecision(reg[wordCount-1]);<a name="l00198"></a>00198 <span class="keywordflow">else</span><a name="l00199"></a>00199 <span class="keywordflow">return</span> 0;<a name="l00200"></a>00200 }<a name="l00201"></a>00201 <a name="l00202"></a><a class="code" href="class_polynomial_mod2.html#c2821c87852466235b4e1a2f4cc01334">00202</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_polynomial_mod2.html#c2821c87852466235b4e1a2f4cc01334" title="sum modulo 2 of all coefficients">PolynomialMod2::Parity</a>()<span class="keyword"> const</span><a name="l00203"></a>00203 <span class="keyword"></span>{<a name="l00204"></a>00204 <span class="keywordtype">unsigned</span> i;<a name="l00205"></a>00205 word temp=0;<a name="l00206"></a>00206 <span class="keywordflow">for</span> (i=0; i<reg.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>(); i++)<a name="l00207"></a>00207 temp ^= reg[i];<a name="l00208"></a>00208 <span class="keywordflow">return</span> CryptoPP::Parity(temp);<a name="l00209"></a>00209 }<a name="l00210"></a>00210 <a name="l00211"></a><a class="code" href="class_polynomial_mod2.html#cb7a27cfd427af99b60e67503db0b6d6">00211</a> <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a>& <a class="code" href="class_polynomial_mod2.html#cb7a27cfd427af99b60e67503db0b6d6">PolynomialMod2::operator=</a>(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a>& t)<a name="l00212"></a>00212 {<a name="l00213"></a>00213 reg.<a class="code" href="class_sec_block.html#2cf5dc5e31c63eb927f935af6104f36a" title="set contents and size">Assign</a>(t.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>);<a name="l00214"></a>00214 <span class="keywordflow">return</span> *<span class="keyword">this</span>;<a name="l00215"></a>00215 }<a name="l00216"></a>00216 <a name="l00217"></a><a class="code" href="class_polynomial_mod2.html#46d95294f13b9b537868389d741b41a8">00217</a> <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a>& <a class="code" href="class_polynomial_mod2.html#46d95294f13b9b537868389d741b41a8">PolynomialMod2::operator^=</a>(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a>& t)<a name="l00218"></a>00218 {<a name="l00219"></a>00219 reg.<a class="code" href="class_sec_block.html#4ef9516e973051e6afa38bba526da3e9" title="change size only if newSize > current size. contents are preserved and additional...">CleanGrow</a>(t.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>());<a name="l00220"></a>00220 XorWords(reg, t.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>, t.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>());<a name="l00221"></a>00221 <span class="keywordflow">return</span> *<span class="keyword">this</span>;<a name="l00222"></a>00222 }<a name="l00223"></a>00223 <a name="l00224"></a><a class="code" href="class_polynomial_mod2.html#c39e5aa475ea75149c09aeace922734d">00224</a> <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> <a class="code" href="class_polynomial_mod2.html#c39e5aa475ea75149c09aeace922734d">PolynomialMod2::Xor</a>(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> &b)<span class="keyword"> const</span><a name="l00225"></a>00225 <span class="keyword"></span>{<a name="l00226"></a>00226 <span class="keywordflow">if</span> (b.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>() >= reg.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>())<a name="l00227"></a>00227 {<a name="l00228"></a>00228 <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> result((word)0, b.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>()*WORD_BITS);<a name="l00229"></a>00229 XorWords(result.reg, reg, b.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>, reg.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>());<a name="l00230"></a>00230 CopyWords(result.reg+reg.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>(), b.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>+reg.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>(), b.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>()-reg.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>());<a name="l00231"></a>00231 <span class="keywordflow">return</span> result;<a name="l00232"></a>00232 }<a name="l00233"></a>00233 <span class="keywordflow">else</span><a name="l00234"></a>00234 {<a name="l00235"></a>00235 <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> result((word)0, reg.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>()*WORD_BITS);<a name="l00236"></a>00236 XorWords(result.reg, reg, b.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>, b.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>());<a name="l00237"></a>00237 CopyWords(result.reg+b.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>(), reg+b.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>(), reg.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>()-b.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>());<a name="l00238"></a>00238 <span class="keywordflow">return</span> result;<a name="l00239"></a>00239 }<a name="l00240"></a>00240 }<a name="l00241"></a>00241 <a name="l00242"></a><a class="code" href="class_polynomial_mod2.html#99e2b908f82147116bfe631ef84755b5">00242</a> <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> <a class="code" href="class_polynomial_mod2.html#99e2b908f82147116bfe631ef84755b5">PolynomialMod2::And</a>(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> &b)<span class="keyword"> const</span><a name="l00243"></a>00243 <span class="keyword"></span>{<a name="l00244"></a>00244 <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> result((word)0, WORD_BITS*STDMIN(reg.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>(), b.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>()));<a name="l00245"></a>00245 AndWords(result.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>, reg, b.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>, result.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>());<a name="l00246"></a>00246 <span class="keywordflow">return</span> result;<a name="l00247"></a>00247 }<a name="l00248"></a>00248 <a name="l00249"></a><a class="code" href="class_polynomial_mod2.html#9eb57375ba2c0b403a76008195c50299">00249</a> <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> <a class="code" href="class_polynomial_mod2.html#9eb57375ba2c0b403a76008195c50299">PolynomialMod2::Times</a>(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> &b)<span class="keyword"> const</span><a name="l00250"></a>00250 <span class="keyword"></span>{<a name="l00251"></a>00251 <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> result((word)0, <a class="code" href="class_polynomial_mod2.html#86f4e8502eacf95345d18a6240a217b2" title="number of significant bits = Degree() + 1">BitCount</a>() + b.<a class="code" href="class_polynomial_mod2.html#86f4e8502eacf95345d18a6240a217b2" title="number of significant bits = Degree() + 1">BitCount</a>());<a name="l00252"></a>00252 <a name="l00253"></a>00253 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=b.<a class="code" href="class_polynomial_mod2.html#2d0e58a23b81b33ab3ccf9b7aa498603" title="the zero polynomial will return a degree of -1">Degree</a>(); i>=0; i--)<a name="l00254"></a>00254 {<a name="l00255"></a>00255 result <<= 1;<a name="l00256"></a>00256 <span class="keywordflow">if</span> (b[i])<a name="l00257"></a>00257 XorWords(result.reg, reg, reg.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>());<a name="l00258"></a>00258 }<a name="l00259"></a>00259 <span class="keywordflow">return</span> result;<a name="l00260"></a>00260 }<a name="l00261"></a>00261 <a name="l00262"></a><a class="code" href="class_polynomial_mod2.html#ebb432d1ab5e16d056165e316254b258">00262</a> <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> <a class="code" href="class_polynomial_mod2.html#ebb432d1ab5e16d056165e316254b258">PolynomialMod2::Squared</a>()<span class="keyword"> const</span><a name="l00263"></a>00263 <span class="keyword"></span>{<a name="l00264"></a>00264 <span class="keyword">static</span> <span class="keyword">const</span> word map[16] = {0, 1, 4, 5, 16, 17, 20, 21, 64, 65, 68, 69, 80, 81, 84, 85};<a name="l00265"></a>00265 <a name="l00266"></a>00266 <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> result((word)0, 2*reg.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>()*WORD_BITS);<a name="l00267"></a>00267 <a name="l00268"></a>00268 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i=0; i<reg.<a class="code" href="class_sec_block.html#f5999bffe3193e62719cc0792b0282a7">size</a>(); i++)<a name="l00269"></a>00269 {<a name="l00270"></a>00270 <span class="keywordtype">unsigned</span> j;<a name="l00271"></a>00271 <a name="l00272"></a>00272 <span class="keywordflow">for</span> (j=0; j<WORD_BITS; j+=8)<a name="l00273"></a>00273 result.reg[2*i] |= map[(reg[i] >> (j/2)) % 16] << j;<a name="l00274"></a>00274 <a name="l00275"></a>00275 for (j=0; j<WORD_BITS; j+=8)<a name="l00276"></a>00276 result.reg[2*i+1] |= map[(reg[i] >> (j/2 + WORD_BITS/2)) % 16] << j;<a name="l00277"></a>00277 }<a name="l00278"></a>00278 <a name="l00279"></a>00279 <span class="keywordflow">return</span> result;<a name="l00280"></a>00280 }<a name="l00281"></a>00281 <a name="l00282"></a><a class="code" href="class_polynomial_mod2.html#73d92da2ee829619041eca82567b87bc">00282</a> <span class="keywordtype">void</span> <a class="code" href="class_polynomial_mod2.html#73d92da2ee829619041eca82567b87bc" title="calculate r and q such that (a == d*q + r) && (deg(r) < deg(d))">PolynomialMod2::Divide</a>(<a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> &remainder, <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> &quotient,<a name="l00283"></a>00283 <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> &dividend, <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html" title="Polynomial with Coefficients in GF(2).">PolynomialMod2</a> &divisor)<a name="l00284"></a>00284 {<a name="l00285"></a>00285 <span class="keywordflow">if</span> (!divisor)<a name="l00286"></a>00286 <span class="keywordflow">throw</span> <a class="code" href="class_polynomial_mod2_1_1_divide_by_zero.html" title="divide by zero exception">PolynomialMod2::DivideByZero</a>();<a name="l00287"></a>00287 <a name="l00288"></a>00288 <span class="keywordtype">int</span> degree = divisor.<a class="code" href="class_polynomial_mod2.html#2d0e58a23b81b33ab3ccf9b7aa498603" title="the zero polynomial will return a degree of -1">Degree</a>();<a name="l00289"></a>00289 remainder.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>.<a class="code" href="class_sec_block.html#2d78e75002fd02e5b89bd72a9e65e769" title="change size and set contents to 0">CleanNew</a>(BitsToWords(degree+1));<a name="l00290"></a>00290 <span class="keywordflow">if</span> (dividend.<a class="code" href="class_polynomial_mod2.html#86f4e8502eacf95345d18a6240a217b2" title="number of significant bits = Degree() + 1">BitCount</a>() >= divisor.<a class="code" href="class_polynomial_mod2.html#86f4e8502eacf95345d18a6240a217b2" title="number of significant bits = Degree() + 1">BitCount</a>())<a name="l00291"></a>00291 quotient.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>.<a class="code" href="class_sec_block.html#2d78e75002fd02e5b89bd72a9e65e769" title="change size and set contents to 0">CleanNew</a>(BitsToWords(dividend.<a class="code" href="class_polynomial_mod2.html#86f4e8502eacf95345d18a6240a217b2" title="number of significant bits = Degree() + 1">BitCount</a>() - divisor.<a class="code" href="class_polynomial_mod2.html#86f4e8502eacf95345d18a6240a217b2" title="number of significant bits = Degree() + 1">BitCount</a>() + 1));<a name="l00292"></a>00292 <span class="keywordflow">else</span><a name="l00293"></a>00293 quotient.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>.<a class="code" href="class_sec_block.html#2d78e75002fd02e5b89bd72a9e65e769" title="change size and set contents to 0">CleanNew</a>(0);<a name="l00294"></a>00294 <a name="l00295"></a>00295 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=dividend.<a class="code" href="class_polynomial_mod2.html#2d0e58a23b81b33ab3ccf9b7aa498603" title="the zero polynomial will return a degree of -1">Degree</a>(); i>=0; i--)<a name="l00296"></a>00296 {<a name="l00297"></a>00297 remainder <<= 1;<a name="l00298"></a>00298 remainder.<a class="code" href="class_polynomial_mod2.html#68853b1b5d6d0361cd0b16f1889466a4">reg</a>[0] |= dividend[i];<a name="l00299"></a>00299 <span class="keywordflow">if</span> (remainder[degree])<a name="l00300"></a>00300 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -