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

3G开发

开发平台:

Visual C++

  1. //
  2. // primpoly.cpp
  3. //
  4. #include <iostream>
  5. #include <fstream>
  6. #include "primpoly.h"
  7. //using namespace std;
  8. extern ::ofstream DebugFile;
  9. int iipow(int x, int m)
  10. {
  11.  int i;
  12.  int result;
  13.  result = 1;
  14.  for(i=1; i<=m; i++)
  15.    {
  16.     result *= x;
  17.    }
  18.  return(result);
  19. }
  20. //=====================================================
  21. PrimitivePolynomialSet::PrimitivePolynomialSet( int prime_field_base,
  22.                                                 int degree )
  23. {
  24.   PolyOvrPrimeField *pf_poly;
  25.   deque<PolyOvrPrimeField*> reduc_polys;
  26.   int prim_poly_cnt, iter;
  27.   BerlekampFactorization *berle_fac;
  28.   Deg_Prim_Polys = degree;
  29.   Prime_Field_Base = prime_field_base;
  30.   Prim_Polys = new   deque<PolyOvrPrimeField*>;
  31.   int cyc_poly_numb = iipow(prime_field_base, degree)-1;
  32.   Cyc_Poly = new CyclotomicPoly(  cyc_poly_numb, prime_field_base);
  33.   //DebugFile << "Cyclotomic polynomial (int):" << endl;
  34.   //Cyc_Poly->DumpToStream(&DebugFile);
  35.   pf_poly = new PolyOvrPrimeField(  prime_field_base, 
  36.                                     Cyc_Poly);
  37.   reduc_polys.push_back( pf_poly );
  38.   prim_poly_cnt = 0;
  39.   Max_Prim_Poly_Cnt = 9999;
  40.   iter=0;
  41.   while( prim_poly_cnt < Max_Prim_Poly_Cnt)
  42.     {
  43.     berle_fac = new BerlekampFactorization( reduc_polys.front() );
  44.     reduc_polys.pop_front();
  45.     if(iter==0) Max_Prim_Poly_Cnt = berle_fac->GetR();
  46.     for( int fac_idx=0; fac_idx<prime_field_base; fac_idx++)
  47.       {
  48.       pf_poly = berle_fac->GetFactor(fac_idx);
  49.       if( pf_poly->MaxDegree() == Deg_Prim_Polys )
  50.         {
  51.         // add polynomial to list of primitive polynomials
  52.         Prim_Polys->push_back( pf_poly );
  53.         prim_poly_cnt++;
  54.         }
  55.       else
  56.         {
  57.         //  add polynomial to list of reducible, nonprimitive 
  58.         //  polynomials that will be factored further in 
  59.         //  subsequent iterations of the while loop until 
  60.         //  all mMaxPrimPolyCnt primitive polynomials are found
  61.         reduc_polys.push_back( pf_poly );
  62.         }
  63.       }//end of loop over iFac
  64.     iter++;
  65.     } // end of while loop
  66. }
  67. //=======================================================
  68. PolyOvrPrimeField* PrimitivePolynomialSet::GetSimplest(void)
  69. {
  70.   int min_num_terms = Deg_Prim_Polys+1;
  71.   int deg_2nd_term = Deg_Prim_Polys;
  72.   int simplest_idx;
  73.   for(int i=0; i<Max_Prim_Poly_Cnt; i++)
  74.     {
  75.     if( (Prim_Polys->at(i))->NumberOfTerms() == min_num_terms)
  76.       {
  77.       if( (Prim_Polys->at(i))->PenultimateDegree() < deg_2nd_term )
  78.         {
  79.         deg_2nd_term = (Prim_Polys->at(i))->PenultimateDegree();
  80.         simplest_idx = i;
  81.         }
  82.       }
  83.     if( (Prim_Polys->at(i))->NumberOfTerms() < min_num_terms)
  84.       {
  85.       min_num_terms = (Prim_Polys->at(i))->NumberOfTerms();
  86.       deg_2nd_term = (Prim_Polys->at(i))->PenultimateDegree();
  87.       simplest_idx = i;
  88.       }
  89.     }
  90.   return( Prim_Polys->at(simplest_idx) );
  91. }