/** Test module and polynomial and module list. */
  public void testModulePolynomialModuleList() {
    List<List<GenPolynomial<BigRational>>> l = new ArrayList<List<GenPolynomial<BigRational>>>();
    for (int i = 0; i < 4; i++) {
      List<GenPolynomial<BigRational>> r = new ArrayList<GenPolynomial<BigRational>>();
      for (int j = 0; j < 3; j++) {
        a = pfac.random(kl, ll, el, q);
        assertTrue("length( a" + i + " ) <> 0", a.length() >= 0);
        assertTrue(" not isZERO( a" + i + " )", !a.isZERO());
        assertTrue(" not isONE( a" + i + " )", !a.isONE());
        r.add(a);
      }
      l.add(r);
    }
    m = new ModuleList<BigRational>(pfac, l);
    // System.out.println("m = "+m);
    assertTrue("m == m", m.equals(m));
    assertEquals("m.length", 4, m.list.size());

    p = m.getPolynomialList();
    // System.out.println("p = "+p);
    assertTrue("p == p", p.equals(p));
    assertEquals("p.length", 4, p.list.size());

    ModuleList<BigRational> m2 = null;
    m2 = p.getModuleList(3);
    // System.out.println("m2 = "+m2);
    assertTrue("m2 == m2", m2.equals(m2));
    assertEquals("m2.length", 4, m2.list.size());

    assertTrue("m == m2", m.equals(m2));
  }
  /** Test polynomial list. */
  public void testPolynomialList() {
    List<GenPolynomial<BigRational>> l = new ArrayList<GenPolynomial<BigRational>>();
    for (int i = 0; i < 7; i++) {
      a = pfac.random(kl, ll + i, el, q);
      assertTrue("length( a" + i + " ) <> 0", a.length() >= 0);
      assertTrue(" not isZERO( a" + i + " )", !a.isZERO());
      assertTrue(" not isONE( a" + i + " )", !a.isONE());
      l.add(a);
    }
    p = new PolynomialList<BigRational>(pfac, l);
    // System.out.println("p = "+p);

    assertTrue("p == p", p.equals(p));
    assertEquals("p.length", 7, p.list.size());
  }
 /**
  * Random solvable polynomial.
  *
  * @param k size of random coefficients.
  * @param l number of terms.
  * @param d maximal degree in each variable.
  * @param q density of nozero exponents.
  * @param rnd is a source for random bits.
  * @return a random solvable polynomial.
  */
 @Override
 public GenSolvablePolynomial<C> random(int k, int l, int d, float q, Random rnd) {
   GenSolvablePolynomial<C> r = getZERO(); // .clone();
   // copy( ZERO );
   // new GenPolynomial<C>( this, getZERO().val );
   ExpVector e;
   C a;
   // add random coeffs and exponents
   for (int i = 0; i < l; i++) {
     e = ExpVector.EVRAND(nvar, d, q, rnd);
     a = coFac.random(k, rnd);
     r = (GenSolvablePolynomial<C>) r.sum(a, e);
     // somewhat inefficient but clean
   }
   return r;
 }
 /**
  * Query if this ring is associative. Test if the relations define an associative solvable ring.
  *
  * @return true, if this ring is associative, else false.
  */
 @Override
 public boolean isAssociative() {
   GenSolvablePolynomial<C> Xi, Xj, Xk, p, q;
   for (int i = 0; i < nvar; i++) {
     Xi = univariate(i);
     for (int j = i + 1; j < nvar; j++) {
       Xj = univariate(j);
       for (int k = j + 1; k < nvar; k++) {
         Xk = univariate(k);
         p = Xk.multiply(Xj).multiply(Xi);
         q = Xk.multiply(Xj.multiply(Xi));
         if (!p.equals(q)) {
           if (true || debug) {
             logger.info("Xi = " + Xi + ", Xj = " + Xj + ", Xk = " + Xk);
             logger.info("p = ( Xk * Xj ) * Xi = " + p);
             logger.info("q = Xk * ( Xj * Xi ) = " + q);
           }
           return false;
         }
       }
     }
   }
   return coFac.isAssociative();
 }
  /** Test module and polynomial and module and polynomial list with WeylRelations. */
  public void testWeylModulePolynomialModuleListPolynomial() {
    int rloc = 4;
    pfac = new GenSolvablePolynomialRing<BigRational>(cfac, rloc);

    RelationGenerator<BigRational> wl = new WeylRelations<BigRational>();
    wl.generate(pfac);
    RelationTable table1 = pfac.table;
    RelationTable table2 = null;
    RelationTable table3 = null;
    RelationTable table4 = null;
    RelationTable table5 = null;
    // System.out.println("table 1 = " + table1);
    // System.out.println("ring = " + ring);

    List<List<GenPolynomial<BigRational>>> l = new ArrayList<List<GenPolynomial<BigRational>>>();
    for (int i = 0; i < 4; i++) {
      List<GenPolynomial<BigRational>> r = new ArrayList<GenPolynomial<BigRational>>();
      for (int j = 0; j < 3; j++) {
        a = pfac.random(kl, ll, el, q);
        assertTrue("length( a" + i + " ) <> 0", a.length() >= 0);
        assertTrue(" not isZERO( a" + i + " )", !a.isZERO());
        assertTrue(" not isONE( a" + i + " )", !a.isONE());
        r.add(a);
      }
      l.add(r);
    }
    m = new ModuleList<BigRational>(pfac, l);
    // System.out.println("m = "+m);
    assertTrue("m == m", m.equals(m));
    assertEquals("m.length", 4, m.list.size());

    table2 = ((GenSolvablePolynomialRing<BigRational>) m.ring).table;
    // System.out.println("table 2 = " + table2);
    assertEquals("table1 == table2", table1, table2);

    p = m.getPolynomialList();
    // System.out.println("p = "+p);
    assertTrue("p == p", p.equals(p));
    assertEquals("p.length", 4, p.list.size());

    table3 = ((GenSolvablePolynomialRing<BigRational>) p.ring).table;
    // System.out.println("table 3 = " + table3);

    ModuleList<BigRational> m2 = null;
    m2 = p.getModuleList(3);
    // System.out.println("m2 = "+m2);
    assertTrue("m2 == m2", m2.equals(m2));
    assertEquals("m2.length", 4, m2.list.size());

    assertTrue("m == m2", m.equals(m2));

    table4 = ((GenSolvablePolynomialRing<BigRational>) m2.ring).table;
    // System.out.println("table 4 = " + table4);
    assertEquals("table2 == table4", table2, table4);
    assertEquals("table1 == table4", table1, table4);

    PolynomialList<BigRational> p2 = null;
    p2 = m2.getPolynomialList();
    // System.out.println("p2 = "+p2);
    assertTrue("p2 == p2", p2.equals(p2));
    assertEquals("p2.length", 4, p2.list.size());

    assertTrue("p == p2", p.list.equals(p2.list));
    table5 = ((GenSolvablePolynomialRing<BigRational>) p2.ring).table;
    // System.out.println("table 5= " + table5);
    assertEquals("table2 == table4", table3.table, table5.table);
  }