00001 #include"ugly.cc"
00002 template<typename T> void *MAC_REV_MALLOC(int size);
00003 template<typename T> void *MAC_REV_REALLOC(void*ptr,int,int);
00004
00005 template<typename mon,typename T>
00006 struct pol
00007 {
00008 typedef mon monom_t;
00009 typedef T coeff_t;
00010 int size;
00011 mon ind;
00012 T * nf;
00013
00014 pol operator*(const T &t);
00015 pol &operator-=(const pol& Q);
00016 pol &operator=(const pol&Q);
00017 pol &operator/=(const T &t);
00018 ~pol() {};
00019 };
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 template<typename mon,typename T>
00049 pol<mon,T> pol<mon,T>::operator*(const typename pol<mon,T>::coeff_t & toto)
00050 {
00051 int tmpsize=this->size;
00052 for(int i=0;i<tmpsize;i++)
00053 nf[i]*=toto;
00054 return *this;
00055 }
00056 template<typename mon,typename T>
00057 pol<mon,T>& pol<mon,T>::operator-=(const pol<mon,T> &Q)
00058 {
00059 typedef typename mon::coeff_t mcoeff_t;
00060 int tmpsize=Q.size;
00061
00062 if (size<Q.size)
00063 {
00064 nf=(mcoeff_t*)
00065 MAC_REV_REALLOC<mcoeff_t>(nf,sizeof(T)*size
00066 ,sizeof(T)*Q.size);
00067 for(int i=size;i<Q.size;i++)
00068 nf[i]=0;
00069 size=Q.size;
00070 }
00071
00072 for(int i=0;i<tmpsize;i++)
00073 nf[i]-=Q.nf[i];
00074 return *this;
00075 }
00076
00077
00078
00079
00080
00081 template<typename mon,typename T>
00082 pol<mon,T> & pol<mon,T>::operator= (const pol<mon,T>&Q)
00083 {
00084 nf=Q.nf;
00085 size=Q.size;
00086 ind=Q.ind;
00087 return *this;
00088 }
00089
00090 template<typename mon,typename T>
00091 pol<mon,T> & pol<mon,T>::operator/= (const T&t)
00092 {
00093 for(int i=0;i<this->size;i++)
00094 nf[i]/=t;
00095 return *this;
00096 }
00097 template<typename polyalp,typename poly>
00098 polyalp invconv(const poly & p)
00099 {
00100 typedef typename polyalp::monom_t mon;
00101 typedef typename polyalp::order_t ord;
00102 polyalp res(0);
00103
00104 for(int i=0;i<p.size;i++)
00105 {
00106 if (!Iszero(p.nf[i]))
00107 {
00108 mon tmp;
00109 int2mon(i,tmp);
00110
00111
00112
00113
00114 res+=tmp*p.nf[i];
00115 }
00116 }
00117 if (!Iszero(p.ind.GetCoeff()))
00118 res+=p.ind;
00119
00120 return res;
00121 }
00122
00123
00124
00125
00126
00127 template <typename Mon,typename Base>
00128 Mon divmon(const Mon &mon,int i,const Base &b)
00129 {
00130 Mon res(1);
00131 for(int j=0;j<b.nvar();j++)
00132 if(i==j)
00133 {
00134 res*=Mon(j,mon.GetDegree(j)-1);
00135 }
00136 else
00137 {
00138 res*=Mon(j,mon.GetDegree(j));
00139 }
00140 return res;
00141 }
00142
00143
00144 template<typename pol,typename polyalp,typename Base>
00145 pol convert(const polyalp &P,const Base &b)
00146 {
00147 typedef typename polyalp::order_t ord;
00148 typedef typename polyalp::monom_t mon;
00149 typedef typename mon::coeff_t coeff;
00150 pol res;
00151 int max=0;
00152
00153
00154 for(typename polyalp::const_iterator iter=P.begin();iter!=P.end();iter++)
00155 {
00156 if(IsinB(*iter,b))
00157 {
00158
00159 max=(max<mon2int(*iter))?mon2int(*iter):max;
00160
00161 }
00162 else {};
00163 }
00164 res.size=max+1;
00165 res.nf=(coeff*)MAC_REV_MALLOC<coeff>(res.size*sizeof(coeff));
00166 for(int i=0;i<res.size;i++)
00167 res.nf[i]=0;
00168
00169 for(typename polyalp::const_iterator iter=P.begin();iter!=P.end();iter++)
00170 if(IsinB(*iter,b))
00171 {
00172
00173 res.nf[mon2int(*iter)]=iter->GetCoeff();
00174 }
00175 else
00176 {
00177
00178
00179 if(!Iszero(coeff(iter->GetCoeff())))
00180
00181
00182 {
00183
00184
00185 res.ind=*iter;
00186
00187
00188 }
00189 }
00190 return res;
00191 }
00192
00193 template<typename mon,typename T>
00194 int Degree(const pol<mon,T> &p)
00195 {
00196 int mmax=-1;
00197 for(int i=0;i<p.size;i++)
00198 if(!Iszero(p.nf[i]))
00199 {
00200 mon tmpmon;
00201 int2mon(i,tmpmon);
00202 mmax=(mmax<tmpmon.GetDegree())?tmpmon.GetDegree():mmax;
00203 }
00204 if(!Iszero(p.ind.GetCoeff()))
00205 mmax=(mmax<p.ind.GetDegree())?p.ind.GetDegree():mmax;
00206 return mmax;
00207 }
00208
00209 template<typename mon ,typename T>
00210 mon monofindex(int j, pol<mon,T> &p)
00211 {
00212 mon tmp;
00213 int2mon(j,tmp);
00214 return tmp;
00215 }
00216
00217