static Polynomial[] linearize(Polynomial polynomial, Variable variable) {
   List l = new ArrayList();
   Generic x = variable.expressionValue();
   Polynomial s = polynomial;
   try {
     Polynomial r = s.valueOf(x);
     s = s.divide(r);
     l.add(r);
     while (true) s = s.divide(r);
   } catch (NotDivisibleException e) {
   }
   IntegerDivisor d[] = new IntegerDivisor[2];
   Generic p[] = new Generic[2];
   Generic q[] = new Generic[2];
   d[1] = IntegerDivisor.create(JsclInteger.valueOf(1));
   loop:
   while (d[1].hasNext()) {
     p[1] = (Generic) d[1].next();
     q[1] = d[1].integer(d[1].complementary());
     d[0] = IntegerDivisor.create(s.tail().coef().integerValue());
     while (d[0].hasNext()) {
       p[0] = (Generic) d[0].next();
       q[0] = d[0].integer(d[0].complementary());
       if (ArrayComparator.comparator.compare(q, p) < 0) break loop;
       for (int i = 0; i < 2; i++) {
         Polynomial r =
             s.valueOf(i == 0 ? p[1].multiply(x).subtract(p[0]) : p[1].multiply(x).add(p[0]));
         for (boolean flag = true; true; flag = false) {
           try {
             s = s.divide(r);
           } catch (NotDivisibleException e) {
             break;
           }
           d[1].divide();
           d[0].divide();
           if (flag) l.add(r);
         }
       }
     }
   }
   return (Polynomial[]) ArrayUtils.toArray(l, new Polynomial[l.size()]);
 }
 static Generic terminator(Generic generic, Variable var, boolean tail) {
   Generic x = var.expressionValue();
   Generic a = JsclInteger.valueOf(1);
   Iterator it = IntegerDivisor.create(generic.integerValue());
   while (it.hasNext()) {
     Generic s = (Generic) it.next();
     a = a.multiply(x.subtract(s));
     if (!tail) a = a.multiply(x.add(s));
   }
   return a;
 }