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

3G开发

开发平台:

Visual C++

  1. //
  2. // berlemat.cpp
  3. //
  4. #include <iostream>
  5. #include "berlemat.h"
  6. #include <fstream>
  7. extern ofstream DebugFile;
  8. BerlekampMatrix::BerlekampMatrix( PolyOvrPrimeField *poly )
  9. {
  10.   int i, k1, k2;
  11.   int deg = poly->MaxDegree();
  12.   Degree = deg;
  13.   int prime_char = poly->PrimeBase();
  14.   Prime_Base = prime_char;
  15.   allocate(0,deg,0,deg);
  16.   //-----------------------------------------------------
  17.   //  Populate B matrix
  18.   PrimeFieldElem *work_vec = new PrimeFieldElem[deg+1];
  19.   PrimeFieldElem *u;
  20.   PrimeFieldElem temp;
  21.   u = new PrimeFieldElem[deg+1];
  22.   poly->GetCoeffs(u);
  23.   for(i=1; i<=deg; i++) work_vec[i] = PrimeFieldElem(prime_char,0);
  24.   work_vec[0] = PrimeFieldElem(prime_char,1);
  25.   setrow(0,work_vec);
  26.   for( k1=1; k1<deg; k1++)
  27.     {
  28.     for( k2=1; k2<=prime_char; k2++)
  29.       {
  30.       for( i=deg; i>0; i--)
  31.         work_vec[i] = work_vec[i-1];
  32.       work_vec[0] = PrimeFieldElem(prime_char,0);
  33.       if( work_vec[deg] != 0 )
  34.         {
  35.         // reduce work_vec modulo u(x) using arithmetic
  36.         // over GF(p) on the coefficients
  37.         for( i=0; i<deg; i++)
  38.           {
  39.           temp = work_vec[deg] * u[i];
  40.           work_vec[i] -= work_vec[deg] * u[i];
  41.           }
  42.         } // end of 'if( work_vec[deg] != 0 )'
  43.       } // end of loop over k2
  44. //    B_Mtx->setrow(k1,work_vec);
  45.     setrow(k1,work_vec);
  46.     } // end of loop over k1
  47.   //-----------------------------------------------------
  48.   //  Subtract identity matrix from B
  49.   for(i=0; i<deg; i++)
  50.     {
  51.     (operator[](i)).operator[](i) -= PrimeFieldElem(prime_char,1);
  52.     }
  53. };
  54. int BerlekampMatrix::GetDegree( void )
  55. {
  56. return(Degree);
  57. };
  58. int BerlekampMatrix::PrimeBase( void )
  59. {
  60. return(Prime_Base);
  61. };