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

3G开发

开发平台:

Visual C++

  1. //
  2. //  File = rowvec_pf.cpp
  3. //
  4. //#include "complex.h"
  5. #include "rowvec_pf.h"
  6. #include "colvec_pf.h"
  7. #include "matrix_pf.h"
  8. #include "pfelem.h"
  9. #ifdef _DEBUG
  10.   #include <fstream>
  11.   //#define _VEC_DEBUG 1
  12.   extern ofstream DebugFile;
  13. #endif
  14. //class vector;
  15. //------------------------------------------
  16. //  constructor for row vector
  17. rowvec_pf::rowvec_pf( void )
  18.           :vector_pf()
  19.   {
  20.   #ifdef _VEC_DEBUG
  21.     DebugFile << "nshallow ctor for rowvec at " << (void*)this 
  22.               << endl;
  23.   #endif
  24.   //pV->is_row_vec = 0;
  25.   }
  26. //------------------------------------------
  27. rowvec_pf::rowvec_pf(int origin, int size)
  28.           :vector_pf(origin, size)
  29.   {
  30.   #ifdef _VEC_DEBUG
  31.     DebugFile << "nctor for rowvec at " << (void*)this 
  32.               << "  (vrep = " << (void*)pV << ")" << endl;
  33.   #endif
  34.   }
  35. //==========================================
  36. int rowvec_pf::getlen(void)
  37.   {
  38.   int vec_len = pV->length;
  39.   return(vec_len);
  40.   }
  41. //------------------------------------------------
  42. // transpose operator
  43. colvec_pf& rowvec_pf::operator!( void )
  44. {
  45.   colvec_pf *cv = new colvec_pf(pV->orig_indx,pV->length);
  46.   #ifdef _VEC_DEBUG
  47.     DebugFile << "nnew colvec at " << (void*)cv << endl;
  48.     DebugFile << "nrv::op!(): hook vrep "
  49.               << (void*)pV << " to colvec " 
  50.               << (void*)cv << endl;
  51.   #endif
  52.   cv->pV = pV;
  53.   *(cv->pV)=*pV;
  54.   cv->Is_Temp = 1;
  55.   if(Is_Temp)
  56.     {
  57.     #ifdef _VEC_DEBUG
  58.       DebugFile << "nrv::op!(): deleting rowvec at " 
  59.                 << (void*)this << endl;
  60.     #endif
  61.     delete this;
  62.     }
  63.   return(*cv);
  64. }
  65. //---------------------------------------------------
  66. //  row vector times column vector
  67. PrimeFieldElem& rowvec_pf::operator*( colvec_pf &v2)
  68.   {
  69.   // get origin and length of row vector
  70.   int v1_orig = pV->orig_indx;
  71.   int v1_len = pV->length;
  72.   // get origin and length of column vector
  73.   int v2_orig = v2.pV->orig_indx;
  74.   int v2_len = v2.pV->length;
  75.   // alocate scalar for result
  76.   //T *result = new T;
  77.  // #ifdef _VEC_DEBUG
  78.  //   DebugFile << "rv::op*(cv): new scalar alloc at "
  79.  //             << (void*)result << endl;
  80.  // #endif
  81.   PrimeFieldElem *sum = new PrimeFieldElem;
  82.   *sum = 0;
  83.   for(int idx=0; idx<v1_len; idx++)
  84.     {
  85.     //sum += ((pV->f[idx+v1_orig]) * (v2.pV->f[idx+v2_orig]));
  86.     (*sum) += ((pV->f[idx]) * (v2.pV->f[idx]));
  87.     }
  88.   //*result = sum;
  89.   if(v2.Is_Temp)
  90.     {
  91.     #ifdef _VEC_DEBUG
  92.       DebugFile << "nrv::op*(cv): deleting colvec at " 
  93.                 << (void*)(&v2) << endl;
  94.     #endif
  95.     delete (&v2);
  96.     }
  97.   if(Is_Temp)
  98.     {
  99.     #ifdef _VEC_DEBUG
  100.       DebugFile << "nrv::op*(cv): deleting rowvec at " 
  101.                 << (void*)this << endl;
  102.     #endif
  103.     delete this;
  104.     }
  105.   //return(*result);
  106.   return(*sum);
  107.   }
  108. //---------------------------------------------------
  109. //  method to multiply row vector times matrix
  110. rowvec_pf& rowvec_pf::operator*( matrix_pf &m2)
  111. {
  112.   // check dimensions
  113.   int vec_orig = pV->orig_indx;
  114.   int vec_len = pV->length;
  115.   int row_orig = m2.pM->orig_indx;
  116.   int nrows = m2.pM->length;
  117.   int col_orig = ((m2.pM->f[row_orig])->pV)->orig_indx;
  118.   int ncols = ((m2.pM->f[row_orig])->pV)->length;
  119.   if(nrows != vec_len)
  120.     {
  121.     #ifdef _DEBUG
  122.       DebugFile << "error in vector method" << endl;
  123.     #endif
  124.     return(*this);
  125.     }
  126.   //  allocate new vector for result
  127.   rowvec_pf *v_res = new rowvec_pf(col_orig, ncols);
  128.   v_res->Is_Temp = 1;
  129.   #ifdef _VEC_DEBUG
  130.     DebugFile << "rv::op*(m): new rowvec at " 
  131.               << (void*)v_res << endl;
  132.   #endif
  133.   // perform multiplication and populate results vector
  134.   PrimeFieldElem sum;
  135.   for( int j=0; j<ncols; j++)
  136.     {
  137.     sum = PrimeFieldElem(0);
  138.     for( int i=0; i<nrows; i++)
  139.       {
  140.       sum += ((pV->f[i]) * 
  141.              (((m2.pM->f[i-(m2.pM->orig_indx)])->pV)->f[j]));
  142.       }
  143.     (v_res->pV)->f[j] = sum;
  144.     }
  145.   if(m2.Is_Temp)
  146.     {
  147.     #ifdef _VEC_DEBUG
  148.       DebugFile << "nrv::op*(m): deleting matrix at " 
  149.                 << (void*)(&m2) << endl;
  150.     #endif
  151.     delete (&m2);
  152.     }
  153.   if(Is_Temp)
  154.     {
  155.     #ifdef _VEC_DEBUG
  156.       DebugFile << "nrv::op*(m): deleting rowvec at " 
  157.                 << (void*)this << endl;
  158.     #endif
  159.     delete this;
  160.     }
  161.   return(*v_res);
  162. }
  163. //------------------------------------------------
  164. PrimeFieldElem& rowvec_pf::operator[](int i)
  165.   {
  166.     return pV->f[ (((i >=(pV->orig_indx)) && (i <= pV->max_indx)) ? 
  167.                  (i-(pV->orig_indx)) : 0)];
  168.   }
  169. //-----------------------------------------
  170. // destructor
  171. rowvec_pf::~rowvec_pf()
  172.   {
  173.   #ifdef _VEC_DEBUG
  174.     DebugFile << "ndtor for rowvec at " << (void*)this << endl;
  175.   #endif
  176.   //~vector();
  177.   };
  178. //----------------------------------------------
  179. // assignment x = y
  180. rowvec_pf& rowvec_pf::operator=(vector_pf &vec)
  181. {
  182.   vec.pV->refcnt++;
  183.   if(--pV->refcnt == 0)
  184.     {
  185.     #ifdef _VEC_DEBUG
  186.       DebugFile << "nrv::op=(v): deleting vrep at " 
  187.                 << (void*)pV << endl;
  188.     #endif
  189.     delete[] pV->f;
  190.     delete pV;
  191.     pV = NULL;
  192.     }
  193.   #ifdef _VEC_DEBUG
  194.     DebugFile << "nrv::op=(v): hook vrep "
  195.           << (void*)(vec.pV) << " to vector " 
  196.           << (void*)this << endl;
  197.   #endif
  198.   pV = vec.pV;
  199.   if(vec.Is_Temp)
  200.     {
  201.     #ifdef _VEC_DEBUG
  202.       DebugFile << "nrv::op=(v): deleting vector at " 
  203.                 << (void*)(&vec) << endl;
  204.     #endif
  205.     delete &vec;
  206.     }
  207.   return *this;
  208. }