/** Test object multiplication. */
  public void testMultiplication() {

    a = fac.random(ll);
    assertTrue("not isZERO( a )", !a.isZERO());

    b = fac.random(ll);
    assertTrue("not isZERO( b )", !b.isZERO());

    c = b.multiply(a);
    d = a.multiply(b);
    assertTrue("not isZERO( c )", !c.isZERO());
    assertTrue("not isZERO( d )", !d.isZERO());

    // System.out.println("a = " + a);
    // System.out.println("b = " + b);
    e = d.subtract(c);
    assertTrue("!isZERO( a*b-b*a ) " + e, !e.isZERO());

    assertTrue("a*b = b*a", !c.equals(d));
    // assertEquals("a*b = b*a",c,d);

    c = fac.random(ll);
    // System.out.println("c = " + c);
    d = a.multiply(b.multiply(c));
    e = (a.multiply(b)).multiply(c);

    // System.out.println("d = " + d);
    // System.out.println("e = " + e);

    // System.out.println("d-e = " + d.subtract(c) );

    assertEquals("a(bc) = (ab)c", d, e);
    assertTrue("a(bc) = (ab)c", d.equals(e));

    BigQuaternion x = a.leadingBaseCoefficient().inverse();
    c = a.monic();
    d = a.multiply(x);
    assertEquals("a.monic() = a(1/ldcf(a))", c, d);

    BigQuaternion y = b.leadingBaseCoefficient().inverse();
    c = b.monic();
    d = b.multiply(y);
    assertEquals("b.monic() = b(1/ldcf(b))", c, d);

    e = new GenPolynomial<BigQuaternion>(fac, y);
    d = b.multiply(e);
    assertEquals("b.monic() = b(1/ldcf(b))", c, d);

    // d = e.multiply(b);
    // assertEquals("b.monic() = (1/ldcf(b) (0))*b",c,d);
  }
  /** Test weight homogeneous. */
  public void testWeightHomogeneous() {
    // rational numbers
    BigRational rf = new BigRational();
    // System.out.println("rf = " + rf);

    // weight term order
    long[] weight = new long[] {2, 3, 4, 5};
    TermOrder to = TermOrderByName.weightOrder(weight);
    // System.out.println("to = " + to);

    // polynomials over rational numbers
    GenPolynomialRing<BigRational> pf = new GenPolynomialRing<BigRational>(rf, 4, to);
    // System.out.println("pf = " + pf.toScript());

    // test 1
    GenPolynomial<BigRational> p = pf.getONE();
    // System.out.println("p = " + p);
    assertTrue("1 is weight homogeneous " + p, p.isWeightHomogeneous());

    // test 0
    p = pf.getZERO();
    // System.out.println("p = " + p);
    assertTrue("0 is weight homogeneous " + p, p.isWeightHomogeneous());

    // test random
    p = pf.random(kl, 3 * ll, el, q);
    // System.out.println("p = " + p);
    assertFalse("rnd is weight homogeneous " + p, p.isWeightHomogeneous());

    GenPolynomial<BigRational> pl = p.leadingWeightPolynomial();
    // System.out.println("pl = " + pl);
    assertTrue("lw(rnd) is weight homogeneous " + pl, pl.isWeightHomogeneous());

    GenPolynomial<BigRational> r = pf.random(kl, 3 * ll, el, q);
    // System.out.println("r = " + r);
    assertFalse("rnd is weight homogeneous " + r, r.isWeightHomogeneous());

    GenPolynomial<BigRational> rl = r.leadingWeightPolynomial();
    // System.out.println("rl = " + rl);
    assertTrue("lw(rnd) is weight homogeneous " + rl, rl.isWeightHomogeneous());

    GenPolynomial<BigRational> t = pl.multiply(rl);
    // System.out.println("t = " + t);
    assertTrue("lw(rnd)*lw(rnd) is weight homogeneous " + t, t.isWeightHomogeneous());
  }
  /** Test homogeneous. */
  public void testHomogeneous() {
    // rational numbers
    BigRational rf = new BigRational();
    // System.out.println("rf = " + rf);

    // polynomials over rational numbers
    GenPolynomialRing<BigRational> pf = new GenPolynomialRing<BigRational>(rf, 2); // rl);
    // System.out.println("pf = " + pf);

    // test 1
    GenPolynomial<BigRational> p = pf.getONE();
    // System.out.println("p = " + p);
    assertTrue("1 is homogeneous " + p, p.isHomogeneous());

    // test 0
    p = pf.getZERO();
    // System.out.println("p = " + p);
    assertTrue("0 is homogeneous " + p, p.isHomogeneous());

    // test random
    p = pf.random(kl, 2 * ll, el, q);
    // p = pf.random(kl,ll,el,q);
    // System.out.println("p = " + p);
    assertFalse("rnd is homogeneous " + p, p.isHomogeneous());

    // make homogeneous
    GenPolynomialRing<BigRational> pfh = pf.extend(1);
    // System.out.println("pfh = " + pfh);
    // remove block order
    TermOrder to = new TermOrder(TermOrder.IGRLEX);
    pfh = new GenPolynomialRing<BigRational>(pfh, to);
    // System.out.println("pfh = " + pfh);

    GenPolynomial<BigRational> ph = p.homogenize(pfh);
    // System.out.println("ph = " + ph);
    assertTrue("ph is homogeneous " + ph, ph.isHomogeneous());
    GenPolynomial<BigRational> ps = ph.deHomogenize(pf);
    // System.out.println("ps = " + ps);
    assertEquals("phs == p ", ps, p); // findbugs
    // System.out.println("p is homogeneous = " + p.isHomogeneous());
    // System.out.println("ph is homogeneous = " + ph.isHomogeneous());

    GenPolynomial<BigRational> s = pf.random(kl, ll, el, q);
    // System.out.println("s = " + s);
    assertFalse("rnd is homogeneous " + s, s.isHomogeneous());

    GenPolynomial<BigRational> sh = s.homogenize(pfh);
    // System.out.println("sh = " + sh);
    assertTrue("sh is homogeneous " + sh, sh.isHomogeneous());
    GenPolynomial<BigRational> ss = sh.deHomogenize(pf);
    // System.out.println("ss = " + ss);
    assertEquals("ss = s ", ss, s);

    GenPolynomial<BigRational> th = ph.multiply(sh);
    // System.out.println("th = " + th);
    assertTrue("th is homogeneous " + th, th.isHomogeneous());

    GenPolynomial<BigRational> t = p.multiply(s);
    // System.out.println("t = " + t);

    GenPolynomial<BigRational> ts = th.deHomogenize(pf);
    // System.out.println("ts = " + ts);
    assertEquals("ts = t ", ts, t);
  }