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

3G开发

开发平台:

Visual C++

  1. //
  2. // berlefac.cpp
  3. //
  4. #include <iostream>
  5. #include "berlefac.h"
  6. #include "nullspac.h"
  7. #include <fstream>
  8. extern ofstream DebugFile;
  9. //=====================================================
  10. BerlekampFactorization::BerlekampFactorization( 
  11.                                   PolyOvrPrimeField *orig_poly )
  12. {
  13.   int k, r, s;
  14.   int poly_idx;
  15.   int deg = orig_poly->MaxDegree();
  16.   int prime_char = orig_poly->PrimeBase();
  17.   matrix_pf *v;
  18.   PolyOvrPrimeField **polys;
  19.   int num_facs = 1;
  20.   int num_polys;
  21.   Factors = new PolyOvrPrimeField*[1];
  22.   Factors[0] = orig_poly;
  23.   for(int iter=0; iter<1; iter++)
  24.     {
  25.     num_polys = num_facs;
  26.     polys = new PolyOvrPrimeField*[num_polys];
  27.     for( poly_idx=0; poly_idx<num_polys; poly_idx++)
  28.       {
  29.       polys[poly_idx] = Factors[poly_idx];
  30.     int yydeg = (polys[poly_idx])->MaxDegree();
  31.      // delete (Factors[poly_idx]);
  32.       } // end of loop over poly_idx
  33.     delete[] Factors;
  34.     num_facs = 0;
  35.     Factors = new PolyOvrPrimeField*[20];
  36.     for( poly_idx=0; poly_idx<num_polys; poly_idx++)
  37.       {
  38. //int xxdeg = (polys[poly_idx])->MaxDegree();
  39. //if(xxdeg == 7) continue;
  40.       B_Mtx = new BerlekampMatrix( polys[poly_idx] );
  41.       //  Row k corresponds to the term x**(k*p) where p is the
  42.       //  characteristic of the prime field over which the polynomial
  43.       //  is to be factored.
  44.       //-----------------------------------------------------
  45.       //  Compute null space of B matrix
  46.       v = NullSpace(B_Mtx, &r);
  47.       //----------------------------------------------------
  48.       // Find factors
  49.   
  50.       //DebugFile << "rrr = " << r << endl;
  51.       R = r;
  52.       //
  53.       //  The original polynomial should factor into r irreducible
  54.       //  polynomials.  However each iteration of the Berlekamp
  55.       //  factorization will only factor the original polynomial
  56.       //  into p polynomials (which, in general, may be reducible)
  57.       //  where p is the prime characteristic of the field from 
  58.       //  which the coefficients are drawn.  Additional iterations
  59.       //  can be performed until all r irreducible factors are found.
  60.      // Factors = new PolyOvrPrimeField*[r];
  61.       //PolyOvrPrimeField factor_poly;
  62.       //Factors[0] = new PolyOvrPrimeField;
  63.       for(k=1; k<2; k++)
  64.         {
  65.         //--------------------------------------------------------------
  66.         //  Use the row 1 elements of v as coefficients for a polynomial
  67.         PolyOvrPrimeField *work_poly = new PolyOvrPrimeField( prime_char,
  68.                                                               &((*v)[k]));
  69.         //DebugFile << "work_poly:" << endl;
  70.         //work_poly->DumpToStream(&DebugFile);
  71.         //DebugFile << "poly:" << endl;
  72.         //polys[poly_idx]->DumpToStream(&DebugFile);
  73.         for(s=0; s<prime_char; s++)
  74.           {
  75.           Factors[num_facs] = &(EuclideanAlgorithm( polys[poly_idx], work_poly ) );
  76.           //DebugFile << "factor_poly (for k=" << k <<", s=" << s << "):" << endl;
  77.           //(Factors[num_facs])->DumpToStream(&DebugFile);
  78.           (*work_poly) -= PrimeFieldElem( prime_char, 1 );
  79.           num_facs++;
  80.           }
  81.         delete work_poly;
  82.         delete B_Mtx;
  83.         delete v;
  84.         } // end of loop over k
  85.       } // end of loop over poly_idx
  86.   } // end of loop over iter
  87. }
  88. int BerlekampFactorization::GetR(void)
  89. {
  90.   return(R);
  91. }
  92. PolyOvrPrimeField* BerlekampFactorization::GetFactor(int fac_idx)
  93. {
  94.   return(Factors[fac_idx]);
  95. }