📄 gf2n_8cpp-source.html
字号:
00169 Decode(dec, length);00170 dec.<a class="code" href="class_b_e_r_general_decoder.html#_b_e_r_set_decodera9">MessageEnd</a>();00171 }00172 <a name="l00173"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_2">00173</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_2">PolynomialMod2::WordCount</a>()<span class="keyword"> const</span>00174 <span class="keyword"></span>{00175 <span class="keywordflow">return</span> CountWords(reg, reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00176 }00177 <a name="l00178"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_1">00178</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_1">PolynomialMod2::ByteCount</a>()<span class="keyword"> const</span>00179 <span class="keyword"></span>{00180 <span class="keywordtype">unsigned</span> wordCount = <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_2">WordCount</a>();00181 <span class="keywordflow">if</span> (wordCount)00182 <span class="keywordflow">return</span> (wordCount-1)*WORD_SIZE + BytePrecision(reg[wordCount-1]);00183 <span class="keywordflow">else</span>00184 <span class="keywordflow">return</span> 0;00185 }00186 <a name="l00187"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_0">00187</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_0">PolynomialMod2::BitCount</a>()<span class="keyword"> const</span>00188 <span class="keyword"></span>{00189 <span class="keywordtype">unsigned</span> wordCount = <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_2">WordCount</a>();00190 <span class="keywordflow">if</span> (wordCount)00191 <span class="keywordflow">return</span> (wordCount-1)*WORD_BITS + BitPrecision(reg[wordCount-1]);00192 <span class="keywordflow">else</span>00193 <span class="keywordflow">return</span> 0;00194 }00195 <a name="l00196"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z31_0">00196</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z31_0">PolynomialMod2::Parity</a>()<span class="keyword"> const</span>00197 <span class="keyword"></span>{00198 <span class="keywordtype">unsigned</span> i;00199 word temp=0;00200 <span class="keywordflow">for</span> (i=0; i<reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>(); i++)00201 temp ^= reg[i];00202 <span class="keywordflow">return</span> CryptoPP::Parity(temp);00203 }00204 00205 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a>& PolynomialMod2::operator=(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a>& t)00206 {00207 reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta15">Assign</a>(t.reg);00208 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00209 }00210 00211 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a>& PolynomialMod2::operator^=(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a>& t)00212 {00213 reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta22">CleanGrow</a>(t.reg.size());00214 XorWords(reg, t.reg, t.reg.size());00215 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00216 }00217 00218 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> PolynomialMod2::Xor(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &b)<span class="keyword"> const</span>00219 <span class="keyword"></span>{00220 <span class="keywordflow">if</span> (b.reg.size() >= reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>())00221 {00222 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> result((word)0, b.reg.size()*WORD_BITS);00223 XorWords(result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>, reg, b.reg, reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00224 CopyWords(result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>+reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>(), b.reg+reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>(), b.reg.size()-reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00225 <span class="keywordflow">return</span> result;00226 }00227 <span class="keywordflow">else</span>00228 {00229 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> result((word)0, reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>()*WORD_BITS);00230 XorWords(result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>, reg, b.reg, b.reg.size());00231 CopyWords(result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>+b.reg.size(), reg+b.reg.size(), reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>()-b.reg.size());00232 <span class="keywordflow">return</span> result;00233 }00234 }00235 00236 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> PolynomialMod2::And(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &b)<span class="keyword"> const</span>00237 <span class="keyword"></span>{00238 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> result((word)0, WORD_BITS*STDMIN(reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>(), b.reg.size()));00239 AndWords(result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>, reg, b.reg, result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00240 <span class="keywordflow">return</span> result;00241 }00242 00243 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> PolynomialMod2::Times(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &b)<span class="keyword"> const</span>00244 <span class="keyword"></span>{00245 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> result((word)0, <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_0">BitCount</a>() + b.BitCount());00246 00247 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=b.Degree(); i>=0; i--)00248 {00249 result <<= 1;00250 <span class="keywordflow">if</span> (b[i])00251 XorWords(result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>, reg, reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>());00252 }00253 <span class="keywordflow">return</span> result;00254 }00255 00256 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> PolynomialMod2::Squared()<span class="keyword"> const</span>00257 <span class="keyword"></span>{00258 <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};00259 00260 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> result((word)0, 2*reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>()*WORD_BITS);00261 00262 <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> i=0; i<reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>(); i++)00263 {00264 <span class="keywordtype">unsigned</span> j;00265 00266 <span class="keywordflow">for</span> (j=0; j<WORD_BITS; j+=8)00267 result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>[2*i] |= map[(reg[i] >> (j/2)) % 16] << j;00268 00269 <span class="keywordflow">for</span> (j=0; j<WORD_BITS; j+=8)00270 result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>[2*i+1] |= map[(reg[i] >> (j/2 + WORD_BITS/2)) % 16] << j;00271 }00272 00273 <span class="keywordflow">return</span> result;00274 }00275 <a name="l00276"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z31_8">00276</a> <span class="keywordtype">void</span> <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z31_8">PolynomialMod2::Divide</a>(<a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &remainder, <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &quotient,00277 <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &dividend, <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &divisor)00278 {00279 <span class="keywordflow">if</span> (!divisor)00280 <span class="keywordflow">throw</span> <a class="code" href="class_polynomial_mod2_1_1_divide_by_zero.html">PolynomialMod2::DivideByZero</a>();00281 00282 <span class="keywordtype">int</span> degree = divisor.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_5">Degree</a>();00283 remainder.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>.<a class="code" href="class_sec_block.html#_sec_block_with_hinta20">CleanNew</a>(BitsToWords(degree+1));00284 <span class="keywordflow">if</span> (dividend.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_0">BitCount</a>() >= divisor.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_0">BitCount</a>())00285 quotient.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>.<a class="code" href="class_sec_block.html#_sec_block_with_hinta20">CleanNew</a>(BitsToWords(dividend.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_0">BitCount</a>() - divisor.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_0">BitCount</a>() + 1));00286 <span class="keywordflow">else</span>00287 quotient.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>.<a class="code" href="class_sec_block.html#_sec_block_with_hinta20">CleanNew</a>(0);00288 00289 <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i=dividend.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_5">Degree</a>(); i>=0; i--)00290 {00291 remainder <<= 1;00292 remainder.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>[0] |= dividend[i];00293 <span class="keywordflow">if</span> (remainder[degree])00294 {00295 remainder -= divisor;00296 quotient.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z25_11">SetBit</a>(i);00297 }00298 }00299 }00300 00301 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> PolynomialMod2::DividedBy(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &b)<span class="keyword"> const</span>00302 <span class="keyword"></span>{00303 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> remainder, quotient;00304 <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z31_8">PolynomialMod2::Divide</a>(remainder, quotient, *<span class="keyword">this</span>, b);00305 <span class="keywordflow">return</span> quotient;00306 }00307 00308 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> PolynomialMod2::Modulo(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &b)<span class="keyword"> const</span>00309 <span class="keyword"></span>{00310 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> remainder, quotient;00311 <a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z31_8">PolynomialMod2::Divide</a>(remainder, quotient, *<span class="keyword">this</span>, b);00312 <span class="keywordflow">return</span> remainder;00313 }00314 00315 <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a>& PolynomialMod2::operator<<=(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n)00316 {00317 <span class="keywordflow">if</span> (!reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>())00318 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00319 00320 <span class="keywordtype">int</span> i;00321 word u;00322 word carry=0;00323 word *r=reg;00324 00325 <span class="keywordflow">if</span> (n==1) <span class="comment">// special case code for most frequent case</span>00326 {00327 i = reg.<a class="code" href="class_sec_block.html#_sec_block_with_hinta13">size</a>();00328 <span class="keywordflow">while</span> (i--)00329 {00330 u = *r;00331 *r = (u << 1) | carry;00332 carry = u >> (WORD_BITS-1);00333 r++;00334 }00335 00336 <span class="keywordflow">if</span> (carry)00337 {00338 reg.Grow(reg.size()+1);00339 reg[reg.size()-1] = carry;00340 }00341 00342 <span class="keywordflow">return</span> *<span class="keyword">this</span>;00343 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -