[mathicgb] 209/393: Added division and divisibility code to MonoMonoid along with tests.
Doug Torrance
dtorrance-guest at moszumanska.debian.org
Fri Apr 3 15:59:02 UTC 2015
This is an automated email from the git hooks/post-receive script.
dtorrance-guest pushed a commit to branch upstream
in repository mathicgb.
commit 5211880cf477782a103235ae911ced5c986ea1e7
Author: Bjarke Hammersholt Roune <bjarkehr.code at gmail.com>
Date: Fri Mar 29 14:30:49 2013 +0100
Added division and divisibility code to MonoMonoid along with tests.
---
src/mathicgb/MonoMonoid.hpp | 40 ++++++++++++++++++++++++++++
src/test/MonoMonoid.cpp | 64 ++++++++++++++++++++++++++++++++++-----------
2 files changed, 89 insertions(+), 15 deletions(-)
diff --git a/src/mathicgb/MonoMonoid.hpp b/src/mathicgb/MonoMonoid.hpp
index 0ccaa02..db7182d 100755
--- a/src/mathicgb/MonoMonoid.hpp
+++ b/src/mathicgb/MonoMonoid.hpp
@@ -167,6 +167,14 @@ public:
return std::all_of(begin(mono), end(mono), [](Exponent e) {return e == 0;});
}
+ /// Returns true if a divides b. Equal monomials divide each other.
+ bool divides(ConstMonoRef a, ConstMonoRef b) const {
+ for (auto var = 0; var < varCount(); ++var)
+ if (exponent(a, var) > exponent(b, var))
+ return false;
+ return true;
+ }
+
// Graded reverse lexicographic order. The grading is total degree.
CompareResult compare(ConstMonoRef a, ConstMonoRef b) const {
MATHICGB_ASSERT(debugOrderValid(a));
@@ -234,6 +242,38 @@ public:
MATHICGB_ASSERT(debugValid(prod));
}
+ void multiplyInPlace(ConstMonoRef a, MonoRef prod) const {
+ MATHICGB_ASSERT(debugValid(a));
+ MATHICGB_ASSERT(debugValid(prod));
+
+ for (auto i = 0; i < entryCount(); ++i)
+ access(prod, i) += access(a, i);
+
+ MATHICGB_ASSERT(debugValid(prod));
+ }
+
+ void divide(ConstMonoRef by, ConstMonoRef num, MonoRef quo) const {
+ MATHICGB_ASSERT(divides(by, num));
+ MATHICGB_ASSERT(debugValid(num));
+ MATHICGB_ASSERT(debugValid(by));
+
+ for (auto i = 0; i < entryCount(); ++i)
+ access(quo, i) = access(num, i) - access(by, i);
+
+ MATHICGB_ASSERT(debugValid(quo));
+ }
+
+ void divideInPlace(ConstMonoRef by, MonoRef num) const {
+ MATHICGB_ASSERT(divides(by, num));
+ MATHICGB_ASSERT(debugValid(by));
+ MATHICGB_ASSERT(debugValid(num));
+
+ for (auto i = 0; i < entryCount(); ++i)
+ access(num, i) -= access(by, i);
+
+ MATHICGB_ASSERT(debugValid(num));
+ }
+
/// Parses a monomial out of a string. Valid examples: 1 abc a2bc
/// aA. Variable names are case sensitive. Whitespace terminates the
/// parse as does any other character that is not a letter or a
diff --git a/src/test/MonoMonoid.cpp b/src/test/MonoMonoid.cpp
index 3d3f024..ee167dc 100755
--- a/src/test/MonoMonoid.cpp
+++ b/src/test/MonoMonoid.cpp
@@ -308,12 +308,12 @@ TEST(MonoMonoid, ParsePrintM2) {
ASSERT_EQ(v, v2);
}
-TEST(MonoMonoid, Product) {
+TEST(MonoMonoid, MultiplyDivide) {
typedef MonoMonoid<int32> Monoid;
Monoid m(49);
Monoid::MonoPool pool(m);
auto mono = pool.alloc();
- auto checkProd = [&](const char* str) {
+ auto check = [&](const char* str) {
auto v = parseVector(m, str);
MATHICGB_ASSERT(v.size() == 3);
const auto& a = v.front();
@@ -322,34 +322,68 @@ TEST(MonoMonoid, Product) {
ASSERT_EQ(m.hashOfProduct(a, b), m.hash(c));
ASSERT_EQ(m.hashOfProduct(a, b), m.hashOfProduct(b, a));
+ // a*b == c using multiply
m.multiply(a, b, mono);
ASSERT_TRUE(m.equal(c, mono));
ASSERT_TRUE(m.compare(c, mono) == Monoid::EqualTo);
ASSERT_EQ(m.hash(c), m.hash(mono));
- m.multiply(b, a, mono);
+ // c/a == b using divide
+ m.divide(a, c, mono);
+ ASSERT_TRUE(m.equal(b, mono));
+ ASSERT_TRUE(m.compare(b, mono) == Monoid::EqualTo);
+ ASSERT_EQ(m.hash(b), m.hash(mono));
+
+ // c/b == a using divideInPlace
+ m.copy(c, mono);
+ m.divideInPlace(b, mono);
+ ASSERT_TRUE(m.equal(a, mono));
+ ASSERT_TRUE(m.compare(a, mono) == Monoid::EqualTo);
+ ASSERT_EQ(m.hash(a), m.hash(mono));
+
+ // a*b == c using multiplyInPlace
+ m.copy(a, mono);
+ m.multiplyInPlace(b, mono);
ASSERT_TRUE(m.equal(c, mono));
ASSERT_TRUE(m.compare(c, mono) == Monoid::EqualTo);
ASSERT_EQ(m.hash(c), m.hash(mono));
- if (!m.isIdentity(a))
+ // check properties that mono=a*b should have
+ ASSERT_TRUE(m.divides(mono, c));
+ ASSERT_TRUE(m.divides(c, mono));
+ ASSERT_TRUE(m.divides(a, mono));
+ ASSERT_TRUE(m.divides(b, mono));
+
+ if (!m.isIdentity(a)) {
ASSERT_TRUE(m.lessThan(b, mono));
- else
+ ASSERT_FALSE(m.lessThan(mono, b));
+ ASSERT_TRUE(m.compare(mono, b) == Monoid::GreaterThan);
+ ASSERT_FALSE(m.divides(mono, b));
+ } else {
+ ASSERT_TRUE(m.equal(b, mono));
ASSERT_TRUE(m.compare(b, mono) == Monoid::EqualTo);
+ ASSERT_TRUE(m.divides(mono, b));
+ }
- if (!m.isIdentity(b))
+ if (!m.isIdentity(b)) {
ASSERT_TRUE(m.lessThan(a, mono));
- else
+ ASSERT_FALSE(m.lessThan(mono, a));
+ ASSERT_TRUE(m.compare(mono, a) == Monoid::GreaterThan);
+ ASSERT_FALSE(m.divides(mono, a));
+ } else {
+ ASSERT_TRUE(m.equal(a, mono));
ASSERT_TRUE(m.compare(a, mono) == Monoid::EqualTo);
+ ASSERT_TRUE(m.divides(mono, a));
+ }
};
- checkProd("1 1 1");
- checkProd("a 1 a");
- checkProd("1 Vx Vx");
- checkProd("aV bx abxV");
- checkProd("a a2 a3");
- checkProd("V V2 V3");
- checkProd("arlgh svug arlg2hsvu");
- checkProd("abcdefghiV ab2c3d4e5f6g7h8i9V11 a2b3c4d5e6f7g8h9i10V12");
+ check("1 1 1");
+ check("a 1 a");
+ check("1 Vx Vx");
+ check("aV bx abxV");
+ check("a a2 a3");
+ check("V V2 V3");
+ check("arlgh svug arlg2hsvu");
+ check("abcdefghiV ab2c3d4e5f6g7h8i9V11 a2b3c4d5e6f7g8h9i10V12");
}
TEST(MonoMonoid, Order) {
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/mathicgb.git
More information about the debian-science-commits
mailing list