![]() |
rssoft
0.0.0
Reed-Solomon codes library with soft decision decoding
|
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__