rssoft  0.0.0
Reed-Solomon codes library with soft decision decoding
/shared/development/google_code/rssoft/library/lib/GFq_BivariatePolynomial.h
Go to the documentation of this file.
00001 /*
00002  Copyright 2013 Edouard Griffiths <f4exb at free dot fr>
00003 
00004  This file is part of RSSoft. A Reed-Solomon Soft Decoding library
00005 
00006  This program is free software; you can redistribute it and/or modify
00007  it under the terms of the GNU General Public License as published by
00008  the Free Software Foundation; either version 2 of the License, or
00009  (at your option) any later version.
00010 
00011  This program is distributed in the hope that it will be useful,
00012  but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  GNU General Public License for more details.
00015 
00016  You should have received a copy of the GNU General Public License
00017  along with this program; if not, write to the Free Software
00018  Foundation, Inc., 51 Franklin Street, Boston, MA  02110-1301  USA
00019 
00020  Bivariate polynomials with coefficients in GF(2^m) class
00021 
00022  */
00023 #ifndef __GFQ_BIVARIATE_POLYNOMIAL_H__
00024 #define __GFQ_BIVARIATE_POLYNOMIAL_H__
00025 
00026 #include "GFq_BivariateMonomial.h"
00027 #include "GFq_Polynomial.h"
00028 #include <map>
00029 
00030 namespace rssoft
00031 {
00032 namespace gf
00033 {
00034 
00040 class GFq_BivariatePolynomial
00041 {
00042 public:
00048         GFq_BivariatePolynomial(unsigned int w_x, unsigned int w_y);
00049 
00054         GFq_BivariatePolynomial(const std::pair<unsigned int, unsigned int>& _weights);
00055 
00060         GFq_BivariatePolynomial(const GFq_BivariatePolynomial& polynomial);
00061 
00065         ~GFq_BivariatePolynomial();
00066 
00071         void init(std::vector<GFq_BivariateMonomial>& _monomials);
00072 
00076         void init(const GFq_BivariatePolynomial& polynomial);
00077 
00081         void init(const std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial>& monomials);
00082     
00088     void init_x_pow(const GFq& gf, unsigned int x_pow);
00089 
00095     void init_y_pow(const GFq& gf, unsigned int y_pow);
00096 
00102     void init_x_pow_series(const GFq& gf, unsigned int max_pow);
00103 
00109     void init_y_pow_series(const GFq& gf, unsigned int max_pow);
00110 
00115         const std::pair<unsigned int, unsigned int>& get_weights() const
00116         {
00117                 return weights;
00118         }
00119 
00123         bool is_valid() const;
00124 
00128         bool is_const(GFq_Element& const_value) const;
00129 
00133         bool is_zero() const;
00134 
00138         bool is_one() const;
00139 
00144         const std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial>& get_monomials() const
00145         {
00146                 return monomials;
00147         }
00148 
00153         std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial>& get_monomials_for_update() 
00154         {
00155                 return monomials;
00156         }
00157     
00162         GFq_BivariateMonomial get_leading_monomial() const
00163         {
00164                 return static_cast<GFq_BivariateMonomial>(*(monomials.rbegin()));
00165         }
00166     
00170     unsigned int lmX() const
00171     {
00172         return static_cast<GFq_BivariateMonomial>(*(monomials.rbegin())).eX();
00173     }
00174     
00178     unsigned int lmY() const
00179     {
00180         return static_cast<GFq_BivariateMonomial>(*(monomials.rbegin())).eY();
00181     }
00182     
00186     unsigned int wdeg() const;
00187 
00191         static void sum(std::vector<GFq_BivariateMonomial>& sum_monomials, const GFq_BivariatePolynomial& a, const GFq_BivariatePolynomial& b);
00192 
00196         static void product(std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial>& prod_monomials,
00197                         const GFq_BivariatePolynomial& a,
00198                         const GFq_BivariatePolynomial& b);
00199 
00203         static void division(std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial>& div_monomials,
00204                         const GFq_BivariatePolynomial& a,
00205                         const GFq_BivariateMonomial& b);
00206 
00210         static void pow(std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial>& pow_monomials,
00211                         const GFq_BivariatePolynomial& a,
00212                         unsigned int n);
00213 
00217         static void simplify(std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial>& monomials);
00218 
00219         GFq_BivariatePolynomial& operator =(const GFq_BivariatePolynomial& polynomial);
00220         GFq_BivariatePolynomial& operator+=(const GFq_BivariatePolynomial& polynomial);
00221         GFq_BivariatePolynomial& operator+=(const GFq_Element& gfe);
00222         GFq_BivariatePolynomial& operator-=(const GFq_BivariatePolynomial& polynomial);
00223         GFq_BivariatePolynomial& operator-=(const GFq_Element& gfe);
00224         GFq_BivariatePolynomial& operator*=(const GFq_BivariatePolynomial& polynomial);
00225         GFq_BivariatePolynomial& operator*=(const GFq_BivariateMonomial& monomial);
00226         GFq_BivariatePolynomial& operator*=(const GFq_Element& gfe);
00227         GFq_BivariatePolynomial& operator/=(const GFq_BivariateMonomial& monomial);
00228         GFq_BivariatePolynomial& operator/=(const GFq_Element& gfe);
00229         GFq_BivariatePolynomial& operator^=(unsigned int n);
00230 
00231         bool operator==(const GFq_BivariatePolynomial& polynomial) const;
00232         bool operator!=(const GFq_BivariatePolynomial& polynomial) const;
00233 
00240         GFq_Element operator()(const GFq_Element& x_value, const GFq_Element& y_value) const;
00241 
00248         GFq_BivariatePolynomial operator()(const GFq_BivariatePolynomial& P, const GFq_BivariatePolynomial& Q) const;
00249 
00254         GFq_Polynomial get_X_0() const;
00255         
00260         GFq_Polynomial get_0_Y() const;
00261 
00265     bool is_in_X() const;
00266     
00270     bool is_in_Y() const;
00271     
00276         GFq_BivariatePolynomial& make_star();
00277 
00284         GFq_BivariatePolynomial& make_dHasse(unsigned int mu, unsigned int nu);
00285 
00289         friend std::ostream& operator <<(std::ostream& os, const GFq_BivariatePolynomial& polynomial);
00290 
00291 protected:
00292 
00293         GFq_Polynomial get_v_0(bool x_terms) const;
00294         bool is_in_v(bool x_terms) const;
00295 
00299         static void product(std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial>& prod_monomials,
00300                         const std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial>& a_monomials,
00301                         const std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial>& b_monomials);
00302 
00306         static void product(std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial>& prod_monomials,
00307                         const GFq_Element& v,
00308                         const std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial>& a_monomials,
00309                         const std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial>& b_monomials);
00310 
00314         static void add_monomial(std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial>& monomials,
00315                         const GFq_BivariateMonomialKeyValueRepresentation& a);
00316 
00320         static void add_monomial(std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial>& monomials,
00321                         const GFq_Element& coeff,
00322                         unsigned int x_pow,
00323                         unsigned int y_pow);
00324 
00325         std::pair<unsigned int, unsigned int> weights; //<! weights for weighted degree ordering
00326         std::map<GFq_BivariateMonomialExponents, GFq_Element, GFq_WeightedRevLex_BivariateMonomial> monomials; //<! set of monomials
00327 };
00328 
00332 void simplify(GFq_BivariatePolynomial& polynomial);
00333 
00334 GFq_BivariatePolynomial operator +(const GFq_BivariatePolynomial& a, const GFq_BivariatePolynomial& b);
00335 GFq_BivariatePolynomial operator +(const GFq_BivariatePolynomial& a, const GFq_Element& b);
00336 GFq_BivariatePolynomial operator +(const GFq_Element& a, const GFq_BivariatePolynomial& b);
00337 GFq_BivariatePolynomial operator -(const GFq_BivariatePolynomial& a, const GFq_BivariatePolynomial& b);
00338 GFq_BivariatePolynomial operator -(const GFq_BivariatePolynomial& a, const GFq_Element& b);
00339 GFq_BivariatePolynomial operator -(const GFq_Element& a, const GFq_BivariatePolynomial& b);
00340 GFq_BivariatePolynomial operator *(const GFq_BivariatePolynomial& a, const GFq_BivariatePolynomial& b);
00341 GFq_BivariatePolynomial operator *(const GFq_BivariatePolynomial& a, const GFq_BivariateMonomial& b);
00342 GFq_BivariatePolynomial operator *(const GFq_BivariatePolynomial& a, const GFq_Element& b);
00343 GFq_BivariatePolynomial operator *(const GFq_Element& a, const GFq_BivariatePolynomial& b);
00344 GFq_BivariatePolynomial operator /(const GFq_BivariatePolynomial& a, const GFq_BivariateMonomial& b);
00345 GFq_BivariatePolynomial operator /(const GFq_BivariatePolynomial& a, const GFq_Element& b);
00346 GFq_BivariatePolynomial operator ^(const GFq_BivariatePolynomial& a, unsigned int n);
00347 
00353 GFq_BivariatePolynomial star(const GFq_BivariatePolynomial& a);
00354 
00362 GFq_BivariatePolynomial dHasse(unsigned int mu, unsigned int nu, const GFq_BivariatePolynomial& a);
00363 
00364 } // namespace gf
00365 } // namespace rssoft
00366 
00367 #endif // __GFQ_BIVARIATE_POLYNOMIAL_H__
 All Classes Namespaces Files Functions Variables Typedefs Friends Defines