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

3G开发

开发平台:

Visual C++

  1. // xfelem.cpp
  2. //
  3. #include <iostream>
  4. #include "galfield.h"
  5. #include "xfelem.h"
  6. ExtenFieldElem::ExtenFieldElem(void)
  7. {
  8.   Field=NULL;
  9.   Value=0;
  10.   FieldDegree=0;
  11. }
  12. ExtenFieldElem::ExtenFieldElem(GaloisField* field)
  13. {
  14.   //get m from field and use it to allocate Value[] array
  15.   // initialize Value[] to zeros
  16.   Field=field;
  17.   FieldDegree = field->GetDegree();
  18.   int base = field->GetBase();
  19.   Value = new PrimeFieldElem[FieldDegree];
  20.   for(int n=0; n<FieldDegree; n++)
  21.     {
  22.     Value[n]=PrimeFieldElem(base,0);
  23.     }
  24. }
  25. ExtenFieldElem::ExtenFieldElem(GaloisField* field, int expon)
  26. {
  27.   //get m from field and use it to allocate Value[] array
  28.   // initialize Value[] to zeros
  29.    ExtenFieldElem rval;
  30.   Field=field;
  31.   FieldDegree = field->GetDegree();
  32.   Value = new PrimeFieldElem[FieldDegree];
  33.   rval = field->GetElement(expon);
  34.   for(int n=0; n<FieldDegree; n++)
  35.     {
  36.     Value[n]=rval.Value[n];
  37.     }
  38. }
  39. ExtenFieldElem operator+( const ExtenFieldElem e1,
  40.                       const ExtenFieldElem e2)
  41.   {
  42.   ExtenFieldElem result;
  43.   // we need to add (modulo "base") the coefficients of like
  44.   // powered terms from _e1 and _e2
  45.   int base = e1.Field->GetBase();
  46.   result.Field=e1.Field;
  47.   result.FieldDegree = e1.FieldDegree;
  48.   result.Value = new PrimeFieldElem[result.FieldDegree];
  49.   for(int n=0; n<e1.FieldDegree; n++)
  50.     {
  51.     result.Value[n] = (e1.Value[n] + e2.Value[n]);//%base;
  52.     }
  53.   return (result);
  54.   }
  55. ExtenFieldElem operator-( const ExtenFieldElem e1,
  56.                       const ExtenFieldElem e2)
  57.   {
  58.   ExtenFieldElem result;
  59.   // we need to add (modulo "base") the coefficients of like
  60.   // powered terms from _e1 and _e2
  61.   int base = e1.Field->GetBase();
  62.   result.Field=e1.Field;
  63.   result.FieldDegree = e1.FieldDegree;
  64.   result.Value = new PrimeFieldElem[result.FieldDegree];
  65.   for(int n=0; n<e1.FieldDegree; n++)
  66.     {
  67.     result.Value[n] = (e1.Value[n] - e2.Value[n]);//%base;
  68.     }
  69.   return (result);
  70.   }
  71. ExtenFieldElem operator*( const ExtenFieldElem e1,
  72.                       const ExtenFieldElem e2)
  73.   {
  74.   ExtenFieldElem result;
  75.   int field_degree, d1, d2;
  76.   PrimeFieldElem *work, *temp_res;
  77.   int base = e1.Field->GetBase();
  78.   result.Field=e1.Field;
  79.   field_degree = e1.FieldDegree;
  80.   result.FieldDegree = field_degree;
  81.   result.Value = new PrimeFieldElem[field_degree];
  82.   work = new PrimeFieldElem[field_degree+1];
  83.   temp_res = new PrimeFieldElem[field_degree+1];
  84.   for(d1=0; d1<=field_degree; d1++)
  85.     {
  86.     work[d1] = e2.Value[d1];
  87.     temp_res[d1] = PrimeFieldElem(base,0);
  88.     }
  89.   for(d1=0; d1<field_degree; d1++)
  90.     {
  91.     for(d2=0; d2<field_degree; d2++)
  92.       {
  93. //      temp_res[d2] = (temp_res[d2] + e1.Value[d1]*work[d2])%base;
  94.       temp_res[d2] = temp_res[d2] + e1.Value[d1]*work[d2];
  95.       }
  96.     for(d2=field_degree; d2>=1; d2--)
  97.       {
  98.       work[d2] = work[d2-1];
  99.       }
  100.     work[0]=PrimeFieldElem(base,0);
  101.     while(work[field_degree] !=0)
  102.       {
  103.       for(d2=0; d2<=field_degree; d2++)
  104.         {
  105.         work[d2] = ((result.Field)->Reduc_Poly[d2]+work[d2]);//%base;
  106.         }
  107.       }
  108.     }
  109.   for(d1=0; d1<field_degree; d1++)
  110.     {
  111.     result.Value[d1] = temp_res[d1];
  112.     }
  113.   return (result);
  114.   }
  115. ostream& operator<< ( ostream& s, const ExtenFieldElem& element)
  116. {
  117.   int deg = element.FieldDegree;
  118.   for(int dgt_idx=deg-1; dgt_idx>=0; dgt_idx--)
  119.     {
  120.     s << (element.Value[dgt_idx]);
  121.     }
  122.   s << endl;
  123.   return s;
  124. }