⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 primpoly.cpp

📁 《无线通信系统仿真——c++使用模型》这本书的源代码
💻 CPP
字号:
//
// primpoly.cpp
//

#include <iostream>
#include <fstream>
#include "primpoly.h"
//using namespace std;
extern ::ofstream DebugFile;

int iipow(int x, int m)
{
 int i;
 int result;
 result = 1;
 for(i=1; i<=m; i++)
   {
    result *= x;
   }
 return(result);
}

//=====================================================
PrimitivePolynomialSet::PrimitivePolynomialSet( int prime_field_base,
                                                int degree )
{
  PolyOvrPrimeField *pf_poly;
  deque<PolyOvrPrimeField*> reduc_polys;
  int prim_poly_cnt, iter;
  BerlekampFactorization *berle_fac;
  Deg_Prim_Polys = degree;
  Prime_Field_Base = prime_field_base;
  Prim_Polys = new   deque<PolyOvrPrimeField*>;


  int cyc_poly_numb = iipow(prime_field_base, degree)-1;

  Cyc_Poly = new CyclotomicPoly(  cyc_poly_numb, prime_field_base);
  //DebugFile << "Cyclotomic polynomial (int):" << endl;
  //Cyc_Poly->DumpToStream(&DebugFile);
  pf_poly = new PolyOvrPrimeField(  prime_field_base, 
                                    Cyc_Poly);

  reduc_polys.push_back( pf_poly );
  prim_poly_cnt = 0;
  Max_Prim_Poly_Cnt = 9999;
  iter=0;

  while( prim_poly_cnt < Max_Prim_Poly_Cnt)
    {
    berle_fac = new BerlekampFactorization( reduc_polys.front() );
    reduc_polys.pop_front();
    if(iter==0) Max_Prim_Poly_Cnt = berle_fac->GetR();

    for( int fac_idx=0; fac_idx<prime_field_base; fac_idx++)
      {
      pf_poly = berle_fac->GetFactor(fac_idx);
      if( pf_poly->MaxDegree() == Deg_Prim_Polys )
        {
        // add polynomial to list of primitive polynomials
        Prim_Polys->push_back( pf_poly );
        prim_poly_cnt++;
        }
      else
        {
        //  add polynomial to list of reducible, nonprimitive 
        //  polynomials that will be factored further in 
        //  subsequent iterations of the while loop until 
        //  all mMaxPrimPolyCnt primitive polynomials are found

        reduc_polys.push_back( pf_poly );
        }
      }//end of loop over iFac
    iter++;
    } // end of while loop
}
//=======================================================
PolyOvrPrimeField* PrimitivePolynomialSet::GetSimplest(void)
{
  int min_num_terms = Deg_Prim_Polys+1;
  int deg_2nd_term = Deg_Prim_Polys;
  int simplest_idx;

  for(int i=0; i<Max_Prim_Poly_Cnt; i++)
    {
    if( (Prim_Polys->at(i))->NumberOfTerms() == min_num_terms)
      {
      if( (Prim_Polys->at(i))->PenultimateDegree() < deg_2nd_term )
        {
        deg_2nd_term = (Prim_Polys->at(i))->PenultimateDegree();
        simplest_idx = i;
        }
      }
    if( (Prim_Polys->at(i))->NumberOfTerms() < min_num_terms)
      {
      min_num_terms = (Prim_Polys->at(i))->NumberOfTerms();
      deg_2nd_term = (Prim_Polys->at(i))->PenultimateDegree();
      simplest_idx = i;
      }
    }
  return( Prim_Polys->at(simplest_idx) );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -