<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>Crypto++: gf2n.h Source File</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.3.7 --> <div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File Members</a></div> <h1>gf2n.h</h1><a href="gf2n_8h.html">Go to the documentation of this file.</a><pre class="fragment"><div>00001 <span class="preprocessor">#ifndef CRYPTOPP_GF2N_H</span> 00002 <span class="preprocessor"></span><span class="preprocessor">#define CRYPTOPP_GF2N_H</span> 00003 <span class="preprocessor"></span><span class="comment"></span> 00004 <span class="comment">/*! \file */</span> 00005 00006 <span class="preprocessor">#include "<a class="code" href="cryptlib_8h.html">cryptlib.h</a>"</span> 00007 <span class="preprocessor">#include "secblock.h"</span> 00008 <span class="preprocessor">#include "misc.h"</span> 00009 <span class="preprocessor">#include "algebra.h"</span> 00010 00011 <span class="preprocessor">#include <iosfwd></span> 00012 00013 NAMESPACE_BEGIN(CryptoPP) 00014 00015 <span class="comment">//! Polynomial with Coefficients in GF(2)</span> 00016 <span class="comment"></span><span class="comment">/*! \nosubgrouping */</span> <a name="l00017"></a><a class="code" href="class_polynomial_mod2.html">00017</a> class CRYPTOPP_DLL <a class="code" href="class_polynomial_mod2.html">PolynomialMod2</a> 00018 { 00019 <span class="keyword">public</span>:<span class="comment"></span> 00020 <span class="comment"> //! \name ENUMS, EXCEPTIONS, and TYPEDEFS</span> 00021 <span class="comment"></span><span class="comment"> //@{</span> 00022 <span class="comment"></span><span class="comment"> //! divide by zero exception</span> <a name="l00023"></a><a class="code" href="class_polynomial_mod2_1_1_divide_by_zero.html">00023</a> <span class="comment"></span> <span class="keyword">class </span><a class="code" href="class_polynomial_mod2_1_1_divide_by_zero.html">DivideByZero</a> : <span class="keyword">public</span> <a class="code" href="class_exception.html">Exception</a> 00024 { 00025 <span class="keyword">public</span>: 00026 <a class="code" href="class_polynomial_mod2_1_1_divide_by_zero.html">DivideByZero</a>() : <a class="code" href="class_exception.html">Exception</a>(OTHER_ERROR, <span class="stringliteral">"PolynomialMod2: division by zero"</span>) {} 00027 }; 00028 00029 <span class="keyword">typedef</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> RandomizationParameter;<span class="comment"></span> 00030 <span class="comment"> //@}</span> 00031 <span class="comment"></span><span class="comment"></span> 00032 <span class="comment"> //! \name CREATORS</span> 00033 <span class="comment"></span><span class="comment"> //@{</span> 00034 <span class="comment"></span><span class="comment"> //! creates the zero polynomial</span> 00035 <span class="comment"></span> PolynomialMod2();<span class="comment"></span> 00036 <span class="comment"> //! copy constructor</span> 00037 <span class="comment"></span> PolynomialMod2(<span class="keyword">const</span> PolynomialMod2& t); 00038 <span class="comment"></span> 00039 <span class="comment"> //! convert from word</span> 00040 <span class="comment"></span><span class="comment"> /*! value should be encoded with the least significant bit as coefficient to x^0</span> 00041 <span class="comment"> and most significant bit as coefficient to x^(WORD_BITS-1)</span> 00042 <span class="comment"> bitLength denotes how much memory to allocate initially</span> 00043 <span class="comment"> */</span> 00044 PolynomialMod2(word value, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitLength=WORD_BITS); 00045 <span class="comment"></span> 00046 <span class="comment"> //! convert from big-endian byte array</span> <a name="l00047"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_3">00047</a> <span class="comment"></span> PolynomialMod2(<span class="keyword">const</span> byte *encodedPoly, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> byteCount) 00048 {Decode(encodedPoly, byteCount);} 00049 <span class="comment"></span> 00050 <span class="comment"> //! convert from big-endian form stored in a BufferedTransformation</span> <a name="l00051"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_4">00051</a> <span class="comment"></span> PolynomialMod2(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &encodedPoly, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> byteCount) 00052 {Decode(encodedPoly, byteCount);} 00053 <span class="comment"></span> 00054 <span class="comment"> //! create a random polynomial uniformly distributed over all polynomials with degree less than bitcount</span> <a name="l00055"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z19_5">00055</a> <span class="comment"></span> PolynomialMod2(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitcount) 00056 {Randomize(rng, bitcount);} 00057 <span class="comment"></span> 00058 <span class="comment"> //! return x^i</span> 00059 <span class="comment"></span> <span class="keyword">static</span> PolynomialMod2 Monomial(<span class="keywordtype">unsigned</span> i);<span class="comment"></span> 00060 <span class="comment"> //! return x^t0 + x^t1 + x^t2</span> 00061 <span class="comment"></span> <span class="keyword">static</span> PolynomialMod2 Trinomial(<span class="keywordtype">unsigned</span> t0, <span class="keywordtype">unsigned</span> t1, <span class="keywordtype">unsigned</span> t2);<span class="comment"></span> 00062 <span class="comment"> //! return x^t0 + x^t1 + x^t2 + x^t3 + x^t4</span> 00063 <span class="comment"></span> <span class="keyword">static</span> PolynomialMod2 Pentanomial(<span class="keywordtype">unsigned</span> t0, <span class="keywordtype">unsigned</span> t1, <span class="keywordtype">unsigned</span> t2, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t3, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t4);<span class="comment"></span> 00064 <span class="comment"> //! return x^(n-1) + ... + x + 1</span> 00065 <span class="comment"></span> <span class="keyword">static</span> PolynomialMod2 AllOnes(<span class="keywordtype">unsigned</span> n); 00066 <span class="comment"></span> 00067 <span class="comment"> //!</span> 00068 <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> PolynomialMod2 &Zero();<span class="comment"></span> 00069 <span class="comment"> //!</span> 00070 <span class="comment"></span> <span class="keyword">static</span> <span class="keyword">const</span> PolynomialMod2 &One();<span class="comment"></span> 00071 <span class="comment"> //@}</span> 00072 <span class="comment"></span><span class="comment"></span> 00073 <span class="comment"> //! \name ENCODE/DECODE</span> 00074 <span class="comment"></span><span class="comment"> //@{</span> 00075 <span class="comment"></span><span class="comment"> //! minimum number of bytes to encode this polynomial</span> 00076 <span class="comment"></span><span class="comment"> /*! MinEncodedSize of 0 is 1 */</span> <a name="l00077"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z21_0">00077</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> MinEncodedSize()<span class="keyword"> const </span>{<span class="keywordflow">return</span> STDMAX(1U, ByteCount());} 00078 <span class="comment"></span> 00079 <span class="comment"> //! encode in big-endian format</span> 00080 <span class="comment"></span><span class="comment"> /*! if outputLen < MinEncodedSize, the most significant bytes will be dropped</span> 00081 <span class="comment"> if outputLen > MinEncodedSize, the most significant bytes will be padded</span> 00082 <span class="comment"> */</span> 00083 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Encode(byte *output, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputLen) <span class="keyword">const</span>;<span class="comment"></span> 00084 <span class="comment"> //!</span> 00085 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Encode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> outputLen) <span class="keyword">const</span>; 00086 <span class="comment"></span> 00087 <span class="comment"> //!</span> 00088 <span class="comment"></span> <span class="keywordtype">void</span> Decode(<span class="keyword">const</span> byte *input, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputLen);<span class="comment"></span> 00089 <span class="comment"> //! </span> 00090 <span class="comment"></span> <span class="comment">//* Precondition: bt.MaxRetrievable() >= inputLen</span> 00091 <span class="keywordtype">void</span> Decode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> inputLen); 00092 <span class="comment"></span> 00093 <span class="comment"> //! encode value as big-endian octet string</span> 00094 <span class="comment"></span> <span class="keywordtype">void</span> DEREncodeAsOctetString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length) <span class="keyword">const</span>;<span class="comment"></span> 00095 <span class="comment"> //! decode value as big-endian octet string</span> 00096 <span class="comment"></span> <span class="keywordtype">void</span> BERDecodeAsOctetString(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length);<span class="comment"></span> 00097 <span class="comment"> //@}</span> 00098 <span class="comment"></span><span class="comment"></span> 00099 <span class="comment"> //! \name ACCESSORS</span> 00100 <span class="comment"></span><span class="comment"> //@{</span> 00101 <span class="comment"></span><span class="comment"> //! number of significant bits = Degree() + 1</span> 00102 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> BitCount() const;<span class="comment"></span> 00103 <span class="comment"> //! number of significant bytes = ceiling(BitCount()/8)</span> 00104 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ByteCount() const;<span class="comment"></span> 00105 <span class="comment"> //! number of significant words = ceiling(ByteCount()/sizeof(word))</span> 00106 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> WordCount() const; 00107 <span class="comment"></span> 00108 <span class="comment"> //! return the n-th bit, n=0 being the least significant bit</span> <a name="l00109"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_3">00109</a> <span class="comment"></span> <span class="keywordtype">bool</span> GetBit(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n)<span class="keyword"> const </span>{<span class="keywordflow">return</span> GetCoefficient(n)!=0;}<span class="comment"></span> 00110 <span class="comment"> //! return the n-th byte</span> 00111 <span class="comment"></span> byte GetByte(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n) <span class="keyword">const</span>; 00112 <span class="comment"></span> 00113 <span class="comment"> //! the zero polynomial will return a degree of -1</span> <a name="l00114"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_5">00114</a> <span class="comment"></span> <span class="keywordtype">signed</span> <span class="keywordtype">int</span> Degree()<span class="keyword"> const </span>{<span class="keywordflow">return</span> BitCount()-1;}<span class="comment"></span> 00115 <span class="comment"> //! degree + 1</span> <a name="l00116"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_6">00116</a> <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> CoefficientCount()<span class="keyword"> const </span>{<span class="keywordflow">return</span> BitCount();}<span class="comment"></span> 00117 <span class="comment"> //! return coefficient for x^i</span> <a name="l00118"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_7">00118</a> <span class="comment"></span> <span class="keywordtype">int</span> GetCoefficient(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i)<span class="keyword"> const</span> 00119 <span class="keyword"> </span>{<span class="keywordflow">return</span> (i/WORD_BITS < reg.size()) ? int(reg[i/WORD_BITS] >> (i % WORD_BITS)) & 1 : 0;}<span class="comment"></span> 00120 <span class="comment"> //! return coefficient for x^i</span> <a name="l00121"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z23_8">00121</a> <span class="comment"></span> <span class="keywordtype">int</span> operator[](<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i)<span class="keyword"> const </span>{<span class="keywordflow">return</span> GetCoefficient(i);} 00122 <span class="comment"></span> 00123 <span class="comment"> //!</span> 00124 <span class="comment"></span> <span class="keywordtype">bool</span> IsZero()<span class="keyword"> const </span>{<span class="keywordflow">return</span> !*<span class="keyword">this</span>;}<span class="comment"></span> 00125 <span class="comment"> //!</span> 00126 <span class="comment"></span> <span class="keywordtype">bool</span> Equals(<span class="keyword">const</span> PolynomialMod2 &rhs) <span class="keyword">const</span>;<span class="comment"></span> 00127 <span class="comment"> //@}</span> 00128 <span class="comment"></span><span class="comment"></span> 00129 <span class="comment"> //! \name MANIPULATORS</span> 00130 <span class="comment"></span><span class="comment"> //@{</span> 00131 <span class="comment"></span><span class="comment"> //!</span> 00132 <span class="comment"></span> PolynomialMod2& operator=(<span class="keyword">const</span> PolynomialMod2& t);<span class="comment"></span> 00133 <span class="comment"> //!</span> 00134 <span class="comment"></span> PolynomialMod2& operator&=(<span class="keyword">const</span> PolynomialMod2& t);<span class="comment"></span> 00135 <span class="comment"> //!</span> 00136 <span class="comment"></span> PolynomialMod2& operator^=(<span class="keyword">const</span> PolynomialMod2& t);<span class="comment"></span> 00137 <span class="comment"> //!</span> 00138 <span class="comment"></span> PolynomialMod2& operator+=(<span class="keyword">const</span> PolynomialMod2& t) {<span class="keywordflow">return</span> *<span class="keyword">this</span> ^= t;}<span class="comment"></span> 00139 <span class="comment"> //!</span> 00140 <span class="comment"></span> PolynomialMod2& operator-=(<span class="keyword">const</span> PolynomialMod2& t) {<span class="keywordflow">return</span> *<span class="keyword">this</span> ^= t;}<span class="comment"></span> 00141 <span class="comment"> //!</span> 00142 <span class="comment"></span> PolynomialMod2& operator*=(<span class="keyword">const</span> PolynomialMod2& t);<span class="comment"></span> 00143 <span class="comment"> //!</span> 00144 <span class="comment"></span> PolynomialMod2& operator/=(<span class="keyword">const</span> PolynomialMod2& t);<span class="comment"></span> 00145 <span class="comment"> //!</span> 00146 <span class="comment"></span> PolynomialMod2& operator%=(<span class="keyword">const</span> PolynomialMod2& t);<span class="comment"></span> 00147 <span class="comment"> //!</span> 00148 <span class="comment"></span> PolynomialMod2& operator<<=(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>);<span class="comment"></span> 00149 <span class="comment"> //!</span> 00150 <span class="comment"></span> PolynomialMod2& operator>>=(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>); 00151 <span class="comment"></span> 00152 <span class="comment"> //!</span> 00153 <span class="comment"></span> <span class="keywordtype">void</span> Randomize(<a class="code" href="class_random_number_generator.html">RandomNumberGenerator</a> &rng, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> bitcount); 00154 <span class="comment"></span> 00155 <span class="comment"> //!</span> 00156 <span class="comment"></span> <span class="keywordtype">void</span> SetBit(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i, <span class="keywordtype">int</span> value = 1);<span class="comment"></span> 00157 <span class="comment"> //! set the n-th byte to value</span> 00158 <span class="comment"></span> <span class="keywordtype">void</span> SetByte(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n, byte value); 00159 <span class="comment"></span> 00160 <span class="comment"> //!</span> 00161 <span class="comment"></span> <span class="keywordtype">void</span> SetCoefficient(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i, <span class="keywordtype">int</span> value) {SetBit(i, value);} 00162 <span class="comment"></span> 00163 <span class="comment"> //!</span> 00164 <span class="comment"></span> <span class="keywordtype">void</span> swap(PolynomialMod2 &a) {reg.swap(a.reg);}<span class="comment"></span> 00165 <span class="comment"> //@}</span> 00166 <span class="comment"></span><span class="comment"></span> 00167 <span class="comment"> //! \name UNARY OPERATORS</span> 00168 <span class="comment"></span><span class="comment"> //@{</span> 00169 <span class="comment"></span><span class="comment"> //!</span> 00170 <span class="comment"></span> <span class="keywordtype">bool</span> operator!() const;<span class="comment"></span> 00171 <span class="comment"> //!</span> 00172 <span class="comment"></span> PolynomialMod2 operator+()<span class="keyword"> const </span>{<span class="keywordflow">return</span> *<span class="keyword">this</span>;}<span class="comment"></span> 00173 <span class="comment"> //!</span> 00174 <span class="comment"></span> PolynomialMod2 operator-()<span class="keyword"> const </span>{<span class="keywordflow">return</span> *<span class="keyword">this</span>;}<span class="comment"></span> 00175 <span class="comment"> //@}</span> 00176 <span class="comment"></span><span class="comment"></span> 00177 <span class="comment"> //! \name BINARY OPERATORS</span> 00178 <span class="comment"></span><span class="comment"> //@{</span> 00179 <span class="comment"></span><span class="comment"> //!</span> 00180 <span class="comment"></span> PolynomialMod2 And(<span class="keyword">const</span> PolynomialMod2 &b) <span class="keyword">const</span>;<span class="comment"></span> 00181 <span class="comment"> //!</span> 00182 <span class="comment"></span> PolynomialMod2 Xor(<span class="keyword">const</span> PolynomialMod2 &b) <span class="keyword">const</span>;<span class="comment"></span> 00183 <span class="comment"> //!</span> 00184 <span class="comment"></span> PolynomialMod2 Plus(<span class="keyword">const</span> PolynomialMod2 &b)<span class="keyword"> const </span>{<span class="keywordflow">return</span> Xor(b);}<span class="comment"></span> 00185 <span class="comment"> //!</span> 00186 <span class="comment"></span> PolynomialMod2 Minus(<span class="keyword">const</span> PolynomialMod2 &b)<span class="keyword"> const </span>{<span class="keywordflow">return</span> Xor(b);}<span class="comment"></span> 00187 <span class="comment"> //!</span> 00188 <span class="comment"></span> PolynomialMod2 Times(<span class="keyword">const</span> PolynomialMod2 &b) <span class="keyword">const</span>;<span class="comment"></span> 00189 <span class="comment"> //!</span> 00190 <span class="comment"></span> PolynomialMod2 DividedBy(<span class="keyword">const</span> PolynomialMod2 &b) <span class="keyword">const</span>;<span class="comment"></span> 00191 <span class="comment"> //!</span> 00192 <span class="comment"></span> PolynomialMod2 Modulo(<span class="keyword">const</span> PolynomialMod2 &b) <span class="keyword">const</span>; 00193 <span class="comment"></span> 00194 <span class="comment"> //!</span> 00195 <span class="comment"></span> PolynomialMod2 operator>>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n) <span class="keyword">const</span>;<span class="comment"></span> 00196 <span class="comment"> //!</span> 00197 <span class="comment"></span> PolynomialMod2 operator<<(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> n) <span class="keyword">const</span>;<span class="comment"></span> 00198 <span class="comment"> //@}</span> 00199 <span class="comment"></span><span class="comment"></span> 00200 <span class="comment"> //! \name OTHER ARITHMETIC FUNCTIONS</span> 00201 <span class="comment"></span><span class="comment"> //@{</span> 00202 <span class="comment"></span><span class="comment"> //! sum modulo 2 of all coefficients</span> 00203 <span class="comment"></span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> Parity() const; 00204 <span class="comment"></span> 00205 <span class="comment"> //! check for irreducibility</span> 00206 <span class="comment"></span> <span class="keywordtype">bool</span> IsIrreducible() const; 00207 <span class="comment"></span> 00208 <span class="comment"> //! is always zero since we're working modulo 2</span> <a name="l00209"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z31_2">00209</a> <span class="comment"></span> PolynomialMod2 Doubled()<span class="keyword"> const </span>{<span class="keywordflow">return</span> Zero();}<span class="comment"></span> 00210 <span class="comment"> //!</span> 00211 <span class="comment"></span> PolynomialMod2 Squared() const; 00212 <span class="comment"></span> 00213 <span class="comment"> //! only 1 is a unit</span> <a name="l00214"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z31_4">00214</a> <span class="comment"></span> <span class="keywordtype">bool</span> IsUnit()<span class="keyword"> const </span>{<span class="keywordflow">return</span> Equals(One());}<span class="comment"></span> 00215 <span class="comment"> //! return inverse if *this is a unit, otherwise return 0</span> <a name="l00216"></a><a class="code" href="class_polynomial_mod2.html#_polynomial_mod2z31_5">00216</a> <span class="comment"></span> PolynomialMod2 MultiplicativeInverse()<span class="keyword"> const </span>{<span class="keywordflow">return</span> IsUnit() ? One() : Zero();} 00217 <span class="comment"></span> 00218 <span class="comment"> //! greatest common divisor</span> 00219 <span class="comment"></span> <span class="keyword">static</span> PolynomialMod2 Gcd(<span class="keyword">const</span> PolynomialMod2 &a, <span class="keyword">const</span> PolynomialMod2 &n);<span class="comment"></span> 00220 <span class="comment"> //! calculate multiplicative inverse of *this mod n</span> 00221 <span class="comment"></span> PolynomialMod2 InverseMod(<span class="keyword">const</span> PolynomialMod2 &) const; 00222 <span class="comment"></span> 00223 <span class="comment"> //! calculate r and q such that (a == d*q + r) && (deg(r) < deg(d))</span> 00224 <span class="comment"></span> static <span class="keywordtype">void</span> Divide(PolynomialMod2 &r, PolynomialMod2 &q, const PolynomialMod2 &a, const PolynomialMod2 &d);<span class="comment"></span> 00225 <span class="comment"> //@}</span> 00226 <span class="comment"></span><span class="comment"></span> 00227 <span class="comment"> //! \name INPUT/OUTPUT</span> 00228 <span class="comment"></span><span class="comment"> //@{</span> 00229 <span class="comment"></span><span class="comment"> //!</span> 00230 <span class="comment"></span> friend std::ostream& operator<<(std::ostream& out, const PolynomialMod2 &a);<span class="comment"></span> 00231 <span class="comment"> //@}</span> 00232 <span class="comment"></span> 00233 private: 00234 friend class <a class="code" href="class_g_f2_n_t.html">GF2NT</a>; 00235 00236 <a class="code" href="class_sec_block.html">SecWordBlock</a> reg; 00237 }; 00238 <span class="comment"></span> 00239 <span class="comment">//!</span> 00240 <span class="comment"></span>inline <span class="keywordtype">bool</span> operator==(const CryptoPP::PolynomialMod2 &a, const CryptoPP::PolynomialMod2 &b) 00241 {<span class="keywordflow">return</span> a.Equals(b);}<span class="comment"></span> 00242 <span class="comment">//!</span> 00243 <span class="comment"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> CryptoPP::PolynomialMod2 &a, <span class="keyword">const</span> CryptoPP::PolynomialMod2 &b) 00244 {<span class="keywordflow">return</span> !(a==b);}<span class="comment"></span> 00245 <span class="comment">//! compares degree</span> <a name="l00246"></a><a class="code" href="gf2n_8h.html#a2">00246</a> <span class="comment"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> operator> (<span class="keyword">const</span> CryptoPP::PolynomialMod2 &a, <span class="keyword">const</span> CryptoPP::PolynomialMod2 &b) 00247 {<span class="keywordflow">return</span> a.Degree() > b.Degree();}<span class="comment"></span> 00248 <span class="comment">//! compares degree</span> <a name="l00249"></a><a class="code" href="gf2n_8h.html#a3">00249</a> <span class="comment"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="gf2n_8h.html#a3">operator>=</a>(<span class="keyword">const</span> CryptoPP::PolynomialMod2 &a, <span class="keyword">const</span> CryptoPP::PolynomialMod2 &b) 00250 {<span class="keywordflow">return</span> a.Degree() >= b.Degree();}<span class="comment"></span> 00251 <span class="comment">//! compares degree</span> <a name="l00252"></a><a class="code" href="gf2n_8h.html#a4">00252</a> <span class="comment"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> operator< (<span class="keyword">const</span> CryptoPP::PolynomialMod2 &a, <span class="keyword">const</span> CryptoPP::PolynomialMod2 &b) 00253 {<span class="keywordflow">return</span> a.Degree() < b.Degree();}<span class="comment"></span> 00254 <span class="comment">//! compares degree</span> <a name="l00255"></a><a class="code" href="gf2n_8h.html#a5">00255</a> <span class="comment"></span><span class="keyword">inline</span> <span class="keywordtype">bool</span> <a class="code" href="gf2n_8h.html#a5">operator<=</a>(<span class="keyword">const</span> CryptoPP::PolynomialMod2 &a, <span class="keyword">const</span> CryptoPP::PolynomialMod2 &b) 00256 {<span class="keywordflow">return</span> a.Degree() <= b.Degree();}<span class="comment"></span> 00257 <span class="comment">//!</span> 00258 <span class="comment"></span><span class="keyword">inline</span> CryptoPP::PolynomialMod2 operator&(<span class="keyword">const</span> CryptoPP::PolynomialMod2 &a, <span class="keyword">const</span> CryptoPP::PolynomialMod2 &b) {<span class="keywordflow">return</span> a.And(b);}<span class="comment"></span> 00259 <span class="comment">//!</span> 00260 <span class="comment"></span><span class="keyword">inline</span> CryptoPP::PolynomialMod2 operator^(<span class="keyword">const</span> CryptoPP::PolynomialMod2 &a, <span class="keyword">const</span> CryptoPP::PolynomialMod2 &b) {<span class="keywordflow">return</span> a.Xor(b);}<span class="comment"></span> 00261 <span class="comment">//!</span> 00262 <span class="comment"></span><span class="keyword">inline</span> CryptoPP::PolynomialMod2 operator+(<span class="keyword">const</span> CryptoPP::PolynomialMod2 &a, <span class="keyword">const</span> CryptoPP::PolynomialMod2 &b) {<span class="keywordflow">return</span> a.Plus(b);}<span class="comment"></span> 00263 <span class="comment">//!</span> 00264 <span class="comment"></span><span class="keyword">inline</span> CryptoPP::PolynomialMod2 operator-(<span class="keyword">const</span> CryptoPP::PolynomialMod2 &a, <span class="keyword">const</span> CryptoPP::PolynomialMod2 &b) {<span class="keywordflow">return</span> a.Minus(b);}<span class="comment"></span> 00265 <span class="comment">//!</span> 00266 <span class="comment"></span><span class="keyword">inline</span> CryptoPP::PolynomialMod2 operator*(<span class="keyword">const</span> CryptoPP::PolynomialMod2 &a, <span class="keyword">const</span> CryptoPP::PolynomialMod2 &b) {<span class="keywordflow">return</span> a.Times(b);}<span class="comment"></span> 00267 <span class="comment">//!</span> 00268 <span class="comment"></span><span class="keyword">inline</span> CryptoPP::PolynomialMod2 operator/(<span class="keyword">const</span> CryptoPP::PolynomialMod2 &a, <span class="keyword">const</span> CryptoPP::PolynomialMod2 &b) {<span class="keywordflow">return</span> a.DividedBy(b);}<span class="comment"></span> 00269 <span class="comment">//!</span> 00270 <span class="comment"></span><span class="keyword">inline</span> CryptoPP::PolynomialMod2 operator%(<span class="keyword">const</span> CryptoPP::PolynomialMod2 &a, <span class="keyword">const</span> CryptoPP::PolynomialMod2 &b) {<span class="keywordflow">return</span> a.Modulo(b);} 00271 00272 <span class="comment">// CodeWarrior 8 workaround: put these template instantiations after overloaded operator declarations,</span> 00273 <span class="comment">// but before the use of QuotientRing<EuclideanDomainOf<PolynomialMod2> > for VC .NET 2003</span> 00274 CRYPTOPP_DLL_TEMPLATE_CLASS <a class="code" href="class_abstract_group.html">AbstractGroup<PolynomialMod2></a>; 00275 CRYPTOPP_DLL_TEMPLATE_CLASS <a class="code" href="class_abstract_ring.html">AbstractRing<PolynomialMod2></a>; 00276 CRYPTOPP_DLL_TEMPLATE_CLASS <a class="code" href="class_abstract_euclidean_domain.html">AbstractEuclideanDomain<PolynomialMod2></a>; 00277 CRYPTOPP_DLL_TEMPLATE_CLASS <a class="code" href="class_euclidean_domain_of.html">EuclideanDomainOf<PolynomialMod2></a>; 00278 CRYPTOPP_DLL_TEMPLATE_CLASS <a class="code" href="class_quotient_ring.html">QuotientRing<EuclideanDomainOf<PolynomialMod2></a> >; 00279 <span class="comment"></span> 00280 <span class="comment">//! GF(2^n) with Polynomial Basis</span> <a name="l00281"></a><a class="code" href="class_g_f2_n_p.html">00281</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL GF2NP : <span class="keyword">public</span> <a class="code" href="class_quotient_ring.html">QuotientRing</a><EuclideanDomainOf<PolynomialMod2> > 00282 { 00283 <span class="keyword">public</span>: 00284 GF2NP(<span class="keyword">const</span> PolynomialMod2 &modulus); 00285 00286 <span class="keyword">virtual</span> GF2NP * Clone()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">new</span> GF2NP(*<span class="keyword">this</span>);} 00287 <span class="keyword">virtual</span> <span class="keywordtype">void</span> DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt)<span class="keyword"> const</span> 00288 <span class="keyword"> </span>{assert(<span class="keyword">false</span>);} <span class="comment">// no ASN.1 syntax yet for general polynomial basis</span> 00289 00290 <span class="keywordtype">void</span> DEREncodeElement(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &out, <span class="keyword">const</span> Element &a) <span class="keyword">const</span>; 00291 <span class="keywordtype">void</span> BERDecodeElement(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &in, Element &a) <span class="keyword">const</span>; 00292 00293 <span class="keywordtype">bool</span> Equal(<span class="keyword">const</span> Element &a, <span class="keyword">const</span> Element &b)<span class="keyword"> const</span> 00294 <span class="keyword"> </span>{assert(a.Degree() < m_modulus.Degree() && b.Degree() < m_modulus.Degree()); <span class="keywordflow">return</span> a.Equals(b);} 00295 00296 <span class="keywordtype">bool</span> IsUnit(<span class="keyword">const</span> Element &a)<span class="keyword"> const</span> 00297 <span class="keyword"> </span>{assert(a.Degree() < m_modulus.Degree()); <span class="keywordflow">return</span> !!a;} 00298 00299 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> MaxElementBitLength()<span class="keyword"> const</span> 00300 <span class="keyword"> </span>{<span class="keywordflow">return</span> m;} 00301 00302 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> MaxElementByteLength()<span class="keyword"> const</span> 00303 <span class="keyword"> </span>{<span class="keywordflow">return</span> BitsToBytes(MaxElementBitLength());} 00304 00305 Element SquareRoot(<span class="keyword">const</span> Element &a) <span class="keyword">const</span>; 00306 00307 Element HalfTrace(<span class="keyword">const</span> Element &a) <span class="keyword">const</span>; 00308 00309 <span class="comment">// returns z such that z^2 + z == a</span> 00310 Element SolveQuadraticEquation(<span class="keyword">const</span> Element &a) <span class="keyword">const</span>; 00311 00312 <span class="keyword">protected</span>: 00313 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> m; 00314 }; 00315 <span class="comment"></span> 00316 <span class="comment">//! GF(2^n) with Trinomial Basis</span> <a name="l00317"></a><a class="code" href="class_g_f2_n_t.html">00317</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL GF2NT : <span class="keyword">public</span> GF2NP 00318 { 00319 <span class="keyword">public</span>: 00320 <span class="comment">// polynomial modulus = x^t0 + x^t1 + x^t2, t0 > t1 > t2</span> 00321 GF2NT(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t1, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t2); 00322 00323 GF2NP * Clone()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">new</span> GF2NT(*<span class="keyword">this</span>);} 00324 <span class="keywordtype">void</span> DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) <span class="keyword">const</span>; 00325 00326 <span class="keyword">const</span> Element& Multiply(<span class="keyword">const</span> Element &a, <span class="keyword">const</span> Element &b) <span class="keyword">const</span>; 00327 00328 <span class="keyword">const</span> Element& <a class="code" href="class_square.html">Square</a>(<span class="keyword">const</span> Element &a)<span class="keyword"> const</span> 00329 <span class="keyword"> </span>{<span class="keywordflow">return</span> Reduced(a.Squared());} 00330 00331 <span class="keyword">const</span> Element& MultiplicativeInverse(<span class="keyword">const</span> Element &a) <span class="keyword">const</span>; 00332 00333 <span class="keyword">private</span>: 00334 <span class="keyword">const</span> Element& Reduced(<span class="keyword">const</span> Element &a) <span class="keyword">const</span>; 00335 00336 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t0, t1; 00337 <span class="keyword">mutable</span> PolynomialMod2 result; 00338 }; 00339 <span class="comment"></span> 00340 <span class="comment">//! GF(2^n) with Pentanomial Basis</span> <a name="l00341"></a><a class="code" href="class_g_f2_n_p_p.html">00341</a> <span class="comment"></span><span class="keyword">class </span>CRYPTOPP_DLL GF2NPP : <span class="keyword">public</span> GF2NP 00342 { 00343 <span class="keyword">public</span>: 00344 <span class="comment">// polynomial modulus = x^t0 + x^t1 + x^t2 + x^t3 + x^t4, t0 > t1 > t2 > t3 > t4</span> 00345 GF2NPP(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t0, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t1, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t2, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t3, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t4) 00346 : GF2NP(PolynomialMod2::Pentanomial(t0, t1, t2, t3, t4)), t0(t0), t1(t1), t2(t2), t3(t3) {} 00347 00348 GF2NP * Clone()<span class="keyword"> const </span>{<span class="keywordflow">return</span> <span class="keyword">new</span> GF2NPP(*<span class="keyword">this</span>);} 00349 <span class="keywordtype">void</span> DEREncode(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt) <span class="keyword">const</span>; 00350 00351 <span class="keyword">private</span>: 00352 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> t0, t1, t2, t3; 00353 }; 00354 00355 <span class="comment">// construct new GF2NP from the ASN.1 sequence Characteristic-two</span> 00356 CRYPTOPP_DLL GF2NP * BERDecodeGF2NP(<a class="code" href="class_buffered_transformation.html">BufferedTransformation</a> &bt); 00357 00358 NAMESPACE_END 00359 00360 NAMESPACE_BEGIN(std) 00361 template<> inline <span class="keywordtype">void</span> swap(CryptoPP::PolynomialMod2 &a, CryptoPP::PolynomialMod2 &b) 00362 { 00363 a.swap(b); 00364 } 00365 NAMESPACE_END 00366 00367 <span class="preprocessor">#endif</span> </div></pre><hr size="1"><address style="align: right;"><small>Generated on Sun Nov 7 08:23:57 2004 for Crypto++ by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border=0 ></a> 1.3.7 </small></address> </body> </html>