⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gf2n_8cpp-source.html

📁 Crypto++是一个非常强大的密码学库,主要是功能全
💻 HTML
📖 第 1 页 / 共 5 页
字号:
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&lt;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>&amp; PolynomialMod2::operator=(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a>&amp; 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>&amp; PolynomialMod2::operator^=(<span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a>&amp; 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> &amp;b)<span class="keyword"> const</span>00219 <span class="keyword"></span>{00220         <span class="keywordflow">if</span> (b.reg.size() &gt;= 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> &amp;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> &amp;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&gt;=0; i--)00248         {00249                 result &lt;&lt;= 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&lt;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&lt;WORD_BITS; j+=8)00267                         result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>[2*i] |= map[(reg[i] &gt;&gt; (j/2)) % 16] &lt;&lt; j;00268 00269                 <span class="keywordflow">for</span> (j=0; j&lt;WORD_BITS; j+=8)00270                         result.<a class="code" href="class_polynomial_mod2.html#_polynomial_mod2r0">reg</a>[2*i+1] |= map[(reg[i] &gt;&gt; (j/2 + WORD_BITS/2)) % 16] &lt;&lt; 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> &amp;remainder, <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &amp;quotient,00277                                    <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &amp;dividend, <span class="keyword">const</span> <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> &amp;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>() &gt;= 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&gt;=0; i--)00290         {00291                 remainder &lt;&lt;= 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> &amp;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> &amp;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>&amp; PolynomialMod2::operator&lt;&lt;=(<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 &lt;&lt; 1) | carry;00332                         carry = u &gt;&gt; (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 + -