00001 template<typename pol>
00002 struct dumpstruct
00003 {
00004 typedef pol pol_t;
00005 int k;
00006 int size;
00007 pol * nf;
00008 };
00009 template<typename poldense,typename polsparse>
00010 void sparsify(const poldense &p, polsparse & res)
00011 {
00012 typedef typename poldense::monom_t mon;
00013 mon tmpmon;
00014 int comp=0;
00015 res.ind=p.ind;
00016 res.size=0;
00017 for(int i=0;i<p.size;i++)
00018 if(!Iszero(p.nf[i])) res.size++;
00019 res.nf=(mon*)MAC_REV_MALLOC<mon>(res.size*sizeof(mon));
00020 for(int i=0;i<p.size;i++)
00021 if(!Iszero(p.nf[i]))
00022 {
00023 int2mon(i,tmpmon);
00024 tmpmon.SetCoeff(p.nf[i]);
00025 res.nf[comp++]=tmpmon;
00026 }
00027 }
00028
00029 template<typename poldense,typename polsparse>
00030 void densify(const polsparse & p, poldense &res)
00031 {
00032 typedef typename poldense::coeff_t coeff;
00033 res.ind=p.ind;
00034 res.size=0;
00035 for(int i=0;i<p.size;i++)
00036 if(mon2int(p.nf[i])>res.size) res.size=mon2int(p.nf[i]);
00037 res.size++;
00038 res.nf=(coeff*)MAC_REV_MALLOC<coeff>(res.size*sizeof(coeff));
00039 for(int i=0;i<res.size;i++)
00040 res.nf[i]=0;
00041 for(int i=0;i<p.size;i++)
00042 {
00043 res.nf[mon2int(p.nf[i])]=p.nf[i].GetCoeff();
00044 }
00045 }
00046
00047 template<typename typPk, typename typdump>
00048 void Dump(const typPk & Pk ,typdump &dump)
00049 {
00050 typedef typename typdump::value_type dumpstruct;
00051 int i=0;
00052 dumpstruct next;
00053 if(!Pk.empty())
00054 {
00055 next.k=Pk.front().ind.GetDegree();
00056 next.size=Pk.size();
00057 next.nf=(typename dumpstruct::pol_t *)MAC_REV_MALLOC
00058 <typename dumpstruct::pol_t>(Pk.size()*
00059 sizeof(typename dumpstruct::pol_t));
00060 for(typename typPk::const_iterator iter=Pk.begin();iter!=Pk.end();iter++,i++)
00061 {
00062 next.nf[i]=*iter;
00063
00064
00065
00066 next.nf[i].ind.SetCoeff(1);
00067
00068
00069 }
00070 dump.push_back(next);
00071 }
00072 return;
00073 }
00074 template<typename Base,typename typdump,typename typrecall>
00075 void forget(Base &b,typdump &dump,int k,typrecall & recall)
00076
00077
00078
00079 {
00080 typedef typename Base::mon mon;
00081 typedef typename mon::coeff_t coeff;
00082 typedef typename typdump::value_type::pol_t pol;
00083 typename typdump::iterator iterdump=dump.begin(),stockiter=dump.end();
00084
00085
00086
00087
00088 for(typename typrecall::iterator iter=recall.begin();iter!=recall.end();iter++)
00089 MAC_REV_FREE<coeff>(iter->nf,iter->size*sizeof(coeff));
00090 recall.erase(recall.begin(),recall.end());
00091
00092 for(typename Base::iterator iter=b.begin();iter!=b.end();iter++)
00093 {
00094 mon *tmp=(mon*)MAC_REV_MALLOC<mon>(iter->taille1*sizeof(mon));
00095 int tmptaille=0;
00096 for(int i=0;i<iter->taille1;i++)
00097 if(iter->accept[i].GetDegree()<=k)
00098
00099 {
00100 tmp[tmptaille++]=iter->accept[i];
00101 }
00102
00103
00104 if(tmptaille==0)
00105 {
00106 MAC_REV_FREE<mon>(tmp,iter->taille1*sizeof(mon));
00107 MAC_REV_FREE<mon>(iter->accept,iter->taille1*sizeof(mon));
00108 MAC_REV_FREE<mon>(iter->refuse,iter->taille2*sizeof(mon));
00109 b.erase(iter--);
00110 continue;
00111
00112 }
00113 MAC_REV_FREE<mon>(iter->accept,iter->taille1*sizeof(mon));
00114 iter->accept=(mon*)MAC_REV_REALLOC<mon>((void*)tmp
00115 ,iter->taille1*sizeof(mon)
00116 ,tmptaille*sizeof(mon));
00117 iter->taille1=tmptaille;
00118
00119 tmp=(mon*)MAC_REV_MALLOC<mon>(iter->taille2*sizeof(mon));
00120 tmptaille=0;
00121 for(int i=0;i<iter->taille2;i++)
00122 if(iter->refuse[i].GetDegree()<=k)
00123
00124 {
00125 tmp[tmptaille++]=iter->refuse[i];
00126 }
00127
00128
00129 MAC_REV_FREE<mon>(iter->refuse,iter->taille2*sizeof(mon));
00130
00131
00132
00133
00134
00135
00136
00137 {
00138 iter->refuse=(mon*)MAC_REV_REALLOC<mon>((void*)tmp
00139 ,iter->taille2*sizeof(mon)
00140 ,tmptaille*sizeof(mon));
00141 }
00142 iter->taille2=tmptaille;
00143 }
00144
00145
00146
00147
00148
00149 for(iterdump=dump.begin();iterdump!=stockiter && iterdump->k<k;iterdump++);
00150
00151 if(iterdump!=stockiter)
00152 stockiter=iterdump++;
00153 if(stockiter!=dump.end())
00154 free(stockiter->nf);
00155
00156
00157 if(k==0) {cout<<"pas de sol"<<endl;exit(0);}
00158
00159 if(0&&iterdump!=dump.end())
00160 {
00161 for(int i=0;i<iterdump->size;i++)
00162 recall.push_back(iterdump->nf[i]);
00163 iterdump++;
00164 }
00165 for(;iterdump!=dump.end();iterdump++)
00166 {
00167
00168
00169
00170
00171 {
00172
00173
00174
00175
00176
00177
00178
00179 for(int ii=0;ii<(iterdump->size);ii++)
00180 MAC_REV_FREE<coeff>(iterdump->nf[ii].nf
00181 ,iterdump->nf[ii].size*sizeof(coeff));
00182 MAC_REV_FREE<pol>(iterdump->nf,iterdump->size*sizeof(pol));
00183 }
00184
00185 }
00186
00187 dump.erase(stockiter,dump.end());
00188
00189 }
00190
00191 template<typename typPk, typename typMk, typename typdump>
00192 void recover(typPk &Pk,typMk &Mk, const typdump & dump, int k)
00193 {
00194 typedef typename typPk::value_type pol;
00195 typename typdump::const_iterator iter;
00196 typedef typename pol::coeff_t coeff;
00197
00198 {
00199
00200
00201 Pk.erase(Pk.begin(),Pk.end());
00202 Mk.erase(Mk.begin(),Mk.end());
00203 for(iter=dump.begin();(iter!=dump.end())&&(iter->k<k);iter++);
00204
00205 if ((iter!=dump.end())&&(iter->k==k))
00206 for(int i=0;i<iter->size;i++)
00207 {
00208
00209
00210
00211
00212
00213 Pk.push_back(iter->nf[i]);
00214 Mk.push_back(Pk.rbegin()->ind);
00215 }
00216 }
00217 return;
00218 }
00219
00220