00001 template<typename typPk,typename typdump,typename Base>
00002 void rewrite(typPk &Pk,const typdump &dump,const Base &b)
00003 {
00004 typedef typename typPk::value_type polyalp;
00005 typedef typename polyalp::monom_t mon;
00006 typedef typename typdump::value_type dumpstruct;
00007 typedef typename dumpstruct::pol_t pol;
00008 typename typPk::iterator iter=Pk.begin();
00009
00010 for(;iter!=Pk.end();iter++)
00011
00012 {
00013 polyalp tmp(mon(0));
00014 for(typename polyalp::iterator itermon=iter->begin();
00015 itermon!=iter->end();itermon++)
00016
00017 {
00018 if (!IsinB(*itermon,b))
00019 {
00020 pol ttmp;
00021 ttmp.size=-1;
00022 ttmp.nf=NULL;
00023
00024 findcorresppol(*itermon,dump,ttmp);
00025
00026
00027
00028
00029 if(ttmp.size!=-1)
00030 {
00031
00032
00033 tmp+=invconv<polyalp>(ttmp)*mon(itermon->GetCoeff()/ttmp.ind.GetCoeff());
00034 }
00035 }
00036
00037 }
00038
00039
00040
00041
00042 (*iter)-=tmp;
00043
00044 }
00045 return;
00046 }
00047 #ifdef uninf
00048 void reinit_multiple();
00049 #endif
00050 template<typename T,typename typdump,typename Base>
00051 void proj(T &Crochet,const typdump &dump, const Base &b)
00052 {
00053 typedef typename typdump::value_type::pol_t pol;
00054 typedef typename T::value_type polyalp;
00055 typedef typename polyalp::monom_t mon;
00056 typedef typename mon::coeff_t coeff;
00057 typename T::iterator iter=Crochet.begin();
00058 #ifdef unimul
00059 reinit_multiple();
00060 #endif
00061 #ifdef uninf
00062 reinit_nf<pol>();
00063 #endif
00064 for(;iter!=Crochet.end();iter++)
00065 {
00066 list<mon> monared;
00067
00068
00069 for(typename polyalp::iterator iterpol=iter->begin();iterpol!=iter->end();iterpol++)
00070 {
00071 if (!IsinB(*iterpol,b)) monared.push_back(*iterpol);
00072
00073 }
00074 for(typename list<mon>::iterator itermon=monared.begin();itermon!=monared.end();itermon++)
00075 {
00076
00077 #ifdef projfast
00078 polyalp result(0);
00079 pol accumul;
00080 mon *exce;
00081 int sizeex;
00082 accumul.size=1;
00083 accumul.nf=(coeff*)MAC_REV_MALLOC<coeff>(sizeof(coeff));
00084 accumul.nf[0]=1;
00085 for(int i=0;i<b.nbvar();i++)
00086 for(int j=0;j<itermon->GetDegree(i);j++)
00087 {
00088 pol tmp;
00089
00090 result*=mon(i,1);
00091 tmp=mult(i,accumul,dump,b,&exce,sizeex);
00092 MAC_REV_FREE<coeff>(accumul.nf,accumul.size*sizeof(coeff));
00093 accumul=tmp;
00094 for(int k=0;k<sizeex-1;k++)
00095 result+=exce[k];
00096 MAC_REV_FREE<mon>(exce,sizeex*sizeof(mon));
00097 }
00098 for(int k=0;k<accumul.size;k++)
00099 if(!Iszero(accumul.nf[k]))
00100 {
00101 mon tmpmon;
00102 int2mon(k,tmpmon);
00103
00104 result+=tmpmon*accumul.nf[k];
00105 }
00106 MAC_REV_FREE<coeff>(accumul.nf,accumul.size*sizeof(coeff));
00107 #else
00108 polyalp result(1);
00109 for(int i=0;i<b.nbvar();i++)
00110 for(int j=0;j<itermon->GetDegree(i);j++)
00111 {
00112 result*=mon(i,1);
00113 int flag=0;
00114
00115 for (typename polyalp::iterator iterres=result.begin();
00116 iterres!=result.end();iterres++)
00117 {
00118 if (!IsinB(*iterres,b)) flag=1;
00119
00120 }
00121 if (flag)
00122 {
00123 T tmp;
00124 tmp.push_back(result);
00125
00126 rewrite(tmp,dump,b);
00127
00128 result=tmp.front();
00129 }
00130 }
00131 #endif
00132 coeff Coeff;
00133 for(typename polyalp::iterator iterpol=iter->begin();
00134 iterpol!=iter->end();iterpol++)
00135 if ((itermon->rep)==(iterpol->rep))
00136 {
00137 Coeff=iterpol->GetCoeff();
00138 break;
00139 }
00140
00141 *iter+=result*mon(Coeff);
00142 *iter-=polyalp(mon((*itermon)*(coeff)(Coeff/itermon->GetCoeff())));
00143
00144 }
00145 }
00146
00147 return;
00148
00149 }