galfield.cpp
上传用户:jtjnyq9001
上传日期:2014-11-21
资源大小:3974k
文件大小:2k
源码类别:

3G开发

开发平台:

Visual C++

  1. // galfield.cpp
  2. //
  3. #include <iostream>
  4. #include "galfield.h"
  5. #include "isprime.h"
  6. #include "xfelem.h"
  7. #include <stdlib.h>
  8. GaloisField::GaloisField( int base, 
  9.                           int degree, 
  10.                           PolyOvrPrimeField *prim_poly)
  11. {
  12.   Base = base;
  13.   Degree = degree;
  14.   Prim_Poly = prim_poly;
  15.   Reduc_Poly = new PrimeFieldElem[degree+1];
  16.   for(int term=(Prim_Poly->MaxDegree()); term>=0; term--)
  17.     {
  18. //    Reduc_Poly[term] = (base-(Prim_Poly->Coefficient(term)))%base;
  19.     Reduc_Poly[term] = PrimeFieldElem(base,0)-(Prim_Poly->Coefficient(term));
  20.     }
  21.   #ifdef NOT_DEFINED
  22.   if( ValueIsPrime(order) )
  23.     {
  24.     cout << "order is prime" << endl;
  25.     //GenericField* pImplemField = new PrimeField(order);
  26.     }
  27.   else
  28.     {
  29.     cout << "order is composite" << endl;
  30.     }
  31.   #endif
  32. }
  33. int GaloisField::GetDegree(void)
  34. {
  35.   return Degree;
  36. }
  37. int GaloisField::GetBase(void)
  38. {
  39.   return Base;
  40. }
  41. ExtenFieldElem GaloisField::GetElement(int expon)
  42. {
  43.   ExtenFieldElem result(this);
  44.   PrimeFieldElem *work;
  45.   int dgt_idx,elm_idx;
  46.   work = new PrimeFieldElem[Degree+1];
  47.   //
  48.   // Initialize working m-tuple to equal 0...01
  49.   work[0]=PrimeFieldElem(Base,1);
  50.   for(dgt_idx=1; dgt_idx<Degree; dgt_idx++)
  51.     {
  52.     work[dgt_idx]=PrimeFieldElem(Base,0);
  53.     }
  54.   // Build elements of field until the element alpha**expon
  55.   // is reached
  56.   for(elm_idx=1; elm_idx<=expon; elm_idx++)
  57.     {
  58.     // multiply working element by alpha
  59.     for(dgt_idx=Degree; dgt_idx>=1; dgt_idx--)
  60.       {
  61.       work[dgt_idx]=work[dgt_idx-1];
  62.       }
  63.     work[0]=PrimeFieldElem(Base,0);
  64.     // if multiplication causes an overflow,
  65.     // reduce by subtracting alpha**m
  66.     while(work[Degree]!=0)
  67.       {
  68.       for(dgt_idx=0; dgt_idx<=Degree; dgt_idx++)
  69.         {
  70.         work[dgt_idx] = Reduc_Poly[dgt_idx]+work[dgt_idx];
  71.         }
  72.       }
  73.     //cout << endl;
  74.     }
  75.   // copy stuff into result object
  76.   result.Field = this;
  77.   for(dgt_idx=0; dgt_idx<Degree; dgt_idx++)
  78.     {
  79.     result.Value[dgt_idx] = work[dgt_idx];
  80.     }
  81.   return(result);
  82. }