00001 #ifndef ALREADY_isdivisible
00002 #define ALREADY_isdivisible
00003
00004 template<typename mon>
00005 int isdivisible(const mon &m1, const mon &m2, int nbvar)
00006 {
00007 int res=1;
00008 for(int i=0;i<nbvar;i++)
00009 {
00010
00011 if(m2.GetDegree(i)<m1.GetDegree(i))
00012 { res=0;break;};
00013 }
00014 return res;
00015 }
00016
00017 template<typename mon, typename mon2, typename Base>
00018 int isdivisible(const mon & m1,const mon2 & m2,const Base & b)
00019 {
00020 const int nbvar=b.nbvar();
00021 int res=1;
00022 for(int i=0;i<nbvar;i++)
00023 {
00024
00025 if(m2.GetDegree(i)<m1.GetDegree(i))
00026 { res=0;break;};
00027 }
00028 return res;
00029 }
00030
00031 template<template<typename T,typename toto> class mon,typename typcoeff,
00032 char X,int d,typename T,typename Base>
00033 int isdivisible(const mon<typcoeff,numexp<X,d,T> > & m1
00034 ,const mon<typcoeff,numexp<X,d,T> > & m2,const Base & b)
00035 {
00036 static int initmask=0;
00037 const int nbvar=b.nbvar();
00038 int res=1;
00039 T mask;
00040
00041 if(initmask==0)
00042 {
00043 for(int i=0;i<d;i++) initmask=(initmask<<1)+1;
00044 }
00045 mask=initmask;
00046 for(int i=0;i<nbvar;i++)
00047 {
00048
00049 if((m2.rep.ind&(mask))<(m1.rep.ind&(mask)))
00050 { res=0;break;};
00051 mask=mask<<d;
00052 }
00053 return res;
00054 }
00055 #endif //ALREADY_isdivisible