001/*
002 * $Id$
003 */
004
005package edu.jas.application;
006
007
008import java.util.ArrayList;
009import java.util.Collections;
010import java.util.List;
011
012import edu.jas.arith.BigRational;
013import edu.jas.gb.SolvableGroebnerBase;
014import edu.jas.gb.SolvableGroebnerBaseSeq;
015import edu.jas.kern.ComputerThreads;
016import edu.jas.poly.GenSolvablePolynomial;
017import edu.jas.poly.GenSolvablePolynomialRing;
018import edu.jas.poly.PolynomialList;
019import edu.jas.poly.RelationGenerator;
020import edu.jas.poly.TermOrder;
021import edu.jas.poly.TermOrderOptimization;
022import edu.jas.poly.WeylRelations;
023import edu.jas.poly.WeylRelationsIterated;
024import edu.jas.util.KsubSet;
025
026import junit.framework.Test;
027import junit.framework.TestCase;
028import junit.framework.TestSuite;
029
030
031/**
032 * SolvableIdeal tests with JUnit.
033 * @author Heinz Kredel
034 */
035public class SolvableIdealTest extends TestCase {
036
037
038    /**
039     * main
040     */
041    public static void main(String[] args) {
042        junit.textui.TestRunner.run(suite());
043    }
044
045
046    /**
047     * Constructs a <CODE>SolvableIdealTest</CODE> object.
048     * @param name String.
049     */
050    public SolvableIdealTest(String name) {
051        super(name);
052    }
053
054
055    /**
056     * suite.
057     */
058    public static Test suite() {
059        TestSuite suite = new TestSuite(SolvableIdealTest.class);
060        return suite;
061    }
062
063
064    TermOrder to;
065
066
067    GenSolvablePolynomialRing<BigRational> fac;
068
069
070    List<GenSolvablePolynomial<BigRational>> L, M;
071
072
073    PolynomialList<BigRational> F;
074
075
076    List<GenSolvablePolynomial<BigRational>> G;
077
078
079    SolvableGroebnerBase<BigRational> bb;
080
081
082    GenSolvablePolynomial<BigRational> a, b, c, d, e;
083
084
085    int rl = 4; // even for Weyl relations
086
087
088    int kl = 2; //10
089
090
091    int ll = 3; //7
092
093
094    int el = 3;
095
096
097    float q = 0.15f; //0.4f
098
099
100    @Override
101    protected void setUp() {
102        BigRational coeff = new BigRational(17, 1);
103        to = new TermOrder(TermOrder.INVLEX);
104        String[] vars = new String[] { "w", "x", "y", "z" };
105        fac = new GenSolvablePolynomialRing<BigRational>(coeff, rl, to, vars);
106        RelationGenerator<BigRational> wl = new WeylRelations<BigRational>();
107        wl.generate(fac);
108        bb = new SolvableGroebnerBaseSeq<BigRational>();
109        //bb = GBFactory.getImplementation(coeff);
110        a = b = c = d = e = null;
111    }
112
113
114    @Override
115    protected void tearDown() {
116        a = b = c = d = e = null;
117        fac = null;
118        bb = null;
119        ComputerThreads.terminate();
120    }
121
122
123    /**
124     * Test left ideal sum.
125     */
126    public void testLeftIdealSum() {
127        SolvableIdeal<BigRational> I, J, K;
128        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
129
130        a = fac.random(kl, ll, el, q);
131        b = fac.random(kl, ll, el, q);
132        c = fac.random(kl, ll, el, q);
133        d = fac.random(kl, ll, el, q);
134        e = d; //fac.random(kl, ll, el, q );
135
136        L = PolynomialList.castToSolvableList(fac.generators());
137        //System.out.println("generators: " + L);
138        int k = L.size() - rl;
139        if (a.isZERO()) {
140            a = L.get(k++);
141        }
142        if (b.isZERO()) {
143            b = L.get(k++);
144        }
145        if (c.isZERO()) {
146            c = L.get(k++);
147        }
148        if (d.isZERO()) {
149            d = L.get(k++);
150            e = d;
151        }
152
153        assertTrue("not isZERO( a )", !a.isZERO());
154        L.add(a);
155
156        I = new SolvableIdeal<BigRational>(fac, L, true);
157        assertTrue("not isZERO( I )", !I.isZERO());
158        //assertTrue("not isONE( I )", !I.isONE());
159        assertTrue("isGB( I )", I.isGB());
160
161        I = new SolvableIdeal<BigRational>(fac, L, false);
162        assertTrue("not isZERO( I )", !I.isZERO());
163        //assertTrue("not isONE( I )", !I.isONE());
164        assertTrue("isGB( I ): " + I.toScript(), I.isGB());
165
166        L = bb.leftGB(L);
167        assertTrue("isGB( { a } )", bb.isLeftGB(L));
168
169        I = new SolvableIdeal<BigRational>(fac, L, true);
170        assertTrue("not isZERO( I )", !I.isZERO());
171        //assertTrue("not isONE( I )", !I.isONE() );
172        assertTrue("isGB( I )", I.isGB());
173
174        I = new SolvableIdeal<BigRational>(fac, L, false);
175        assertTrue("not isZERO( I )", !I.isZERO());
176        //assertTrue("not isONE( I )", !I.isONE() );
177        assertTrue("isGB( I )", I.isGB());
178
179        String s = I.toScript() + "\n" + I.toString();
180        //System.out.println("#s = " + s.length() + ": " + s);
181        assertTrue("#s >= 260: ", s.length() >= 260);
182
183        K = I.getZERO();
184        assertTrue("K == 0: " + K, K.isZERO());
185        K = I.getONE();
186        assertTrue("K == 1: " + K, K.isONE());
187
188        assertTrue("not isZERO( b )", !b.isZERO());
189        L.add(b);
190        //System.out.println("L = " + L.size() );
191
192        I = new SolvableIdeal<BigRational>(fac, L, false);
193        assertTrue("not isZERO( I )", !I.isZERO());
194        //assertTrue("not isONE( I )", !I.isONE() );
195        //assertTrue("not isGB( I )", !I.isGB() );
196
197        L = bb.leftGB(L);
198        assertTrue("isGB( { a, b } )", bb.isLeftGB(L));
199
200        I = new SolvableIdeal<BigRational>(fac, L, true);
201        assertTrue("not isZERO( I )", !I.isZERO());
202        // assertTrue("not isONE( I )", !I.isONE() );
203        assertTrue("isGB( I )", I.isGB());
204
205        J = I;
206        K = J.sum(I);
207        assertTrue("not isZERO( K )", !K.isZERO());
208        assertTrue("isGB( K )", K.isGB());
209        assertTrue("equals( K, I )", K.equals(I));
210
211        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
212        assertTrue("not isZERO( c )", !c.isZERO());
213        L.add(c);
214        assertTrue("isGB( { c } )", bb.isLeftGB(L));
215
216        J = new SolvableIdeal<BigRational>(fac, L, true);
217        K = J.sum(I);
218        assertTrue("not isZERO( K )", !K.isZERO());
219        assertTrue("isGB( K )", K.isGB());
220        assertTrue("K contains(I)", K.contains(I));
221        assertTrue("K contains(J)", K.contains(J));
222
223        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
224        assertTrue("not isZERO( d )", !d.isZERO());
225        L.add(d);
226
227        assertTrue("isGB( { d } )", bb.isLeftGB(L));
228        J = new SolvableIdeal<BigRational>(fac, L, true);
229        I = K;
230        K = J.sum(I);
231        assertTrue("not isZERO( K )", !K.isZERO());
232        assertTrue("isGB( K )", K.isGB());
233        assertTrue("K contains(I)", K.contains(I));
234        assertTrue("K contains(J)", K.contains(J));
235
236        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
237        assertTrue("not isZERO( e )", !e.isZERO());
238        L.add(e);
239
240        assertTrue("isGB( { e } )", bb.isLeftGB(L));
241        J = new SolvableIdeal<BigRational>(fac, L, true);
242        I = K;
243        K = J.sum(I);
244        assertTrue("not isZERO( K )", !K.isZERO());
245        assertTrue("isGB( K )", K.isGB());
246        assertTrue("equals( K, I )", K.equals(I));
247        assertTrue("K contains(J)", K.contains(I));
248        assertTrue("I contains(K)", I.contains(K));
249        L = K.normalform(I.getList());
250        I = new SolvableIdeal<BigRational>(fac, L, false);
251        //System.out.println("I = " + I);
252        assertTrue("I mod K == 0: " + I, I.isZERO());
253
254        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
255        L.add(a);
256        L.add(b);
257        I = new SolvableIdeal<BigRational>(fac, L, false);
258        I.doGB();
259        J = I.power(3);
260        J = J.power(2);
261        K = I.power(6);
262        //System.out.println("I = " + I);
263        //System.out.println("J = " + J);
264        //System.out.println("K = " + K);
265        assertEquals("equals( (I**3)**2, I**6 )", K, J);
266
267        if (I.isUnit(c)) {
268            d = I.inverse(c);
269            e = I.normalform(d.multiply(c));
270            //System.out.println("c = " + c);
271            //System.out.println("d = " + d);
272            //System.out.println("d*c mod I = " + e);
273            assertTrue("inv(c) * c mod I == 1: " + e, e.isONE());
274        }
275    }
276
277
278    /**
279     * Test right ideal sum.
280     */
281    public void testRightIdealSum() {
282        SolvableIdeal<BigRational> Ir, Jr, Kr;
283        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
284
285        a = fac.random(kl, ll, el, q);
286        b = fac.random(kl, ll, el, q);
287        c = fac.random(kl, ll, el, q);
288        d = fac.random(kl, ll, el, q);
289        e = d; //fac.random(kl, ll, el, q );
290
291        L = PolynomialList.castToSolvableList(fac.generators());
292        //System.out.println("generators: " + L);
293        int k = L.size() - rl;
294        if (a.isZERO()) {
295            a = L.get(k++);
296        }
297        if (b.isZERO()) {
298            b = L.get(k++);
299        }
300        if (c.isZERO()) {
301            c = L.get(k++);
302        }
303        if (d.isZERO()) {
304            d = L.get(k++);
305            e = d;
306        }
307
308        assertTrue("not isZERO( a )", !a.isZERO());
309        L.add(a);
310
311        Ir = new SolvableIdeal<BigRational>(fac, L, true, SolvableIdeal.Side.right);
312        assertTrue("not isZERO( Ir )", !Ir.isZERO());
313        //assertTrue("not isONE( Ir )", !Ir.isONE());
314        assertTrue("isGB( Ir )", Ir.isGB());
315
316        Ir = new SolvableIdeal<BigRational>(fac, L, false, SolvableIdeal.Side.right);
317        assertTrue("not isZERO( Ir )", !Ir.isZERO());
318        //assertTrue("not isONE( Ir )", !Ir.isONE());
319        assertTrue("isGB( Ir ): " + Ir.toScript(), Ir.isGB());
320        assertTrue("isGB( Ir )", Ir.isRightGB());
321
322        L = bb.rightGB(L);
323        assertTrue("isGB( { a } )", bb.isRightGB(L));
324
325        Ir = new SolvableIdeal<BigRational>(fac, L, true, SolvableIdeal.Side.right);
326        assertTrue("not isZERO( Ir )", !Ir.isZERO());
327        //assertTrue("not isONE( Ir )", !Ir.isONE() );
328        assertTrue("isGB( Ir )", Ir.isGB());
329        assertTrue("isGB( Ir )", Ir.isRightGB());
330
331        Ir = new SolvableIdeal<BigRational>(fac, L, false, SolvableIdeal.Side.right);
332        assertTrue("not isZERO( Ir )", !Ir.isZERO());
333        //assertTrue("not isONE( Ir )", !Ir.isONE() );
334        assertTrue("isGB( Ir )", Ir.isGB());
335        assertTrue("isGB( Ir )", Ir.isRightGB());
336
337        String s = Ir.toScript() + "\n" + Ir.toString();
338        //System.out.println("#s = " + s.length() + ": " + s);
339        assertTrue("#s >= 260: ", s.length() >= 260);
340
341        assertTrue("not isZERO( b )", !b.isZERO());
342        L.add(b);
343        //System.out.println("L = " + L.size() );
344
345        Ir = new SolvableIdeal<BigRational>(fac, L, false, SolvableIdeal.Side.right);
346        assertTrue("not isZERO( Ir )", !Ir.isZERO());
347        //assertTrue("not isONE( Ir )", !Ir.isONE() );
348        //assertTrue("not isGB( Ir )", !Ir.isGB() );
349
350        L = bb.rightGB(L);
351        assertTrue("isGB( { a, b } )", bb.isRightGB(L));
352
353        Ir = new SolvableIdeal<BigRational>(fac, L, true, SolvableIdeal.Side.right);
354        assertTrue("not isZERO( Ir )", !Ir.isZERO());
355        // assertTrue("not isONE( Ir )", !Ir.isONE() );
356        assertTrue("isGB( Ir )", Ir.isRightGB());
357        assertTrue("isGB( Ir )", Ir.isGB());
358        Jr = Ir.rightGB();
359        assertTrue("isGB( Jr )", Jr.isRightGB());
360
361        Jr = Ir;
362        Kr = Jr.sum(Ir);
363        assertTrue("not isZERO( Kr )", !Kr.isZERO());
364        assertTrue("isGB( Kr )", Kr.isGB());
365        assertTrue("isGB( Kr )", Kr.isRightGB());
366        assertTrue("equals( Kr, Ir )", Kr.equals(Ir));
367
368        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
369        assertTrue("not isZERO( c )", !c.isZERO());
370        L.add(c);
371        assertTrue("isGB( { c } )", bb.isRightGB(L));
372
373        Jr = new SolvableIdeal<BigRational>(fac, L, true, SolvableIdeal.Side.right);
374        Kr = Jr.sum(Ir);
375        assertTrue("not isZERO( Kr )", !Kr.isZERO());
376        assertTrue("isGB( Kr )", Kr.isGB());
377        assertTrue("isGB( Kr )", Kr.isRightGB());
378        assertTrue("Kr contains(Ir)", Kr.contains(Ir));
379        assertTrue("Kr contains(Jr)", Kr.contains(Jr));
380
381        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
382        assertTrue("not isZERO( d )", !d.isZERO());
383        L.add(d);
384
385        assertTrue("isGB( { d } )", bb.isRightGB(L));
386        Jr = new SolvableIdeal<BigRational>(fac, L, true, SolvableIdeal.Side.right);
387        Ir = Kr;
388        Kr = Jr.sum(Ir);
389        assertTrue("not isZERO( Kr )", !Kr.isZERO());
390        assertTrue("isGB( Kr )", Kr.isGB());
391        assertTrue("isGB( Kr )", Kr.isRightGB());
392        assertTrue("Kr contains(Ir)", Kr.contains(Ir));
393        assertTrue("Kr contains(Jr)", Kr.contains(Jr));
394
395        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
396        assertTrue("not isZERO( e )", !e.isZERO());
397        L.add(e);
398
399        assertTrue("isGB( { e } )", bb.isRightGB(L));
400        Jr = new SolvableIdeal<BigRational>(fac, L, true, SolvableIdeal.Side.right);
401        Ir = Kr;
402        Kr = Jr.sum(Ir);
403        assertTrue("not isZERO( Kr )", !Kr.isZERO());
404        assertTrue("isGB( Kr )", Kr.isGB());
405        assertTrue("isGB( Kr )", Kr.isRightGB());
406        assertTrue("equals( Kr, Ir )", Kr.equals(Ir));
407        assertTrue("Kr contains(Jr)", Kr.contains(Ir));
408        assertTrue("Ir contains(Kr)", Ir.contains(Kr));
409    }
410
411
412    /**
413     * Test twosided ideal sum.
414     */
415    public void testTwosideIdealSum() {
416        SolvableIdeal<BigRational> It, Jt, Kt;
417        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
418
419        a = fac.random(kl, ll, el, q);
420        b = fac.random(kl, ll, el, q);
421        c = fac.random(kl, ll, el, q);
422        d = fac.random(kl, ll, el, q);
423        e = d; //fac.random(kl, ll, el, q );
424
425        L = PolynomialList.castToSolvableList(fac.generators());
426        //System.out.println("generators: " + L);
427        int k = L.size() - rl;
428        if (a.isZERO()) {
429            a = L.get(k++);
430        }
431        if (b.isZERO()) {
432            b = L.get(k++);
433        }
434        if (c.isZERO()) {
435            c = L.get(k++);
436        }
437        if (d.isZERO()) {
438            d = L.get(k++);
439            e = d;
440        }
441
442        assertTrue("not isZERO( a )", !a.isZERO());
443        L.add(a);
444
445        It = new SolvableIdeal<BigRational>(fac, L, true, SolvableIdeal.Side.twosided);
446        assertTrue("not isZERO( It )", !It.isZERO());
447        //assertTrue("not isONE( It )", !It.isONE());
448        assertTrue("isGB( It )", It.isGB());
449
450        L = bb.twosidedGB(L);
451        assertTrue("isGB( { a } )", bb.isTwosidedGB(L));
452        It = new SolvableIdeal<BigRational>(fac, L, false, SolvableIdeal.Side.twosided);
453        assertTrue("not isZERO( It )", !It.isZERO());
454        //assertTrue("not isONE( It )", !It.isONE());
455        assertTrue("isGB( It ): " + It.toScript(), It.isGB());
456        assertTrue("is2sGB( It ): " + It.toScript(), It.isTwosidedGB());
457
458        It = new SolvableIdeal<BigRational>(fac, L, true, SolvableIdeal.Side.twosided);
459        assertTrue("not isZERO( It )", !It.isZERO());
460        //assertTrue("not isONE( It )", !It.isONE() );
461        assertTrue("isGB( It )", It.isGB());
462
463        String s = It.toScript() + "\n" + It.toString();
464        //System.out.println("#s = " + s.length() + ": " + s);
465        assertTrue("#s >= 260: ", s.length() >= 260);
466
467        assertTrue("not isZERO( b )", !b.isZERO());
468        L.add(b);
469        //System.out.println("L = " + L.size() );
470
471        It = new SolvableIdeal<BigRational>(fac, L, false, SolvableIdeal.Side.twosided);
472        assertTrue("not isZERO( It )", !It.isZERO());
473        //assertTrue("not isONE( It )", !It.isONE() );
474        //assertTrue("not isGB( It )", !It.isGB() );
475
476        L = bb.twosidedGB(L);
477        assertTrue("isGB( { a, b } )", bb.isTwosidedGB(L));
478        It = new SolvableIdeal<BigRational>(fac, L, true, SolvableIdeal.Side.twosided);
479        assertTrue("not isZERO( It )", !It.isZERO());
480        // assertTrue("not isONE( It )", !It.isONE() );
481        assertTrue("isGB( It )", It.isGB());
482        assertTrue("is2sGB( It ): " + It.toScript(), It.isTwosidedGB());
483
484        Jt = It;
485        Kt = Jt.sum(It);
486        assertTrue("not isZERO( Kt )", !Kt.isZERO());
487        assertTrue("isGB( Kt )", Kt.isGB());
488        assertTrue("equals( Kt, It )", Kt.equals(It));
489
490        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
491        assertTrue("not isZERO( c )", !c.isZERO());
492        L.add(c);
493        L = bb.twosidedGB(L);
494        assertTrue("isGB( { c } )", bb.isTwosidedGB(L));
495
496        Jt = new SolvableIdeal<BigRational>(fac, L, true, SolvableIdeal.Side.twosided);
497        Kt = Jt.sum(It);
498        assertTrue("not isZERO( Kt )", !Kt.isZERO());
499        assertTrue("isGB( Kt )", Kt.isGB());
500        assertTrue("Kt equals(It)", Kt.equals(It));
501        assertTrue("Kt equals(Jt)", Kt.equals(Jt));
502
503        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
504        assertTrue("not isZERO( d )", !d.isZERO());
505        L.add(d);
506        L = bb.twosidedGB(L);
507        assertTrue("isGB( { d } )", bb.isTwosidedGB(L));
508        Jt = new SolvableIdeal<BigRational>(fac, L, true, SolvableIdeal.Side.twosided);
509        assertTrue("is2sGB( Jt ): " + Jt.toScript(), Jt.isTwosidedGB());
510        It = Kt;
511        Kt = Jt.sum(It);
512        assertTrue("not isZERO( Kt )", !Kt.isZERO());
513        assertTrue("isGB( Kt )", Kt.isGB());
514        assertTrue("Kt equals(It)", Kt.equals(It));
515        assertTrue("Kt equals(Jt)", Kt.equals(Jt));
516
517        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
518        assertTrue("not isZERO( e )", !e.isZERO());
519        L.add(e);
520
521        assertTrue("isGB( { e } )", bb.isRightGB(L));
522        Jt = new SolvableIdeal<BigRational>(fac, L, true, SolvableIdeal.Side.twosided);
523        It = Kt;
524        Kt = Jt.sum(It);
525        assertTrue("not isZERO( Kt )", !Kt.isZERO());
526        assertTrue("isGB( Kt )", Kt.isGB());
527        assertTrue("equals( Kt, It )", Kt.equals(It));
528        //assertTrue("Kt contains(Jt)", Kt.contains(It));
529        //assertTrue("It contains(Kt)", It.contains(Kt));
530    }
531
532
533    /**
534     * Test SolvableIdeal product.
535     */
536    public void testSolvableIdealProduct() {
537        SolvableIdeal<BigRational> I, J, K, H;
538        a = fac.random(kl, ll, el, q);
539        b = fac.random(kl, ll, el - 1, q);
540        c = fac.random(kl, ll, el - 1, q);
541        d = c; //fac.random(kl, ll, el, q);
542        e = d; //fac.random(kl, ll, el, q );
543
544        if (a.isZERO() || b.isZERO() || c.isZERO() || d.isZERO()) {
545            return;
546        }
547
548        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
549        //assertTrue("not isZERO( a )", !a.isZERO());
550        L.add(a);
551
552        I = new SolvableIdeal<BigRational>(fac, L, false);
553        assertTrue("not isZERO( I )", !I.isZERO());
554        assertTrue("not isONE( I )", !I.isONE() || a.isConstant());
555        assertTrue("isGB( I ): " + I.toScript(), I.isGB());
556
557        H = I.leftProduct(b);
558        assertTrue("not isZERO( H )", !H.isZERO());
559        assertTrue("isGB( H )", H.isGB());
560        //non-com: left okay
561        assertTrue("I contains(H)", I.contains(H));
562        //System.out.println("I = " + I);
563        //System.out.println("b = " + b);
564        //System.out.println("H = " + H);
565
566        H = I.product(b);
567        assertTrue("not isZERO( H )", !H.isZERO());
568        assertTrue("isGB( H )", H.isGB());
569        //non-com: not left assertTrue("I contains(H)", I.contains(H));
570        //System.out.println("H = " + H);
571
572        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
573        assertTrue("not isZERO( b )", !b.isZERO());
574        L.add(b);
575
576        J = new SolvableIdeal<BigRational>(fac, L, false);
577        assertTrue("not isZERO( J )", !J.isZERO());
578        assertTrue("not isONE( J )", !J.isONE() || a.isConstant() || b.isConstant());
579        assertTrue("isGB( J ): " + J.toScript(), J.isGB());
580
581        K = I.product(J);
582        //System.out.println("I = " + I);
583        //System.out.println("J = " + J);
584        //System.out.println("K = " + K);
585        assertTrue("not isZERO( K )", !K.isZERO());
586        assertTrue("isGB( K )", K.isGB());
587        //non-com assertTrue("I contains(K)", I.contains(K));
588        assertTrue("J contains(K)", J.contains(K));
589        assertEquals("H == K: ", H, K);
590
591        H = I.intersect(J);
592        assertTrue("not isZERO( H )", !H.isZERO());
593        assertTrue("isGB( H )", H.isGB());
594        assertTrue("I contains(H)", I.contains(H));
595        assertTrue("J contains(H)", J.contains(H));
596        //non-com assertTrue("H contains(K)", H.contains(K));
597
598        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
599        assertTrue("not isZERO( a )", !a.isZERO());
600        L.add(a);
601        assertTrue("not isZERO( c )", !c.isZERO());
602        L.add(c);
603        L = bb.leftGB(L);
604
605        I = new SolvableIdeal<BigRational>(fac, L, true);
606        assertTrue("not isZERO( I )", !I.isZERO());
607        //assertTrue("not isONE( I )", !I.isONE() );
608        assertTrue("isGB( I )", I.isGB());
609
610        K = I.product(J);
611        assertTrue("not isZERO( K )", !K.isZERO());
612        assertTrue("isGB( K )", K.isGB());
613        //non-com assertTrue("I contains(K)", I.contains(K));
614        assertTrue("J contains(K)", J.contains(K));
615
616        H = I.intersect(J);
617        assertTrue("not isZERO( H )", !H.isZERO());
618        assertTrue("isGB( H )", H.isGB());
619        assertTrue("I contains(H)", I.contains(H));
620        assertTrue("J contains(H)", J.contains(H));
621        //non-com assertTrue("H contains(K)", H.contains(K));
622
623        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
624        assertTrue("not isZERO( b )", !b.isZERO());
625        L.add(b);
626        assertTrue("not isZERO( d )", !d.isZERO());
627        L.add(d);
628        L = bb.leftGB(L);
629
630        J = new SolvableIdeal<BigRational>(fac, L, true);
631        assertTrue("not isZERO( J )", !J.isZERO());
632        //assertTrue("not isONE( J )", !J.isONE() );
633        assertTrue("isGB( J )", J.isGB());
634
635        K = I.product(J);
636        assertTrue("not isZERO( K )", !K.isZERO());
637        assertTrue("isGB( K )", K.isGB());
638        //non-com assertTrue("I contains(K)", I.contains(K));
639        assertTrue("J contains(K)", J.contains(K));
640
641        H = I.intersect(J);
642        assertTrue("not isZERO( H )", !H.isZERO());
643        assertTrue("isGB( H )", H.isGB());
644        assertTrue("I contains(H)", I.contains(H));
645        assertTrue("J contains(H)", J.contains(H));
646        //non-com assertTrue("H contains(K)", H.contains(K));
647
648        List<SolvableIdeal<BigRational>> si = new ArrayList<SolvableIdeal<BigRational>>();
649        si.add(K);
650        si.add(J);
651        H = I.intersect(si);
652        //System.out.println("I = " + I);
653        //System.out.println("si = " + si);
654        //System.out.println("H = " + H);
655        assertEquals("H == K: ", H, K);
656    }
657
658
659    /**
660     * Test SolvableIdeal quotient.
661     */
662    public void testSolvableIdealQuotient() {
663        SolvableIdeal<BigRational> I, J, K, H;
664        a = fac.random(kl, ll - 2, el, q);
665        b = fac.random(kl, ll, el, q / 2);
666        c = fac.random(kl, ll, el - 1, q);
667        d = c; //fac.random(kl, ll, el, q);
668        e = d; //fac.random(kl, ll, el, q );
669
670        L = PolynomialList.castToSolvableList(fac.generators());
671        //System.out.println("generators: " + L);
672        int k = L.size() - rl;
673        if (a.isZERO()) {
674            a = L.get(k++);
675        }
676        if (b.isZERO()) {
677            b = L.get(k++);
678        }
679        if (c.isZERO()) {
680            c = L.get(k++);
681        }
682        if (d.isZERO()) {
683            d = L.get(k++);
684        }
685
686        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
687        assertTrue("not isZERO( a )", !a.isZERO());
688        L.add(a);
689        L = bb.leftGB(L);
690
691        I = new SolvableIdeal<BigRational>(fac, L, true);
692        assertTrue("not isZERO( I )", !I.isZERO());
693        //assertTrue("not isONE( I )", !I.isONE() );
694        assertTrue("isGB( I )", I.isGB());
695
696        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
697        assertTrue("not isZERO( b )", !a.isZERO());
698        L.add(b);
699        L = bb.leftGB(L);
700
701        J = new SolvableIdeal<BigRational>(fac, L, true);
702        assertTrue("not isZERO( J )", !J.isZERO());
703        //assertTrue("not isONE( J )", !J.isONE() );
704        assertTrue("isGB( J )", J.isGB());
705
706        K = I.product(J);
707        assertTrue("not isZERO( K )", !K.isZERO());
708        assertTrue("isGB( K )", K.isGB());
709        //non-com assertTrue("I contains(K)", I.contains(K));
710        assertTrue("J contains(K)", J.contains(K));
711
712        H = K.quotient(J.getList().get(0));
713        assertTrue("not isZERO( H )", !H.isZERO());
714        assertTrue("isGB( H )", H.isGB());
715        //non-com assertTrue("equals(H,I)", H.equals(I)); // GBs only
716
717        H = K.quotient(J);
718        assertTrue("not isZERO( H )", !H.isZERO());
719        assertTrue("isGB( H )", H.isGB());
720        //non-com assertTrue("equals(H,I)", H.equals(I)); // GBs only
721
722        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
723        assertTrue("not isZERO( b )", !b.isZERO());
724        L.add(b);
725        assertTrue("not isZERO( c )", !c.isZERO());
726        L.add(c);
727        L = bb.leftGB(L);
728
729        J = new SolvableIdeal<BigRational>(fac, L, true);
730        assertTrue("not isZERO( J )", !J.isZERO());
731        //assertTrue("not isONE( J )", !J.isONE() );
732        assertTrue("isGB( J )", J.isGB());
733
734        K = I.product(J);
735        assertTrue("not isZERO( K )", !K.isZERO());
736        assertTrue("isGB( K )", K.isGB());
737        //non-com assertTrue("I contains(K)", I.contains(K));
738        assertTrue("J contains(K)", J.contains(K));
739
740        H = K.quotient(J);
741        assertTrue("not isZERO( H )", !H.isZERO());
742        assertTrue("isGB( H )", H.isGB());
743        //non-com assertTrue("equals(H,I)", H.equals(I)); // GBs only
744
745        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
746        assertTrue("not isZERO( a )", !a.isZERO());
747        L.add(a);
748        assertTrue("not isZERO( d )", !d.isZERO());
749        L.add(d);
750        L = bb.leftGB(L);
751
752        I = new SolvableIdeal<BigRational>(fac, L, true);
753        assertTrue("not isZERO( I )", !I.isZERO());
754        //assertTrue("not isONE( J )", !J.isONE() );
755        assertTrue("isGB( I )", I.isGB());
756
757        K = I.product(J);
758        assertTrue("not isZERO( K )", !K.isZERO());
759        assertTrue("isGB( K )", K.isGB());
760        //non-com assertTrue("I contains(K)", I.contains(K));
761        assertTrue("J contains(K)", J.contains(K));
762
763        H = K.quotient(J);
764        assertTrue("not isZERO( H )", !H.isZERO());
765        assertTrue("isGB( H )", H.isGB());
766        //non-com assertTrue("equals(H,I)", H.equals(I)); // GBs only
767    }
768
769
770    /**
771     * Test SolvableIdeal infinite quotient.
772     */
773    public void testSolvableIdealInfiniteQuotient() {
774        SolvableIdeal<BigRational> I, J, K;
775        a = fac.random(kl, ll - 2, el, q);
776        b = fac.random(kl, ll - 1, el - 1, q);
777        c = fac.random(kl, ll / 2, el - 1, q / 2);
778        //a = fac.parse(" -1/2 w");
779        //b = fac.parse(" y - 2/3");
780        //c = fac.parse(" -2 w * y + 4/3 w + 2");
781        //c = fac.parse(" -2 y^2 + 8/3 y - 8/9");
782        d = c; //fac.random(kl, ll, el, q);
783        e = d; //fac.random(kl, ll, el, q );
784
785        L = PolynomialList.castToSolvableList(fac.generators());
786        //System.out.println("generators: " + L);
787        int k = L.size() - rl;
788        if (a.isZERO()) {
789            a = L.get(k++);
790        }
791        if (b.isZERO()) {
792            b = L.get(k++);
793        }
794        if (c.isZERO()) {
795            c = L.get(k++);
796        }
797        if (d.isZERO()) {
798            d = L.get(k++);
799            e = d;
800        }
801
802        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
803        assertTrue("not isZERO( b )", !b.isZERO());
804        L.add(b);
805        L = bb.leftGB(L);
806        I = new SolvableIdeal<BigRational>(fac, L, true);
807        assertTrue("not isZERO( I )", !I.isZERO());
808        //assertTrue("not isONE( I )", !I.isONE() );
809        assertTrue("isGB( I )", I.isGB());
810
811        J = I.infiniteQuotient(a);
812        int x = I.infiniteQuotientExponent(a, J);
813        //System.out.println("I, a, J, x: " + I.toScript() + ", " + a + ", " + J.toScript() + ", " + x);
814        assertTrue("x >= 0: " + x, x >= 0);
815
816        assertTrue("not isZERO( c )", !c.isZERO());
817        L.add(c);
818        L = bb.leftGB(L);
819        I = new SolvableIdeal<BigRational>(fac, L, true);
820        assertTrue("not isZERO( I )", !I.isZERO());
821        //assertTrue("not isONE( I )", !I.isONE() );
822        assertTrue("isGB( I )", I.isGB());
823
824        J = I.infiniteQuotient(a);
825        assertTrue("contains(J,I): " + J.toScript() + ", " + I.toScript(), J.contains(I)); // GBs only
826
827        assertTrue("not isZERO( d )", !d.isZERO());
828        L.add(d);
829        L = bb.leftGB(L);
830        I = new SolvableIdeal<BigRational>(fac, L, true);
831        assertTrue("not isZERO( I )", !I.isZERO());
832        //assertTrue("not isONE( I )", !I.isONE() );
833        assertTrue("isGB( I )", I.isGB());
834
835        J = I.infiniteQuotient(a);
836        assertTrue("isGB( J )", J.isGB());
837        assertTrue("contains(J,I)", J.contains(I)); // GBs only
838
839        G = new ArrayList<GenSolvablePolynomial<BigRational>>();
840        assertTrue("not isZERO( a )", !a.isZERO());
841        G.add(a);
842        G = bb.leftGB(G);
843        K = new SolvableIdeal<BigRational>(fac, G, true);
844        assertTrue("not isZERO( K )", !K.isZERO());
845        //assertTrue("not isONE( I )", !I.isONE() );
846        assertTrue("isGB( K )", K.isGB());
847
848        J = I.infiniteQuotient(K);
849        assertTrue("contains(J,I)", J.contains(I)); // GBs only
850
851        assertTrue("not isZERO( e ): + e", !e.isZERO());
852        G.add(e);
853        G = bb.leftGB(G);
854        K = new SolvableIdeal<BigRational>(fac, G, true);
855        assertTrue("not isZERO( K )", !K.isZERO());
856        //assertTrue("not isONE( I )", !I.isONE() );
857        assertTrue("isGB( K )", K.isGB());
858
859        J = I.infiniteQuotient(K);
860        assertTrue("contains(J,I)", J.contains(I)); // GBs only
861    }
862
863
864    /**
865     * Test (commutative) SolvableIdeal infinite quotient with Rabinowich trick.
866     */
867    public void testSolvableIdealInfiniteQuotientRab() {
868        fac = new GenSolvablePolynomialRing<BigRational>(fac.coFac, rl, fac.tord, fac.getVars());
869        SolvableIdeal<BigRational> I, J, K, JJ;
870        a = fac.random(kl - 1, ll - 1, el - 1, q / 2);
871        b = fac.random(kl - 1, ll - 1, el, q / 2);
872        c = fac.random(kl - 1, ll - 1, el, q / 2);
873        d = fac.random(kl - 1, ll - 1, el, q / 2);
874        e = a; //fac.random(kl, ll-1, el, q );
875
876        L = PolynomialList.castToSolvableList(fac.generators());
877        //System.out.println("generators: " + L);
878        int k = L.size() - rl;
879        if (a.isZERO()) {
880            a = L.get(k++);
881        }
882        if (b.isZERO()) {
883            b = L.get(k++);
884        }
885        if (c.isZERO()) {
886            c = L.get(k++);
887        }
888        if (d.isZERO()) {
889            d = L.get(k++);
890        }
891
892        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
893        assertTrue("not isZERO( b )", !b.isZERO());
894        L.add(b);
895        L = bb.leftGB(L);
896        I = new SolvableIdeal<BigRational>(fac, L, true);
897        assertTrue("not isZERO( I )", !I.isZERO());
898        //assertTrue("not isONE( I )", !I.isONE() );
899        assertTrue("isGB( I )", I.isGB());
900
901        J = I.infiniteQuotientRab(a);
902        JJ = I.infiniteQuotient(a);
903        assertTrue("equals(J,JJ)", J.equals(JJ)); // GBs only
904
905        assertTrue("not isZERO( c )", !c.isZERO());
906        L.add(c);
907        L = bb.leftGB(L);
908        I = new SolvableIdeal<BigRational>(fac, L, true);
909        assertTrue("not isZERO( I )", !I.isZERO());
910        //assertTrue("not isONE( I )", !I.isONE() );
911        assertTrue("isGB( I )", I.isGB());
912
913        J = I.infiniteQuotientRab(a);
914        assertTrue("contains(J,I): " + J + ", " + I, J.contains(I)); // GBs only
915        JJ = I.infiniteQuotient(a);
916        assertTrue("contains(J,JJ): " + J + ", " + JJ, J.contains(JJ)); // GBs only
917
918        assertTrue("not isZERO( d )", !d.isZERO());
919        L.add(d);
920        L = bb.leftGB(L);
921        I = new SolvableIdeal<BigRational>(fac, L, true);
922        assertTrue("not isZERO( I )", !I.isZERO());
923        //assertTrue("not isONE( I )", !I.isONE() );
924        assertTrue("isGB( I )", I.isGB());
925
926        J = I.infiniteQuotientRab(a);
927        assertTrue("isGB( J )", J.isGB());
928        assertTrue("contains(J,I)", J.contains(I)); // GBs only
929        JJ = I.infiniteQuotient(a);
930        assertTrue("contains(J,JJ)", J.contains(JJ)); // GBs only
931
932        G = new ArrayList<GenSolvablePolynomial<BigRational>>();
933        assertTrue("not isZERO( a )", !a.isZERO());
934        G.add(a);
935        G = bb.leftGB(G);
936        K = new SolvableIdeal<BigRational>(fac, G, true);
937        assertTrue("not isZERO( K )", !K.isZERO());
938        //assertTrue("not isONE( I )", !I.isONE() );
939        assertTrue("isGB( K )", K.isGB());
940
941        J = I.infiniteQuotientRab(K);
942        assertTrue("contains(J,I)", J.contains(I)); // GBs only
943        JJ = I.infiniteQuotient(a);
944        assertTrue("contains(J,JJ)", J.contains(JJ)); // GBs only
945
946        assertTrue("not isZERO( e ): " + e, !e.isZERO());
947        G.add(e);
948        G = bb.leftGB(G);
949        K = new SolvableIdeal<BigRational>(fac, G, true);
950        assertTrue("not isZERO( K ): " + K, !K.isZERO());
951        //assertTrue("not isONE( I )", !I.isONE() );
952        assertTrue("isGB( K )", K.isGB());
953
954        J = I.infiniteQuotientRab(K);
955        assertTrue("contains(J,I)", J.contains(I)); // GBs only
956        JJ = I.infiniteQuotient(a);
957        assertTrue("contains(J,JJ)", J.contains(JJ)); // GBs only
958    }
959
960
961    /**
962     * Test (commutative) SolvableIdeal radical membership.
963     */
964    public void testSolvableIdealRadicalMember() {
965        fac = new GenSolvablePolynomialRing<BigRational>(fac.coFac, rl, fac.tord, fac.getVars());
966        SolvableIdeal<BigRational> I;
967        a = fac.random(kl - 1, ll, el - 1, q);
968        b = fac.random(kl - 1, ll, el, q);
969        c = fac.random(kl - 1, ll - 1, el, q / 2);
970        //d = fac.random(kl - 1, ll - 1, el, q / 2);
971        //e = a; //fac.random(kl, ll-1, el, q );
972
973        L = PolynomialList.castToSolvableList(fac.generators());
974        //System.out.println("generators: " + L);
975        int k = L.size() - rl;
976        if (a.isZERO()) {
977            a = L.get(k++);
978        }
979        if (b.isZERO()) {
980            b = L.get(k++);
981        }
982        if (c.isZERO()) {
983            c = L.get(k++);
984        }
985
986        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
987        L.add(b);
988        L = bb.leftGB(L);
989        I = new SolvableIdeal<BigRational>(fac, L, true);
990        assertTrue("not isZERO( I )", !I.isZERO());
991        //assertTrue("not isONE( I )", !I.isONE() );
992        assertTrue("isGB( I )", I.isGB());
993
994        //System.out.println("a = " + a);
995        //System.out.println("b = " + b);
996        //System.out.println("I = " + I);
997
998        if (!I.isONE() && !a.equals(b)) {
999            assertFalse("a in radical(b): " + a + ", " + b, I.isRadicalMember(a));
1000            assertTrue("b in radical(b): " + a + ", " + b, I.isRadicalMember(b));
1001        }
1002
1003        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
1004        L.add(b.multiply(b));
1005        L = bb.leftGB(L);
1006        I = new SolvableIdeal<BigRational>(fac, L, true);
1007        assertTrue("not isZERO( I )", !I.isZERO());
1008        //assertTrue("not isONE( I )", !I.isONE() );
1009        assertTrue("isGB( I )", I.isGB());
1010
1011        //System.out.println("I = " + I);
1012
1013        if (!I.isONE() && !a.equals(b)) {
1014            assertFalse("a in radical(b*b)", I.isRadicalMember(a));
1015            assertTrue("b in radical(b*b)", I.isRadicalMember(b));
1016        }
1017
1018        //System.out.println("c = " + c);
1019        L.add(c);
1020        L = bb.leftGB(L);
1021        I = new SolvableIdeal<BigRational>(fac, L, true);
1022        assertTrue("not isZERO( I )", !I.isZERO());
1023        //assertTrue("not isONE( I )", !I.isONE() );
1024        assertTrue("isGB( I )", I.isGB());
1025
1026        //System.out.println("I = " + I);
1027
1028        if (!I.isONE() && !a.equals(b)) {
1029            assertFalse("a in radical(b*b,c)", I.isRadicalMember(a));
1030            assertTrue("b in radical(b*b,c)", I.isRadicalMember(b));
1031        }
1032    }
1033
1034
1035    /**
1036     * Test SolvableIdeal common zeros.
1037     */
1038    @SuppressWarnings("unchecked")
1039    public void testSolvableIdealCommonZeros() {
1040        SolvableIdeal<BigRational> I;
1041        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
1042
1043        I = new SolvableIdeal<BigRational>(fac, L, true);
1044        assertEquals("commonZeroTest( I )", I.commonZeroTest(), 1);
1045
1046        a = fac.getZERO();
1047        L.add(a);
1048        I = new SolvableIdeal<BigRational>(fac, L, true);
1049        assertEquals("commonZeroTest( I )", I.commonZeroTest(), 1);
1050
1051        b = fac.getONE();
1052        L.add(b);
1053        I = new SolvableIdeal<BigRational>(fac, L, true);
1054        assertEquals("commonZeroTest( I )", I.commonZeroTest(), -1);
1055
1056        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
1057        a = fac.random(kl, ll, el, q);
1058        if (!a.isZERO() && !a.isConstant()) {
1059            L.add(a);
1060            I = new SolvableIdeal<BigRational>(fac, L, true);
1061            assertEquals("commonZeroTest( I )", I.commonZeroTest(), 1);
1062        }
1063
1064        L = (List<GenSolvablePolynomial<BigRational>>) fac.univariateList();
1065        I = new SolvableIdeal<BigRational>(fac, L, true);
1066        assertEquals("commonZeroTest( I )", I.commonZeroTest(), 0);
1067
1068        L.remove(0);
1069        I = new SolvableIdeal<BigRational>(fac, L, true);
1070        assertEquals("commonZeroTest( I )", I.commonZeroTest(), 1);
1071    }
1072
1073
1074    /**
1075     * Test SolvableIdeal dimension.
1076     */
1077    @SuppressWarnings("unchecked")
1078    public void testSolvableIdealDimension() {
1079        SolvableIdeal<BigRational> I;
1080        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
1081        Dimension dim;
1082
1083        I = new SolvableIdeal<BigRational>(fac, L, true);
1084        assertEquals("dimension( I )", rl, I.dimension().d);
1085
1086        a = fac.getZERO();
1087        L.add(a);
1088        I = new SolvableIdeal<BigRational>(fac, L, true);
1089        assertEquals("dimension( I )", rl, I.dimension().d);
1090
1091        b = fac.getONE();
1092        L.add(b);
1093        I = new SolvableIdeal<BigRational>(fac, L, true);
1094        assertEquals("dimension( I )", -1, I.dimension().d);
1095
1096        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
1097        a = fac.random(kl, ll, el, q);
1098        if (!a.isZERO() && !a.isConstant()) {
1099            L.add(a);
1100            I = new SolvableIdeal<BigRational>(fac, L, true);
1101            //System.out.println("a = " + a);
1102            dim = I.dimension();
1103            //System.out.println("dim(I) = " + dim);
1104            assertTrue("dimension( I )", dim.d >= 1);
1105        }
1106
1107        L = (List<GenSolvablePolynomial<BigRational>>) fac.univariateList();
1108        I = new SolvableIdeal<BigRational>(fac, L, true);
1109        dim = I.dimension();
1110        assertEquals("dimension( I )", 0, dim.d);
1111
1112        while (L.size() > 0) {
1113            L.remove(0);
1114            I = new SolvableIdeal<BigRational>(fac, L, true);
1115            //System.out.println("I = " + I);
1116            dim = I.dimension();
1117            //System.out.println("dim(I) = " + dim);
1118            assertEquals("dimension( I )", rl - L.size(), dim.d);
1119        }
1120
1121        L = (List<GenSolvablePolynomial<BigRational>>) fac.univariateList();
1122        I = new SolvableIdeal<BigRational>(fac, L, true);
1123        I = I.product(I);
1124        //System.out.println("I = " + I);
1125        dim = I.dimension();
1126        //System.out.println("dim(I) = " + dim);
1127        assertTrue("dimension( I )", 0 >= dim.d);
1128
1129        L = I.getList();
1130        while (L.size() > 0) {
1131            L.remove(0);
1132            I = new SolvableIdeal<BigRational>(fac, L, true);
1133            //System.out.println("I = " + I);
1134            dim = I.dimension();
1135            //System.out.println("dim(I) = " + dim);
1136            assertTrue("dimension( I )", dim.d > 0);
1137        }
1138    }
1139
1140
1141    /**
1142     * Test elimination SolvableIdeals.
1143     */
1144    public void testElimSolvableIdeal() {
1145        BigRational coeff = new BigRational(17, 1);
1146        String[] vars = new String[] { "w", "x", "y", "z" };
1147        fac = new GenSolvablePolynomialRing<BigRational>(coeff, rl, to, vars);
1148        RelationGenerator<BigRational> wli = new WeylRelationsIterated<BigRational>();
1149        wli.generate(fac);
1150        //String[] vars = fac.getVars();
1151        //System.out.println("vars = " + Arrays.toString(vars));
1152        //System.out.println("fac = " + fac);
1153
1154        SolvableIdeal<BigRational> I, J, K;
1155        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
1156        //non-com
1157        a = fac.univariate(0, 3L); //fac.random(kl, ll, el, q );
1158        b = fac.univariate(1, 2L); //fac.random(kl, ll, el, q );
1159        c = fac.univariate(0, 1L); //fac.random(kl, ll, el, q );
1160
1161        L.add(a);
1162        //L.add(b);
1163        L.add(c);
1164
1165        I = new SolvableIdeal<BigRational>(fac, L);
1166        I.doGB();
1167        //System.out.println("I = " + I.toScript());
1168        assertTrue("not isZERO( I )", !I.isZERO());
1169        //assertTrue("not isONE( I )", !I.isONE());
1170        assertTrue("isGB( I )", I.isGB());
1171
1172        List<String> sv = new ArrayList<String>(vars.length);
1173        for (int i = 0; i < vars.length; i++) {
1174            sv.add(vars[i]);
1175        }
1176        //System.out.println("sv    = " + sv);
1177
1178        for (int i = 2; i <= vars.length; i = i + 2) {
1179            KsubSet<String> ps = new KsubSet<String>(sv, i);
1180            //System.out.println("========================== ps : " + i);
1181            for (List<String> ev : ps) {
1182                int si = Collections.indexOfSubList(sv, ev);
1183                if (si < 0 || si % 2 != 0) { // substring and iterated Weyl algebra
1184                    continue;
1185                }
1186                //System.out.println("ev = " + ev);
1187                List<String> svr = new ArrayList<String>(vars.length);
1188                K = null;
1189                if (si != 0) { // and substring on even index
1190                    svr.addAll(ev);
1191                    for (String e : sv) {
1192                        if (svr.contains(e)) {
1193                            continue;
1194                        }
1195                        svr.add(e);
1196                    }
1197                    //System.out.println("svr = " + svr);
1198                    String[] rvars = new String[svr.size()];
1199                    for (int j = 0; j < svr.size(); j++) {
1200                        rvars[j] = svr.get(j);
1201                    }
1202                    List<Integer> P = new ArrayList<Integer>(sv.size());
1203                    for (int j = 0; j < rvars.length; j++) {
1204                        int k = sv.indexOf(rvars[j]);
1205                        P.add(k);
1206                    }
1207                    //System.out.println("P = " + P);
1208                    GenSolvablePolynomialRing<BigRational> rfac;
1209                    rfac = (GenSolvablePolynomialRing<BigRational>) fac.permutation(P);
1210                    //System.out.println("rfac = " + rfac.toScript());
1211                    List<GenSolvablePolynomial<BigRational>> id = TermOrderOptimization
1212                                    .<BigRational> permutation(P, rfac, I.list.castToSolvableList());
1213                    K = new SolvableIdeal<BigRational>(rfac, id);
1214                    //System.out.println("K = " + K.toScript());
1215                    //continue;
1216                }
1217                String[] evars = new String[ev.size()];
1218                for (int j = 0; j < ev.size(); j++) {
1219                    evars[j] = ev.get(j);
1220                }
1221                GenSolvablePolynomialRing<BigRational> efac;
1222                efac = new GenSolvablePolynomialRing<BigRational>(fac.coFac, evars.length, fac.tord, evars);
1223                //RelationGenerator<BigRational> wl = new WeylRelations<BigRational>();
1224                RelationGenerator<BigRational> wl = new WeylRelationsIterated<BigRational>();
1225                wl.generate(efac);
1226                //System.out.println("efac = " + efac.toScript());
1227
1228                if (K == null) {
1229                    J = I.eliminate(efac);
1230                } else {
1231                    J = K.eliminate(efac);
1232                }
1233                //System.out.println("J = " + J.toScript());
1234                assertTrue("isGB( J ): " + J.toScript(), J.isGB());
1235                assertTrue("size( J ) <=  |ev|", J.getList().size() <= ev.size());
1236            }
1237        }
1238    }
1239
1240
1241    /**
1242     * Test univariate polynomials in ideal.
1243     */
1244    public void testUnivPoly() {
1245        String[] vars;
1246        BigRational coeff = new BigRational(17, 1);
1247        to = new TermOrder(TermOrder.INVLEX);
1248        vars = new String[] { "w", "x", "y", "z" };
1249        fac = new GenSolvablePolynomialRing<BigRational>(coeff, rl, to, vars);
1250
1251        vars = fac.getVars();
1252        //System.out.println("vars = " + Arrays.toString(vars));
1253        //System.out.println("fac = " + fac);
1254        assertTrue("vars.length == 4 ", vars.length == 4);
1255
1256        SolvableIdeal<BigRational> I;
1257        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
1258
1259        a = fac.parse("( x^3 + 34/55 x^2 + 1/9 x + 99 )");
1260        b = fac.parse("( y^4 - x )");
1261        c = fac.parse("( z^3 - x y )");
1262        d = fac.parse("( w^2 + 3 )");
1263
1264        if (a.isZERO() || b.isZERO() || c.isZERO()) {
1265            return;
1266        }
1267
1268        L.add(a);
1269        L.add(b);
1270        L.add(c);
1271        L.add(d);
1272        I = new SolvableIdeal<BigRational>(fac, L);
1273        //I.doGB();
1274        assertTrue("not isZERO( I )", !I.isZERO());
1275        assertTrue("isGB( I )", I.isGB());
1276        //System.out.println("I = " + I);
1277
1278        for (int i = 0; i < rl; i++) { // rl
1279            GenSolvablePolynomial<BigRational> u = I.constructUnivariate(rl - 1 - i);
1280            //System.out.println("u = " + u);
1281            GenSolvablePolynomial<BigRational> U = fac.parse(u.toString());
1282            //System.out.println("U = " + U + "\n");
1283            assertTrue("I.contains(U) ", I.contains(U));
1284        }
1285
1286        List<GenSolvablePolynomial<BigRational>> Us = I.constructUnivariate();
1287        for (GenSolvablePolynomial<BigRational> u : Us) {
1288            //System.out.println("u = " + u);
1289            GenSolvablePolynomial<BigRational> U = fac.parse(u.toString());
1290            //System.out.println("U = " + U + "\n");
1291            assertTrue("I.contains(U) ", I.contains(U));
1292        }
1293    }
1294
1295
1296    /**
1297     * Test SolvableIdeal annihilator.
1298     */
1299    public void testAnnihilator() {
1300        SolvableIdeal<BigRational> I, J, K;
1301        do {
1302            a = fac.random(kl, ll, el, q);
1303        } while (a.isZERO() || a.isConstant());
1304        b = fac.univariate(1);
1305        c = fac.univariate(rl - 1);
1306        //b = fac.random(kl - 1, ll, el, q);
1307        //c = fac.random(kl - 1, ll - 1, el, q / 2);
1308
1309        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
1310        L.add(a);
1311        L.add(b);
1312        //L.add(c);
1313        //System.out.println("L = " + L);
1314        L = bb.leftGB(L);
1315        I = new SolvableIdeal<BigRational>(fac, L, true);
1316        assertTrue("isGB( I )", I.isGB());
1317        //System.out.println("I = " + I + "\n");
1318
1319        J = I.annihilator(c);
1320        //System.out.println("J = " + J + "\n");
1321        J.doGB();
1322        //System.out.println("c = " + c);
1323        //System.out.println("J = " + J + "\n");
1324        assertTrue("isAnnihilator(c,J)", I.isAnnihilator(c, J));
1325
1326        d = fac.univariate(rl - 2);
1327        //d = fac.random(kl - 1, ll, el, q);
1328        M = new ArrayList<GenSolvablePolynomial<BigRational>>();
1329        M.add(c);
1330        M.add(d);
1331        //System.out.println("M = " + M);
1332        K = new SolvableIdeal<BigRational>(fac, M);
1333        //System.out.println("K = " + K + "\n");
1334
1335        J = I.annihilator(K);
1336        //System.out.println("J = " + J + "\n");
1337        J.doGB();
1338        //System.out.println("K = " + K);
1339        //System.out.println("J = " + J + "\n");
1340        assertTrue("isAnnihilator(M,J)", I.isAnnihilator(K, J));
1341    }
1342
1343}