Skip to content

Commit

Permalink
Changed gf_monic method
Browse files Browse the repository at this point in the history
  • Loading branch information
nishnik committed Aug 19, 2016
1 parent 2b70549 commit 695b633
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 22 deletions.
25 changes: 11 additions & 14 deletions symengine/fields.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -316,10 +316,10 @@ GaloisFieldDict GaloisFieldDict::gf_pow(const unsigned int n) const
}
}

void GaloisFieldDict::gf_monic(integer_class &res,
const Ptr<GaloisFieldDict> &monic) const
integer_class GaloisFieldDict::gf_monic(const Ptr<GaloisFieldDict> &monic) const
{
*monic = static_cast<GaloisFieldDict>(*this);
integer_class res;
if (dict_.empty()) {
res = integer_class(0);
} else {
Expand All @@ -334,6 +334,7 @@ void GaloisFieldDict::gf_monic(integer_class &res,
}
}
}
return res;
}

GaloisFieldDict GaloisFieldDict::gf_gcd(const GaloisFieldDict &o) const
Expand All @@ -347,8 +348,7 @@ GaloisFieldDict GaloisFieldDict::gf_gcd(const GaloisFieldDict &o) const
f %= g; // f, g = f % g, g
f.dict_.swap(g.dict_);
}
integer_class temp_LC;
f.gf_monic(temp_LC, outArg(f));
f.gf_monic(outArg(f));
return f;
}

Expand All @@ -370,8 +370,8 @@ void GaloisFieldDict::gf_gcdex(const GaloisFieldDict &f,
}
integer_class p0, p1;
GaloisFieldDict r0, r1;
f.gf_monic(p0, outArg(r0));
g.gf_monic(p1, outArg(r1));
p0 = f.gf_monic(outArg(r0));
p1 = g.gf_monic(outArg(r1));
if (f.dict_.empty()) {
integer_class inv;
mp_invert(inv, p1, f.modulo_);
Expand Down Expand Up @@ -401,7 +401,7 @@ void GaloisFieldDict::gf_gcdex(const GaloisFieldDict &f,
break;
r0 = r1;
integer_class lc, inv;
R.gf_monic(lc, outArg(r1));
lc = R.gf_monic(outArg(r1));
mp_invert(inv, lc, f.modulo_);

s0 = (s0 - s1 * Q) * inv;
Expand All @@ -425,8 +425,7 @@ GaloisFieldDict GaloisFieldDict::gf_lcm(const GaloisFieldDict &o) const
GaloisFieldDict out, temp_out;
out = o * (*this);
out /= gf_gcd(o);
integer_class temp_LC;
out.gf_monic(temp_LC, outArg(out));
out.gf_monic(outArg(out));
return out;
}

Expand Down Expand Up @@ -469,9 +468,8 @@ bool GaloisFieldDict::gf_is_sqf() const
{
if (dict_.empty())
return true;
integer_class LC;
GaloisFieldDict monic;
gf_monic(LC, outArg(monic));
gf_monic(outArg(monic));
monic = monic.gf_gcd(monic.gf_diff());
return monic.is_one();
}
Expand All @@ -485,9 +483,8 @@ GaloisFieldDict::gf_sqf_list() const
unsigned n = 1;
unsigned r = mp_get_ui(modulo_);
bool sqf = false;
integer_class LC;
GaloisFieldDict f;
gf_monic(LC, outArg(f));
gf_monic(outArg(f));
while (true) {
GaloisFieldDict F = f.gf_diff();
if (not F.dict_.empty()) {
Expand Down Expand Up @@ -914,7 +911,7 @@ GaloisFieldDict::gf_factor() const
integer_class lc;
std::set<std::pair<GaloisFieldDict, unsigned>, DictLess> factors;
GaloisFieldDict monic;
gf_monic(lc, outArg(monic));
lc = gf_monic(outArg(monic));
if (monic.degree() < 1)
return std::make_pair(lc, factors);
std::vector<std::pair<GaloisFieldDict, unsigned>> sqf_list
Expand Down
2 changes: 1 addition & 1 deletion symengine/fields.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ class GaloisFieldDict
const Ptr<GaloisFieldDict> &rem) const;
GaloisFieldDict gf_sqr() const;
GaloisFieldDict gf_pow(const unsigned int n) const;
void gf_monic(integer_class &res, const Ptr<GaloisFieldDict> &monic) const;
integer_class gf_monic(const Ptr<GaloisFieldDict> &monic) const;
GaloisFieldDict gf_gcd(const GaloisFieldDict &o) const;
static void gf_gcdex(const GaloisFieldDict &f, const GaloisFieldDict &g,
const Ptr<GaloisFieldDict> &s,
Expand Down
3 changes: 1 addition & 2 deletions symengine/polys/uintpoly.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,7 @@ std::set<RCP<const UIntPoly>, RCPBasicKeyLess> UIntPoly::zz_zassenhaus() const
auto F = GaloisFieldDict(this->poly_.dict_, i);
if (not F.gf_is_sqf())
continue;
integer_class temp;
F.gf_monic(temp, outArg(F));
F.gf_monic(outArg(F));
auto fsqfx = F.gf_zassenhaus();
if (fsqfx.size() < fsqf.second.size() or fsqf.second.empty()) {
fsqf.first = i;
Expand Down
10 changes: 5 additions & 5 deletions symengine/tests/basic/test_fields.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -335,28 +335,28 @@ TEST_CASE("GaloisFieldDict Division, GCD, LCM, Shifts : Basic", "[basic]")
integer_class LC;
a = {};
d1 = GaloisFieldDict::from_vec(a, 11_z);
d1.gf_monic(LC, outArg(d2));
LC = d1.gf_monic(outArg(d2));
REQUIRE(LC == 0_z);
REQUIRE(d2 == d1);
a = {1_z};
d1 = GaloisFieldDict::from_vec(a, 11_z);
d1.gf_monic(LC, outArg(d2));
LC = d1.gf_monic(outArg(d2));
REQUIRE(LC == 1_z);
REQUIRE(d2 == d1);
a = {2_z};
d1 = GaloisFieldDict::from_vec(a, 11_z);
d1.gf_monic(LC, outArg(d2));
LC = d1.gf_monic(outArg(d2));
REQUIRE(LC == 2_z);
mp = d2.get_dict();
REQUIRE(mp[0] == 1_z);
a = {4_z, 3_z, 2_z, 1_z};
d1 = GaloisFieldDict::from_vec(a, 11_z);
d1.gf_monic(LC, outArg(d2));
LC = d1.gf_monic(outArg(d2));
REQUIRE(LC == 1_z);
REQUIRE(d2 == d1);
a = {5_z, 4_z, 3_z, 2_z};
d1 = GaloisFieldDict::from_vec(a, 11_z);
d1.gf_monic(LC, outArg(d2));
LC = d1.gf_monic(outArg(d2));
REQUIRE(LC == 2_z);
mp = d2.get_dict();
REQUIRE(mp[0] == 8);
Expand Down

0 comments on commit 695b633

Please sign in to comment.