Beispiel #1
0
TEST(F4MatrixBuilder, SPair) {
  for (int threadCount = 1; threadCount < 4; ++threadCount) {
    mgb::mtbb::task_scheduler_init scheduler(threadCount);
    BuilderMaker maker;
    const Poly& p1 = maker.addBasisElement("a4c2-d");
    const Poly& p2 = maker.addBasisElement("a4b+d");
    // S-pair of p1 and p2 is -c2d-bd
    const Poly& p3 = maker.addBasisElement("c2d+3");
    F4MatrixBuilder& builder = maker.create();
    builder.addSPolynomialToMatrix(p1, p2);
    QuadMatrix qm;
    builder.buildMatrixAndClear(qm);
    const char* const str1 = 
      "Left columns: c2d\n"
      "Right columns: bd 1\n"
      "0: 0#1   | 0: 1#3  \n"
      "         |         \n"
      "0: 0#100 | 0: 0#100\n";
    const char* const str2 = 
      "Left columns: c2d\n"
      "Right columns: bd 1\n"
      "0: 0#1 | 0: 0#1\n"
      "       |       \n"
      "0: 0#1 | 0: 1#3\n";
    std::string qmStr = qm.toString();
    ASSERT_TRUE(str1 == qmStr || str2 == qmStr) <<
      "\n** str1: " << str1 << "\n** qm: " << qmStr;
  }
}
Beispiel #2
0
TEST(F4MatrixBuilder, Empty) {
  for (int threadCount = 1; threadCount < 4; ++threadCount) {
    mgb::mtbb::task_scheduler_init scheduler(threadCount);
    BuilderMaker maker;
    F4MatrixBuilder& builder = maker.create();

    QuadMatrix matrix;
    builder.buildMatrixAndClear(matrix);
    ASSERT_EQ(0, matrix.topLeft.rowCount());
    ASSERT_EQ(0, matrix.bottomLeft.rowCount());
    ASSERT_EQ(0, matrix.topLeft.computeColCount());
    ASSERT_EQ(0, matrix.topRight.computeColCount());
    ASSERT_EQ(0, matrix.leftColumnMonomials.size());
    ASSERT_EQ(0, matrix.rightColumnMonomials.size());
  }
}
Beispiel #3
0
TEST(F4MatrixBuilder, OneByOne) {
  for (int threadCount = 1; threadCount < 4; ++threadCount) {
    mgb::mtbb::task_scheduler_init scheduler(threadCount);
    BuilderMaker maker;
    const Poly& p = maker.addBasisElement("a");
    F4MatrixBuilder& builder = maker.create();
    builder.addPolynomialToMatrix(p.getLeadMonomial(), p);
    QuadMatrix qm;
    builder.buildMatrixAndClear(qm);
    const char* str = 
      "Left columns: a2\n"
      "Right columns:\n"
      "0: 0#1 | 0:\n"
      "       |   \n"
      "0: 0#1 | 0:\n";
    ASSERT_EQ(str, qm.toString()) << "** qm:\n" << qm;
  }
}
Beispiel #4
0
TEST(F4MatrixBuilder, IteratedReducer) {
  for (int threadCount = 1; threadCount < 4; ++threadCount) {
    BuilderMaker maker;
    const Poly& p1 = maker.addBasisElement("a4-a3");
    const Poly& p2 = maker.addBasisElement("a-1");
    F4MatrixBuilder& builder = maker.create();
    builder.addPolynomialToMatrix(p1.getLeadMonomial(), p2);
    QuadMatrix qm;
    builder.buildMatrixAndClear(qm);
    const char* str = 
      "Left columns: a5 a4 a3 a2 a\n"
      "Right columns: 1\n"
      "0: 4#1       | 0: 0#100\n"
      "1: 3#1 4#100 | 1:      \n"
      "2: 2#1 3#100 | 2:      \n"
      "3: 1#1 2#100 | 3:      \n"
      "4: 0#1 1#100 | 4:      \n"
      "             |         \n"
      "0: 0#1 1#100 | 0:      \n";
    ASSERT_EQ(str, qm.toCanonical().toString()) << "** qm:\n" << qm;
  }
}
Beispiel #5
0
TEST(F4MatrixBuilder, DirectReducers) {
  for (int threadCount = 1; threadCount < 4; ++threadCount) {
    BuilderMaker maker;
    maker.addBasisElement("a6"); // reducer == to lead term
    maker.addBasisElement("a3b2+a3c"); // reducer == to lower order term
    maker.addBasisElement("c"); // reducer divides
    maker.addBasisElement("d2"); // does not divide
    F4MatrixBuilder& builder = maker.create();

    Poly p1(builder.ring());
    { 
      std::istringstream in("a3+b2+c+d");
      Scanner scanner(in);
      p1 = MathicIO<>().readPoly(builder.ring(), false, scanner);
      builder.addPolynomialToMatrix(p1.leadMono(), p1);
    }

    Poly p2(builder.ring());
    {
      std::istringstream in("a3+2b2+3c+4d");
      Scanner scanner(in);
      p2 = MathicIO<>().readPoly(builder.ring(), false, scanner);
      builder.addPolynomialToMatrix(p2.leadMono(), p2);
    }

    QuadMatrix qm(builder.ring());
    builder.buildMatrixAndClear(qm);

    const char* str =
      "Left columns: a6 a3b2 a3c\n"
      "Right columns: a3d\n"
      "0: 2#1         | 0:    \n"
      "1: 1#1 2#1     | 1:    \n"
      "2: 0#1         | 2:    \n"
      "               |       \n"
      "0: 0#1 1#1 2#1 | 0: 0#1\n"
      "1: 0#1 1#2 2#3 | 1: 0#4\n";
    qm = qm.toCanonical();
    ASSERT_EQ(str, qm.toString()) << "** qm:\n" << qm;
  }
}