From 72666ba31d40d122bc841e0ee191067c15b9de7a Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Sat, 9 Dec 2006 21:18:03 +0100 Subject: [PATCH] genfun: add short_rat::normalize --- barvinok/genfun.h | 1 + genfun.cc | 39 +++++++++++++++++++++++---------------- 2 files changed, 24 insertions(+), 16 deletions(-) diff --git a/barvinok/genfun.h b/barvinok/genfun.h index 1c9fe55..fc3a45e 100644 --- a/barvinok/genfun.h +++ b/barvinok/genfun.h @@ -31,6 +31,7 @@ struct short_rat { bool reduced(); short_rat(Value c); short_rat(const QQ& c, const vec_ZZ& num, const mat_ZZ& den); + void normalize(); }; struct gen_fun { diff --git a/genfun.cc b/genfun.cc index b64777e..47db7de 100644 --- a/genfun.cc +++ b/genfun.cc @@ -65,6 +65,29 @@ short_rat::short_rat(const QQ& c, const vec_ZZ& num, const mat_ZZ& den) n.power.SetDims(1, num.length()); n.power[0] = num; d.power = den; + normalize(); +} + +void short_rat::normalize() +{ + /* Make all powers in denominator lexico-positive */ + for (int i = 0; i < d.power.NumRows(); ++i) { + int j; + for (j = 0; j < d.power.NumCols(); ++j) + if (d.power[i][j] != 0) + break; + assert(j < d.power.NumCols()); + if (d.power[i][j] < 0) { + d.power[i] = -d.power[i]; + for (int k = 0; k < n.coeff.length(); ++k) { + n.coeff[k].n = -n.coeff[k].n; + n.power[k] += d.power[i]; + } + } + } + + /* Order powers in denominator */ + lex_order_rows(d.power); } void short_rat::add(short_rat *r) @@ -148,22 +171,6 @@ void gen_fun::add(const QQ& c, const vec_ZZ& num, const mat_ZZ& den) short_rat * r = new short_rat(c, num, den); - /* Make all powers in denominator lexico-positive */ - for (int i = 0; i < r->d.power.NumRows(); ++i) { - int j; - for (j = 0; j < r->d.power.NumCols(); ++j) - if (r->d.power[i][j] != 0) - break; - if (r->d.power[i][j] < 0) { - r->d.power[i] = -r->d.power[i]; - r->n.coeff[0].n = -r->n.coeff[0].n; - r->n.power[0] += r->d.power[i]; - } - } - - /* Order powers in denominator */ - lex_order_rows(r->d.power); - for (int i = 0; i < term.size(); ++i) if (lex_cmp(term[i]->d.power, r->d.power) == 0) { term[i]->add(r); -- 2.11.4.GIT