PolyBoRi
MinimalLeadingTerms.h
Go to the documentation of this file.
00001 // -*- c++ -*-
00002 //*****************************************************************************
00014 //*****************************************************************************
00015 
00016 #ifndef polybori_groebner_MinimalLeadingTerms_h_
00017 #define polybori_groebner_MinimalLeadingTerms_h_
00018 
00019 // include basic definitions
00020 #include "groebner_defs.h"
00021 
00022 BEGIN_NAMESPACE_PBORIGB
00023 
00029 class MinimalLeadingTerms:
00030   public MonomialSet {
00031 
00032   typedef MonomialSet base;
00033   typedef MinimalLeadingTerms self;
00034 
00035 public:
00036   template <class Type>
00037   MinimalLeadingTerms(const Type& value): base(value) { }
00038 
00040   MonomialSet update(const Monomial& lm) {
00041 
00042     MonomialSet divisors(divisorsOf(lm));
00043     if(divisors.isZero())
00044       return cleanup(lm);
00045 
00046     return  (divisors == lm.set()? lm.ring().zero(): lm.set());
00047   }
00048   
00049 private:
00050   self& operator=(const self& rhs) {
00051     return static_cast<self&>(static_cast<base&>(*this) = rhs);
00052   }
00053 
00054   MonomialSet cleanup(const Monomial& lm) {
00055     MonomialSet removed(multiplesOf(lm).diff(lm.set()));
00056 
00057     PBORI_ASSERT(removed.intersect(*this).intersect(lm.set()).isZero());
00058     PBORI_ASSERT(assertion(lm, removed.expBegin(),removed.expEnd()));
00059 
00060     *this = diff(removed).unite(lm.set());
00061     return removed;
00062   }
00063   
00064   bool assertion(const Monomial& lm,
00065                  MonomialSet::exp_iterator start,
00066                  MonomialSet::exp_iterator finish) const {
00067     while (start != finish) {
00068       if ( (*start) == lm.exp() || !start->reducibleBy(lm.exp()) )
00069         return false;
00070       ++start;
00071     }
00072     return true;
00073   }
00074 };
00075 
00076 END_NAMESPACE_PBORIGB
00077 
00078 #endif /* polybori_groebner_MinimalLeadingTerms_h_ */