PolyBoRi
|
00001 /* 00002 * nf.h 00003 * PolyBoRi 00004 * 00005 * Created by Michael Brickenstein on 25.04.06. 00006 * Copyright 2006 The PolyBoRi Team. See LICENSE file. 00007 * 00008 */ 00009 #include <algorithm> 00010 #include <vector> 00011 #include <queue> 00012 #include "groebner_alg.h" 00013 #ifndef PBORI_GB_NF_H 00014 #define PBORI_GB_NF_H 00015 BEGIN_NAMESPACE_PBORIGB 00016 Polynomial add_up_exponents(const std::vector<Exponent>& vec); 00017 Polynomial add_up_monomials(const std::vector<Monomial>& res_vec); 00018 int select1(const GroebnerStrategy& strat, const Polynomial& p); 00019 int select1(const GroebnerStrategy& strat, const Monomial& m); 00020 00021 int select_no_deg_growth(const GroebnerStrategy& strat, const Monomial& m); 00022 00023 static int select_short(const GroebnerStrategy& strat, const Polynomial& p); 00024 static int select_short(const GroebnerStrategy& strat, const Monomial& m); 00025 00026 Polynomial nf1(GroebnerStrategy& strat, Polynomial p); 00027 00028 Polynomial nf2(GroebnerStrategy& strat, Polynomial p); 00029 Polynomial nf2_short(GroebnerStrategy& strat, Polynomial p); 00030 00031 Polynomial nf_delaying(GroebnerStrategy& strat, Polynomial p); 00032 Polynomial nf_delaying_exchanging(GroebnerStrategy& strat, Polynomial p); 00033 00034 class LMLessCompare{ 00035 public: 00036 bool operator() (const Polynomial& p1, const Polynomial& p2){ 00037 return p1.lead()<p2.lead(); 00038 } 00039 }; 00040 00041 const int SLIMGB_SIMPLEST=0; 00042 template<int variant> class SlimgbReduction{ 00043 private: 00044 GroebnerStrategy* strat; 00045 std::priority_queue<Polynomial, std::vector<Polynomial>, LMLessCompare> to_reduce; 00046 public: 00047 std::vector<Polynomial> result; 00048 00049 SlimgbReduction(GroebnerStrategy& strat){ 00050 this->strat=&strat; 00051 } 00052 SlimgbReduction(){} 00053 void addPolynomial(const Polynomial& p); 00054 void reduce(); 00055 //return zero at the end 00056 Polynomial nextResult(); 00057 }; 00058 template <int variant> void SlimgbReduction<variant>::addPolynomial(const Polynomial& p){ 00059 if (!(p.isZero())){ 00060 to_reduce.push(p); 00061 } 00062 } 00063 template <int variant> Polynomial SlimgbReduction<variant>::nextResult(){ 00064 if (result.size()==0) return Polynomial(); 00065 Polynomial res=result.back(); 00066 result.pop_back(); 00067 return res; 00068 } 00069 typedef SlimgbReduction<SLIMGB_SIMPLEST> slimgb_reduction_type; 00070 std::vector<Polynomial> parallel_reduce(std::vector<Polynomial> inp, GroebnerStrategy& strat, int average_steps, double delay_f); 00071 Polynomial red_tail(const GroebnerStrategy& strat, Polynomial p); 00072 Polynomial red_tail_short(const GroebnerStrategy& strat, Polynomial p); 00073 Polynomial nf3(const GroebnerStrategy& strat, Polynomial p, Monomial rest_lead); 00074 Polynomial nf3_short(const GroebnerStrategy& strat, Polynomial p); 00075 Polynomial red_tail_self_tuning(const GroebnerStrategy& strat, Polynomial p); 00076 Polynomial ll_red_nf(const Polynomial& p,const BooleSet& reductors); 00077 00078 Polynomial ll_red_nf_noredsb(const Polynomial& p,const BooleSet& reductors); 00079 Polynomial add_up_polynomials(const std::vector<Polynomial>& vec); 00080 Polynomial plug_1(const Polynomial& p, const MonomialSet& m_plus_ones); 00081 MonomialSet mod_mon_set(const MonomialSet& as, const MonomialSet &vs); 00082 END_NAMESPACE_PBORIGB 00083 #endif