20#ifndef _Tnmcvec_H_INCLUDED_
21#define _Tnmcvec_H_INCLUDED_
27#define ASSERTE _ASSERTE
29#define ASSERTE(expression)
57template<
class T>
class nmcvec
60 cmplx<nmint<T> > * m_container;
64 cmplx<nmint<T> > * m_data;
66 nmcvec(cmplx<nmint<T> >* Data,
int Size):m_data(Data),m_size(Size),m_flag_new(false){};
68 nmcvec(
int Size,
int Reserve=0):m_size(Size),m_flag_new(true)
70 m_container=
new cmplx<nmint<T> >[m_size+2*Reserve];
71 m_data=m_container+Reserve;
77 nmcvec(
const nmcvec<T> &
vec)
81 m_data=m_container=
new T[m_size];
82 memcpy(m_data,
vec.m_data,m_size*
sizeof(T));
93 nmcvec<T>& operator= (nmcvec<T>&
vec)
95 ASSERTE(
vec.m_size==m_size);
96 memcpy(m_data,
vec.m_data,m_size*
sizeof(T));
100#ifndef NMTL_DISABLE_INDEX_CHECK
101 inline cmplx<nmint<T> >& operator [] (
int idx)
105 cmplx<nmint<T> >* res=(cmplx<nmint<T> >*)(m_data+idx);
109 inline cmplx<nmint<T> >& operator [] (
int idx)
111 return (cmplx<nmint<T> >*)(m_data+idx);
115 template <
class T2> nmcvec<T2>& operator*= (
const cmplx<nmint<T2> > val)
117 for(
int idx=0;idx<m_size;idx++)
118 m_data[idx]*=val.m_value;
122 template <
class T2> nmcvec<T2> operator* (
const cmplx<nmint<T2> >& val)
const
124 nmcvec<T2> res(m_size);
125 for(
int idx=0;idx<m_size;idx++)
126 res.m_data[idx]=m_data[idx]*val.m_value;
129 template <
class T2> nmint<T2> operator* (
const nmcvec<T2>&
vec)
const
131 ASSERTE(m_size==
vec.m_size);
133 for (
int idx=0;idx<m_size;idx++)
134 res.m_value+=m_data[idx]*
vec.m_data[idx];
138 nmcvec<T>& operator+= (
const cmplx<nmint<T> > &val)
140 for(
int idx=0;idx<m_size;idx++)
141 m_data[idx]+=val.m_value;
145 nmcvec<T>& operator+= (
const nmcvec<T> &
vec)
147 ASSERTE (
vec.m_size==m_size);
148 for(
int idx=0;idx<m_size;idx++)
149 m_data[idx]+=
vec.m_data[idx];
153 nmcvec<T> operator+ (
const cmplx<nmint<T> >& val)
const
155 nmcvec<T> res(*
this);
160 nmcvec<T> operator+ (
const nmcvec<T>&
vec)
const
162 ASSERTE (
vec.m_size==m_size);
163 nmcvec<T> res(*
this);
168 nmcvec<T>& operator-= (
const nmcvec<T> &
vec)
170 ASSERTE (
vec.m_size==m_size);
171 for(
int idx=0;idx<m_size;idx++)
172 m_data[idx]-=
vec.m_data[idx];
176 nmcvec<T> operator- (
const nmcvec<T>&
vec)
const
178 ASSERTE (
vec.m_size==m_size);
179 nmcvec <T> res(*
this);
184 nmcvec<T> operator- ()
const
186 nmcvec<T> res(*
this);
187 for(
int idx=0;idx<m_size;idx++)
188 m_data[idx]=-m_data[idx];
192 nmcvec<T>& operator/=(
const cmplx<nmint<T> > val)
194 ASSERTE(val.m_value!=0);
195 for(
int idx=0;idx<m_size;idx++)
196 m_data[idx]/=val.m_value;
200 nmcvec<T> operator/ (
const T val)
const
202 nmcvec<T> res(*
this);
207 nmcvec<T>& operator>>=(
const int shr)
210 if (shr==0)
return(*
this);
211 for(
int idx=0;idx<m_size;idx++)
216 nmcvec<T> operator>> (
const int shr)
const
219 nmcvec<T> res(*
this);
224 nmcvec<T>& operator<<=(
const int shl)
227 if (shl==0)
return(*
this);
228 for(
int idx=0;idx<m_size;idx++)
236 nmcvec<T> res(*
this);
241 template<
class T2>
void SetData(T2* Data)
243 for(
int i=0;i<m_size;i++)
247 template<
class T2>
void GetData(T2* Data)
249 for(
int i=0;i<m_size;i++)
250 Data[i]=(T2)m_data[i].value;
253 void SetConst(
const cmplx<nmint<T > > val)
255 for (
int idx=0;idx<m_size;idx++)
272typedef nmcvec<char > nmvec8sc;
273typedef nmcvec<short > nmvec16sc;
275typedef nmcvec<int > nmvec32sc;
276typedef nmcvec<long long> nmvec64sc;
__INLINE__ ostream & operator<<(ostream &s, mtr< unsigned char > &mtr)
Definition: nmtlio.h:64