![]() |
rssoft
0.0.0
Reed-Solomon codes library with soft decision decoding
|
Roth-Ruckenstein's factorization. More...
#include <RR_Factorization.h>

Public Member Functions | |
| RR_Factorization (const gf::GFq &_gf, unsigned int _k) | |
| ~RR_Factorization () | |
| void | init () |
| void | set_verbosity (unsigned int _verbosity) |
| std::vector< gf::GFq_Polynomial > & | run (const gf::GFq_BivariatePolynomial &polynomial) |
Protected Member Functions | |
| gf::GFq_Polynomial | node_run (RR_Node &rr_node) |
Protected Attributes | |
| const gf::GFq & | gf |
| Reference to the Galois Field being used. | |
| unsigned int | k |
| k as in RS(n,k) | |
| unsigned int | verbosity |
| verbosity level, 0 for none | |
| unsigned int | t |
| nodes but root node count | |
| std::vector< gf::GFq_Polynomial > | F |
| Result list of f(X) polynomials. | |
Roth-Ruckenstein's factorization.
| rssoft::RR_Factorization::RR_Factorization | ( | const gf::GFq & | _gf, |
| unsigned int | _k | ||
| ) |
Destructor
{
}
| void rssoft::RR_Factorization::init | ( | ) |
| gf::GFq_Polynomial rssoft::RR_Factorization::node_run | ( | RR_Node & | rr_node | ) | [protected] |
Recursive run on a node
| rr_node | The node |
{
gf::GFq_BivariatePolynomial Qu = rr_node.getQ();
gf::GFq_Polynomial Qy = Qu.get_0_Y();
std::vector<rssoft::gf::GFq_Element> roots_y;
Qy.rootChien(roots_y);
std::vector<rssoft::gf::GFq_Element>::const_iterator ry_it = roots_y.begin();
DEBUG_OUT(verbosity > 0, "*** Node #" << rr_node.get_id() << ": " << rr_node.get_degree() << " " << rr_node.get_coeff() << std::endl);
if (ry_it != roots_y.end())
{
const gf::GFq& gf = ry_it->field();
gf::GFq_BivariatePolynomial X1Y0(Qu.get_weights());
X1Y0.init_x_pow(gf, 1); // X1Y0(X,Y) = X
rssoft::gf::GFq_BivariateMonomial m_XY(rssoft::gf::GFq_Element(gf,1),1,1); // X*Y
std::vector<gf::GFq_Element> poly_X1;
poly_X1.push_back(gf::GFq_Element(gf,0));
poly_X1.push_back(gf::GFq_Element(gf,1));
gf::GFq_Polynomial X1(gf, poly_X1); // X1(X) = X
for (; ry_it != roots_y.end(); ++ry_it)
{
if (!rr_node.is_in_ry_set(*ry_it))
{
rr_node.add_ry(*ry_it);
gf::GFq_BivariatePolynomial Yv(Qu.get_weights()); // Yv(X,Y) = X*Y + ry
std::vector<rssoft::gf::GFq_BivariateMonomial> monos_Yv;
rssoft::gf::GFq_BivariateMonomial m_ry(*ry_it,0,0);
monos_Yv.push_back(m_ry);
monos_Yv.push_back(m_XY);
Yv.init(monos_Yv);
gf::GFq_BivariatePolynomial Qv = star(Qu(X1Y0,Yv));
DEBUG_OUT(verbosity > 0, " ry = " << *ry_it << " : Qv = " << Qv << std::endl);
// Optimization: anticipate behaviour at child node
bool Qv_for_Y_eq_0_is_0 = (Qv.get_X_0().is_zero()); // Qv(Y=0) = 0
if (Qv_for_Y_eq_0_is_0) // Qv(Y=0) = 0
{
if (rr_node.get_degree() < k-1)
{ // trace back this route from node v
DEBUG_OUT(verbosity > 1, " -> trace back this route from node v: " << (rr_node.get_coeff()*(X1^rr_node.get_degree()))+(*ry_it*(X1^(rr_node.get_degree()+1))) << std::endl);
return (rr_node.get_coeff()*(X1^rr_node.get_degree()))+(*ry_it*(X1^(rr_node.get_degree()+1)));
}
else
{ // trace back this route from node u
DEBUG_OUT(verbosity > 1, " -> trace back this route from node u: " << rr_node.get_coeff()*(X1^rr_node.get_degree()) << std::endl);
return rr_node.get_coeff()*(X1^rr_node.get_degree());
}
}
else if ((rr_node.get_degree() == k-1) && !Qv_for_Y_eq_0_is_0)
{
DEBUG_OUT(verbosity > 1, " -> invalidate the route by returning an invalid polynomial" << std::endl);
return gf::GFq_Polynomial(gf); // invalidate the route by returning an invalid polynomial
}
else
{ // construct a child node
t++;
DEBUG_OUT(verbosity > 1, " child #" << t << std::endl);
RR_Node child_node(&rr_node, Qv, *ry_it, t);
gf::GFq_Polynomial part_Fv = node_run(child_node); // Recursive call
if (rr_node.get_degree() == -1) // we are at the root node
{
DEBUG_OUT(verbosity > 0, " we are at root node" << std::endl);
if (part_Fv.is_valid())
{
DEBUG_OUT(verbosity > 0, " Fi = " << part_Fv << std::endl);
F.push_back(part_Fv); // collect result
}
}
else
{
if (!part_Fv.is_valid())
{
DEBUG_OUT(verbosity > 1, " -> propagate invalid route" << std::endl);
return part_Fv;
}
else
{
DEBUG_OUT(verbosity > 1, " -> return partial polynomial: " << ((rr_node.get_coeff()*(X1^rr_node.get_degree())) + part_Fv) << std::endl);
return (rr_node.get_coeff()*(X1^rr_node.get_degree())) + part_Fv;
}
}
}
}
}
}
return gf::GFq_Polynomial(gf);
}

| std::vector< gf::GFq_Polynomial > & rssoft::RR_Factorization::run | ( | const gf::GFq_BivariatePolynomial & | polynomial | ) |
Run factorization of given polynomial
| polynomial | Input polynomial |
{
if (!polynomial.is_valid())
{
throw RSSoft_Exception("Invalid polynomial");
}
else
{
const gf::GFq& gf = polynomial.get_leading_monomial().coeff().field();
RR_Node u(0, polynomial, gf::GFq_Element(gf,0), t);
node_run(u);
return F;
}
}

| void rssoft::RR_Factorization::set_verbosity | ( | unsigned int | _verbosity | ) | [inline] |
Set verbosity level, 0 for none. This is active only in debug mode (CPPFLAGS=-D_DEBUG)
{
verbosity = _verbosity;
}
std::vector<gf::GFq_Polynomial> rssoft::RR_Factorization::F [protected] |
Result list of f(X) polynomials.
const gf::GFq& rssoft::RR_Factorization::gf [protected] |
Reference to the Galois Field being used.
unsigned int rssoft::RR_Factorization::k [protected] |
k as in RS(n,k)
unsigned int rssoft::RR_Factorization::t [protected] |
nodes but root node count
unsigned int rssoft::RR_Factorization::verbosity [protected] |
verbosity level, 0 for none