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

3G开发

开发平台:

Visual C++

  1. // cycpoly.cpp
  2. //
  3. //#include "stdafx.h"
  4. #include <iostream>
  5. #include <fstream>
  6. #include "math.h"
  7. //#include "galfield.h"
  8. #include "poly_int.h"
  9. #include "cycpoly.h"
  10. #include "stdlib.h"
  11. extern ofstream DebugFile;
  12. CyclotomicPoly::CyclotomicPoly(int e_val, int prime_char)
  13.                :PolyOvrIntegers(0,1)
  14. {
  15. int exp_val, d_val;
  16.   this->DumpToStream(&cout);
  17.   for( d_val=1; d_val<=e_val; d_val++)
  18.     {
  19.     if((e_val%d_val)!=0) continue;  // skip values of d that don't
  20.                                     // divide e
  21.       exp_val = Moebius(e_val/d_val);
  22.     if( exp_val != 1 ) continue;  // build entire numerator first
  23.                                   // do a second pass below to
  24.                                   // pick up denominator factors
  25.       (*this) *= PolyOvrIntegers( d_val, 1);
  26.     //this->DumpToStream(&DebugFile);
  27.     }
  28.   //- - - - - - - - -
  29.   for( d_val=1; d_val<=e_val; d_val++)
  30.     {
  31.     if((e_val%d_val)!=0) continue;  // skip values of d that don't
  32.                                     // divide e
  33.       exp_val = Moebius(e_val/d_val);
  34.     if( exp_val != -1 ) continue;  // process only denominator
  35.                                    // factors this time
  36.       (*this) /= PolyOvrIntegers( d_val, 1);
  37.     }
  38. }
  39. int Moebius(int m)
  40. {
  41.    int p_factors[20];
  42.    int fac_cnt = 0;
  43.    bool fac_found, dup_facs;
  44.    int m_work, n_stop, fac_idx;
  45.    if( m == 1 ) return(1);
  46.    dup_facs = false;
  47.    m_work = m;
  48.    n_stop = m_work;
  49.    for(;;){
  50.       fac_found = false;
  51.       for(int n=2; n<=m_work-1; n++){
  52.          if((m_work%n) != 0 ) continue;
  53.          // else
  54.          // n is a factor of m_work
  55.          // check for duplicate factor
  56.          for( fac_idx=0; fac_idx<fac_cnt; fac_idx++){
  57.             if(n == p_factors[fac_idx]) dup_facs = true;
  58.          }
  59.          p_factors[fac_cnt] = n;
  60.          m_work /= n;
  61.          fac_found = true;
  62.          fac_cnt++;
  63.          break;
  64.       }
  65.       if(!fac_found) break;
  66.       fac_found = false;
  67.    }
  68.    p_factors[fac_cnt] = m_work;
  69.    // check for duplicate factor
  70.    for( fac_idx=0; fac_idx<fac_cnt; fac_idx++)
  71.    {
  72.       if(m_work == p_factors[fac_idx]) dup_facs = true;
  73.    }
  74.    fac_cnt++;
  75.    if( (!dup_facs) && ((fac_cnt%2)==0)) return(1);
  76.    if( (!dup_facs) && ((fac_cnt%2)!=0)) return(-1);
  77.    return(0);
  78. }