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 Ideal sum.
125     */
126    public void testIdealSum() {
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        if (a.isZERO() || b.isZERO() || c.isZERO() || d.isZERO()) {
137            return;
138        }
139
140        assertTrue("not isZERO( a )", !a.isZERO());
141        L.add(a);
142
143        I = new SolvableIdeal<BigRational>(fac, L, true);
144        assertTrue("not isZERO( I )", !I.isZERO());
145        //assertTrue("not isONE( I )", !I.isONE());
146        assertTrue("isGB( I )", I.isGB());
147
148        I = new SolvableIdeal<BigRational>(fac, L, false);
149        assertTrue("not isZERO( I )", !I.isZERO());
150        //assertTrue("not isONE( I )", !I.isONE());
151        assertTrue("isGB( I )", I.isGB());
152
153        L = bb.leftGB(L);
154        assertTrue("isGB( { a } )", bb.isLeftGB(L));
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.isGB());
165
166        assertTrue("not isZERO( b )", !b.isZERO());
167        L.add(b);
168        //System.out.println("L = " + L.size() );
169
170        I = new SolvableIdeal<BigRational>(fac, L, false);
171        assertTrue("not isZERO( I )", !I.isZERO());
172        //assertTrue("not isONE( I )", !I.isONE() );
173        //assertTrue("not isGB( I )", !I.isGB() );
174
175        L = bb.leftGB(L);
176        assertTrue("isGB( { a, b } )", bb.isLeftGB(L));
177
178        I = new SolvableIdeal<BigRational>(fac, L, true);
179        assertTrue("not isZERO( I )", !I.isZERO());
180        // assertTrue("not isONE( I )", !I.isONE() );
181        assertTrue("isGB( I )", I.isGB());
182
183        J = I;
184        K = J.sum(I);
185        assertTrue("not isZERO( K )", !K.isZERO());
186        assertTrue("isGB( K )", K.isGB());
187        assertTrue("equals( K, I )", K.equals(I));
188
189        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
190        assertTrue("not isZERO( c )", !c.isZERO());
191        L.add(c);
192        assertTrue("isGB( { c } )", bb.isLeftGB(L));
193
194        J = new SolvableIdeal<BigRational>(fac, L, true);
195        K = J.sum(I);
196        assertTrue("not isZERO( K )", !K.isZERO());
197        assertTrue("isGB( K )", K.isGB());
198        assertTrue("K contains(I)", K.contains(I));
199        assertTrue("K contains(J)", K.contains(J));
200
201        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
202        assertTrue("not isZERO( d )", !d.isZERO());
203        L.add(d);
204
205        assertTrue("isGB( { d } )", bb.isLeftGB(L));
206        J = new SolvableIdeal<BigRational>(fac, L, true);
207        I = K;
208        K = J.sum(I);
209        assertTrue("not isZERO( K )", !K.isZERO());
210        assertTrue("isGB( K )", K.isGB());
211        assertTrue("K contains(I)", K.contains(I));
212        assertTrue("K contains(J)", K.contains(J));
213
214        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
215        assertTrue("not isZERO( e )", !e.isZERO());
216        L.add(e);
217
218        assertTrue("isGB( { e } )", bb.isLeftGB(L));
219        J = new SolvableIdeal<BigRational>(fac, L, true);
220        I = K;
221        K = J.sum(I);
222        assertTrue("not isZERO( K )", !K.isZERO());
223        assertTrue("isGB( K )", K.isGB());
224        assertTrue("equals( K, I )", K.equals(I));
225        assertTrue("K contains(J)", K.contains(I));
226        assertTrue("I contains(K)", I.contains(K));
227    }
228
229
230    /**
231     * Test SolvableIdeal product.
232     */
233    public void testSolvableIdealProduct() {
234        SolvableIdeal<BigRational> I, J, K, H;
235        a = fac.random(kl, ll, el, q);
236        b = fac.random(kl, ll, el - 1, q);
237        c = fac.random(kl, ll, el - 1, q);
238        d = c; //fac.random(kl, ll, el, q);
239        e = d; //fac.random(kl, ll, el, q );
240
241        if (a.isZERO() || b.isZERO() || c.isZERO() || d.isZERO()) {
242            return;
243        }
244
245        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
246        //assertTrue("not isZERO( a )", !a.isZERO());
247        L.add(a);
248
249        I = new SolvableIdeal<BigRational>(fac, L, false);
250        assertTrue("not isZERO( I )", !I.isZERO());
251        assertTrue("not isONE( I )", !I.isONE() || a.isConstant());
252        assertTrue("isGB( I )", I.isGB());
253
254        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
255        assertTrue("not isZERO( b )", !a.isZERO());
256        L.add(b);
257
258        J = new SolvableIdeal<BigRational>(fac, L, false);
259        assertTrue("not isZERO( J )", !J.isZERO());
260        assertTrue("not isONE( J )", !J.isONE() || a.isConstant() || b.isConstant());
261        assertTrue("isGB( J )", J.isGB());
262
263        K = I.product(J);
264        //System.out.println("I = " + I);
265        //System.out.println("J = " + J);
266        //System.out.println("K = " + K);
267        assertTrue("not isZERO( K )", !K.isZERO());
268        assertTrue("isGB( K )", K.isGB());
269        //non-com assertTrue("I contains(K)", I.contains(K));
270        assertTrue("J contains(K)", J.contains(K));
271
272        H = I.intersect(J);
273        assertTrue("not isZERO( H )", !H.isZERO());
274        assertTrue("isGB( H )", H.isGB());
275        assertTrue("I contains(H)", I.contains(H));
276        assertTrue("J contains(H)", J.contains(H));
277        //non-com assertTrue("H contains(K)", H.contains(K));
278
279        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
280        assertTrue("not isZERO( a )", !a.isZERO());
281        L.add(a);
282        assertTrue("not isZERO( c )", !c.isZERO());
283        L.add(c);
284        L = bb.leftGB(L);
285
286        I = new SolvableIdeal<BigRational>(fac, L, true);
287        assertTrue("not isZERO( I )", !I.isZERO());
288        //assertTrue("not isONE( I )", !I.isONE() );
289        assertTrue("isGB( I )", I.isGB());
290
291        K = I.product(J);
292        assertTrue("not isZERO( K )", !K.isZERO());
293        assertTrue("isGB( K )", K.isGB());
294        //non-com assertTrue("I contains(K)", I.contains(K));
295        assertTrue("J contains(K)", J.contains(K));
296
297        H = I.intersect(J);
298        assertTrue("not isZERO( H )", !H.isZERO());
299        assertTrue("isGB( H )", H.isGB());
300        assertTrue("I contains(H)", I.contains(H));
301        assertTrue("J contains(H)", J.contains(H));
302        //non-com assertTrue("H contains(K)", H.contains(K));
303
304        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
305        assertTrue("not isZERO( b )", !b.isZERO());
306        L.add(b);
307        assertTrue("not isZERO( d )", !d.isZERO());
308        L.add(d);
309        L = bb.leftGB(L);
310
311        J = new SolvableIdeal<BigRational>(fac, L, true);
312        assertTrue("not isZERO( J )", !J.isZERO());
313        //assertTrue("not isONE( J )", !J.isONE() );
314        assertTrue("isGB( J )", J.isGB());
315
316        K = I.product(J);
317        assertTrue("not isZERO( K )", !K.isZERO());
318        assertTrue("isGB( K )", K.isGB());
319        //non-com assertTrue("I contains(K)", I.contains(K));
320        assertTrue("J contains(K)", J.contains(K));
321
322        H = I.intersect(J);
323        assertTrue("not isZERO( H )", !H.isZERO());
324        assertTrue("isGB( H )", H.isGB());
325        assertTrue("I contains(H)", I.contains(H));
326        assertTrue("J contains(H)", J.contains(H));
327        //non-com assertTrue("H contains(K)", H.contains(K));
328    }
329
330
331    /**
332     * Test SolvableIdeal quotient.
333     */
334    public void testSolvableIdealQuotient() {
335        SolvableIdeal<BigRational> I, J, K, H;
336        a = fac.random(kl, ll - 2, el, q);
337        b = fac.random(kl, ll, el, q / 2);
338        c = fac.random(kl, ll, el - 1, q);
339        d = c; //fac.random(kl, ll, el, q);
340        e = d; //fac.random(kl, ll, el, q );
341
342        if (a.isZERO() || b.isZERO() || c.isZERO() || d.isZERO()) {
343            return;
344        }
345
346        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
347        assertTrue("not isZERO( a )", !a.isZERO());
348        L.add(a);
349        L = bb.leftGB(L);
350
351        I = new SolvableIdeal<BigRational>(fac, L, true);
352        assertTrue("not isZERO( I )", !I.isZERO());
353        //assertTrue("not isONE( I )", !I.isONE() );
354        assertTrue("isGB( I )", I.isGB());
355
356        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
357        assertTrue("not isZERO( b )", !a.isZERO());
358        L.add(b);
359        L = bb.leftGB(L);
360
361        J = new SolvableIdeal<BigRational>(fac, L, true);
362        assertTrue("not isZERO( J )", !J.isZERO());
363        //assertTrue("not isONE( J )", !J.isONE() );
364        assertTrue("isGB( J )", J.isGB());
365
366        K = I.product(J);
367        assertTrue("not isZERO( K )", !K.isZERO());
368        assertTrue("isGB( K )", K.isGB());
369        //non-com assertTrue("I contains(K)", I.contains(K));
370        assertTrue("J contains(K)", J.contains(K));
371
372        H = K.quotient(J.getList().get(0));
373        assertTrue("not isZERO( H )", !H.isZERO());
374        assertTrue("isGB( H )", H.isGB());
375        //non-com assertTrue("equals(H,I)", H.equals(I)); // GBs only
376
377        H = K.quotient(J);
378        assertTrue("not isZERO( H )", !H.isZERO());
379        assertTrue("isGB( H )", H.isGB());
380        //non-com assertTrue("equals(H,I)", H.equals(I)); // GBs only
381
382        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
383        assertTrue("not isZERO( b )", !b.isZERO());
384        L.add(b);
385        assertTrue("not isZERO( c )", !c.isZERO());
386        L.add(c);
387        L = bb.leftGB(L);
388
389        J = new SolvableIdeal<BigRational>(fac, L, true);
390        assertTrue("not isZERO( J )", !J.isZERO());
391        //assertTrue("not isONE( J )", !J.isONE() );
392        assertTrue("isGB( J )", J.isGB());
393
394        K = I.product(J);
395        assertTrue("not isZERO( K )", !K.isZERO());
396        assertTrue("isGB( K )", K.isGB());
397        //non-com assertTrue("I contains(K)", I.contains(K));
398        assertTrue("J contains(K)", J.contains(K));
399
400        H = K.quotient(J);
401        assertTrue("not isZERO( H )", !H.isZERO());
402        assertTrue("isGB( H )", H.isGB());
403        //non-com assertTrue("equals(H,I)", H.equals(I)); // GBs only
404
405        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
406        assertTrue("not isZERO( a )", !a.isZERO());
407        L.add(a);
408        assertTrue("not isZERO( d )", !d.isZERO());
409        L.add(d);
410        L = bb.leftGB(L);
411
412        I = new SolvableIdeal<BigRational>(fac, L, true);
413        assertTrue("not isZERO( I )", !I.isZERO());
414        //assertTrue("not isONE( J )", !J.isONE() );
415        assertTrue("isGB( I )", I.isGB());
416
417        K = I.product(J);
418        assertTrue("not isZERO( K )", !K.isZERO());
419        assertTrue("isGB( K )", K.isGB());
420        //non-com assertTrue("I contains(K)", I.contains(K));
421        assertTrue("J contains(K)", J.contains(K));
422
423        H = K.quotient(J);
424        assertTrue("not isZERO( H )", !H.isZERO());
425        assertTrue("isGB( H )", H.isGB());
426        //non-com assertTrue("equals(H,I)", H.equals(I)); // GBs only
427    }
428
429
430    /**
431     * Test SolvableIdeal infinite quotient.
432     */
433    public void testSolvableIdealInfiniteQuotient() {
434        SolvableIdeal<BigRational> I, J, K;
435        a = fac.random(kl, ll - 2, el, q);
436        b = fac.random(kl, ll - 1, el - 1, q);
437        c = fac.random(kl, ll / 2, el - 1, q / 2);
438        //a = fac.parse(" -1/2 w");
439        //b = fac.parse(" y - 2/3");
440        //c = fac.parse(" -2 w * y + 4/3 w + 2");
441        //c = fac.parse(" -2 y^2 + 8/3 y - 8/9");
442        d = c; //fac.random(kl, ll, el, q);
443        e = d; //fac.random(kl, ll, el, q );
444
445        if (a.isZERO() || b.isZERO() || c.isZERO() || d.isZERO()) {
446            return;
447        }
448
449        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
450        assertTrue("not isZERO( b )", !b.isZERO());
451        L.add(b);
452        L = bb.leftGB(L);
453        I = new SolvableIdeal<BigRational>(fac, L, true);
454        assertTrue("not isZERO( I )", !I.isZERO());
455        //assertTrue("not isONE( I )", !I.isONE() );
456        assertTrue("isGB( I )", I.isGB());
457
458        J = I.infiniteQuotient(a);
459
460        assertTrue("not isZERO( c )", !c.isZERO());
461        L.add(c);
462        L = bb.leftGB(L);
463        I = new SolvableIdeal<BigRational>(fac, L, true);
464        assertTrue("not isZERO( I )", !I.isZERO());
465        //assertTrue("not isONE( I )", !I.isONE() );
466        assertTrue("isGB( I )", I.isGB());
467
468        J = I.infiniteQuotient(a);
469        assertTrue("equals(J,I)", J.equals(I)); // GBs only
470
471        assertTrue("not isZERO( d )", !d.isZERO());
472        L.add(d);
473        L = bb.leftGB(L);
474        I = new SolvableIdeal<BigRational>(fac, L, true);
475        assertTrue("not isZERO( I )", !I.isZERO());
476        //assertTrue("not isONE( I )", !I.isONE() );
477        assertTrue("isGB( I )", I.isGB());
478
479        J = I.infiniteQuotient(a);
480        assertTrue("isGB( J )", J.isGB());
481        assertTrue("equals(J,I)", J.equals(I)); // GBs only
482
483        G = new ArrayList<GenSolvablePolynomial<BigRational>>();
484        assertTrue("not isZERO( a )", !a.isZERO());
485        G.add(a);
486        G = bb.leftGB(G);
487        K = new SolvableIdeal<BigRational>(fac, G, true);
488        assertTrue("not isZERO( K )", !K.isZERO());
489        //assertTrue("not isONE( I )", !I.isONE() );
490        assertTrue("isGB( K )", K.isGB());
491
492        J = I.infiniteQuotient(K);
493        assertTrue("equals(J,I)", J.equals(I)); // GBs only
494
495        assertTrue("not isZERO( e )", !e.isZERO());
496        G.add(e);
497        G = bb.leftGB(G);
498        K = new SolvableIdeal<BigRational>(fac, G, true);
499        assertTrue("not isZERO( K )", !K.isZERO());
500        //assertTrue("not isONE( I )", !I.isONE() );
501        assertTrue("isGB( K )", K.isGB());
502
503        J = I.infiniteQuotient(K);
504        assertTrue("equals(J,I)", J.equals(I)); // GBs only
505    }
506
507
508    /**
509     * Test (commutative) SolvableIdeal infinite quotient with Rabinowich trick.
510     */
511    public void testSolvableIdealInfiniteQuotientRabi() {
512        fac = new GenSolvablePolynomialRing<BigRational>(fac.coFac, rl, fac.tord, fac.getVars());
513        SolvableIdeal<BigRational> I, J, K, JJ;
514        a = fac.random(kl - 1, ll - 1, el - 1, q / 2);
515        b = fac.random(kl - 1, ll - 1, el, q / 2);
516        c = fac.random(kl - 1, ll - 1, el, q / 2);
517        d = fac.random(kl - 1, ll - 1, el, q / 2);
518        e = a; //fac.random(kl, ll-1, el, q );
519
520        if (a.isZERO() || b.isZERO() || c.isZERO() || d.isZERO()) {
521            return;
522        }
523
524        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
525        assertTrue("not isZERO( b )", !b.isZERO());
526        L.add(b);
527        L = bb.leftGB(L);
528        I = new SolvableIdeal<BigRational>(fac, L, true);
529        assertTrue("not isZERO( I )", !I.isZERO());
530        //assertTrue("not isONE( I )", !I.isONE() );
531        assertTrue("isGB( I )", I.isGB());
532
533        J = I.infiniteQuotientRab(a);
534        JJ = I.infiniteQuotient(a);
535        assertTrue("equals(J,JJ)", J.equals(JJ)); // GBs only
536
537        assertTrue("not isZERO( c )", !c.isZERO());
538        L.add(c);
539        L = bb.leftGB(L);
540        I = new SolvableIdeal<BigRational>(fac, L, true);
541        assertTrue("not isZERO( I )", !I.isZERO());
542        //assertTrue("not isONE( I )", !I.isONE() );
543        assertTrue("isGB( I )", I.isGB());
544
545        J = I.infiniteQuotientRab(a);
546        assertTrue("equals(J,I)", J.equals(I)); // GBs only
547        JJ = I.infiniteQuotient(a);
548        assertTrue("equals(J,JJ)", J.equals(JJ)); // GBs only
549
550        assertTrue("not isZERO( d )", !d.isZERO());
551        L.add(d);
552        L = bb.leftGB(L);
553        I = new SolvableIdeal<BigRational>(fac, L, true);
554        assertTrue("not isZERO( I )", !I.isZERO());
555        //assertTrue("not isONE( I )", !I.isONE() );
556        assertTrue("isGB( I )", I.isGB());
557
558        J = I.infiniteQuotientRab(a);
559        assertTrue("isGB( J )", J.isGB());
560        assertTrue("equals(J,I)", J.equals(I)); // GBs only
561        JJ = I.infiniteQuotient(a);
562        assertTrue("equals(J,JJ)", J.equals(JJ)); // GBs only
563
564        G = new ArrayList<GenSolvablePolynomial<BigRational>>();
565        assertTrue("not isZERO( a )", !a.isZERO());
566        G.add(a);
567        G = bb.leftGB(G);
568        K = new SolvableIdeal<BigRational>(fac, G, true);
569        assertTrue("not isZERO( K )", !K.isZERO());
570        //assertTrue("not isONE( I )", !I.isONE() );
571        assertTrue("isGB( K )", K.isGB());
572
573        J = I.infiniteQuotientRab(K);
574        assertTrue("equals(J,I)", J.equals(I)); // GBs only
575        JJ = I.infiniteQuotient(a);
576        assertTrue("equals(J,JJ)", J.equals(JJ)); // GBs only
577
578        assertTrue("not isZERO( e )", !e.isZERO());
579        G.add(e);
580        G = bb.leftGB(G);
581        K = new SolvableIdeal<BigRational>(fac, G, true);
582        assertTrue("not isZERO( K )", !K.isZERO());
583        //assertTrue("not isONE( I )", !I.isONE() );
584        assertTrue("isGB( K )", K.isGB());
585
586        J = I.infiniteQuotientRab(K);
587        assertTrue("equals(J,I)", J.equals(I)); // GBs only
588        JJ = I.infiniteQuotient(a);
589        assertTrue("equals(J,JJ)", J.equals(JJ)); // GBs only
590    }
591
592
593    /**
594     * Test (commutative) SolvableIdeal radical membership.
595     */
596    public void testSolvableIdealRadicalMember() {
597        fac = new GenSolvablePolynomialRing<BigRational>(fac.coFac, rl, fac.tord, fac.getVars());
598        SolvableIdeal<BigRational> I;
599        a = fac.random(kl - 1, ll, el - 1, q);
600        b = fac.random(kl - 1, ll, el, q);
601        c = fac.random(kl - 1, ll - 1, el, q / 2);
602        //d = fac.random(kl - 1, ll - 1, el, q / 2);
603        //e = a; //fac.random(kl, ll-1, el, q );
604
605        if (a.isZERO() || b.isZERO() || c.isZERO()) {
606            return;
607        }
608
609        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
610        L.add(b);
611        L = bb.leftGB(L);
612        I = new SolvableIdeal<BigRational>(fac, L, true);
613        assertTrue("not isZERO( I )", !I.isZERO());
614        //assertTrue("not isONE( I )", !I.isONE() );
615        assertTrue("isGB( I )", I.isGB());
616
617        //System.out.println("a = " + a);
618        //System.out.println("b = " + b);
619        //System.out.println("I = " + I);
620
621        if (!I.isONE() && !a.equals(b)) {
622            assertFalse("a in radical(b)", I.isRadicalMember(a));
623            assertTrue("b in radical(b)", I.isRadicalMember(b));
624        }
625
626        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
627        L.add(b.multiply(b));
628        L = bb.leftGB(L);
629        I = new SolvableIdeal<BigRational>(fac, L, true);
630        assertTrue("not isZERO( I )", !I.isZERO());
631        //assertTrue("not isONE( I )", !I.isONE() );
632        assertTrue("isGB( I )", I.isGB());
633
634        //System.out.println("I = " + I);
635
636        if (!I.isONE() && !a.equals(b)) {
637            assertFalse("a in radical(b*b)", I.isRadicalMember(a));
638            assertTrue("b in radical(b*b)", I.isRadicalMember(b));
639        }
640
641        //System.out.println("c = " + c);
642        L.add(c);
643        L = bb.leftGB(L);
644        I = new SolvableIdeal<BigRational>(fac, L, true);
645        assertTrue("not isZERO( I )", !I.isZERO());
646        //assertTrue("not isONE( I )", !I.isONE() );
647        assertTrue("isGB( I )", I.isGB());
648
649        //System.out.println("I = " + I);
650
651        if (!I.isONE() && !a.equals(b)) {
652            assertFalse("a in radical(b*b,c)", I.isRadicalMember(a));
653            assertTrue("b in radical(b*b,c)", I.isRadicalMember(b));
654        }
655    }
656
657
658    /**
659     * Test SolvableIdeal common zeros.
660     */
661    @SuppressWarnings("unchecked")
662    public void testSolvableIdealCommonZeros() {
663        SolvableIdeal<BigRational> I;
664        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
665
666        I = new SolvableIdeal<BigRational>(fac, L, true);
667        assertEquals("commonZeroTest( I )", I.commonZeroTest(), 1);
668
669        a = fac.getZERO();
670        L.add(a);
671        I = new SolvableIdeal<BigRational>(fac, L, true);
672        assertEquals("commonZeroTest( I )", I.commonZeroTest(), 1);
673
674        b = fac.getONE();
675        L.add(b);
676        I = new SolvableIdeal<BigRational>(fac, L, true);
677        assertEquals("commonZeroTest( I )", I.commonZeroTest(), -1);
678
679        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
680        a = fac.random(kl, ll, el, q);
681        if (!a.isZERO() && !a.isConstant()) {
682            L.add(a);
683            I = new SolvableIdeal<BigRational>(fac, L, true);
684            assertEquals("commonZeroTest( I )", I.commonZeroTest(), 1);
685        }
686
687        L = (List<GenSolvablePolynomial<BigRational>>) fac.univariateList();
688        I = new SolvableIdeal<BigRational>(fac, L, true);
689        assertEquals("commonZeroTest( I )", I.commonZeroTest(), 0);
690
691        L.remove(0);
692        I = new SolvableIdeal<BigRational>(fac, L, true);
693        assertEquals("commonZeroTest( I )", I.commonZeroTest(), 1);
694    }
695
696
697    /**
698     * Test SolvableIdeal dimension.
699     */
700    @SuppressWarnings("unchecked")
701    public void testSolvableIdealDimension() {
702        SolvableIdeal<BigRational> I;
703        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
704        Dimension dim;
705
706        I = new SolvableIdeal<BigRational>(fac, L, true);
707        assertEquals("dimension( I )", rl, I.dimension().d);
708
709        a = fac.getZERO();
710        L.add(a);
711        I = new SolvableIdeal<BigRational>(fac, L, true);
712        assertEquals("dimension( I )", rl, I.dimension().d);
713
714        b = fac.getONE();
715        L.add(b);
716        I = new SolvableIdeal<BigRational>(fac, L, true);
717        assertEquals("dimension( I )", -1, I.dimension().d);
718
719        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
720        a = fac.random(kl, ll, el, q);
721        if (!a.isZERO() && !a.isConstant()) {
722            L.add(a);
723            I = new SolvableIdeal<BigRational>(fac, L, true);
724            //System.out.println("a = " + a);
725            dim = I.dimension();
726            //System.out.println("dim(I) = " + dim);
727            assertTrue("dimension( I )", dim.d >= 1);
728        }
729
730        L = (List<GenSolvablePolynomial<BigRational>>) fac.univariateList();
731        I = new SolvableIdeal<BigRational>(fac, L, true);
732        dim = I.dimension();
733        assertEquals("dimension( I )", 0, dim.d);
734
735        while (L.size() > 0) {
736            L.remove(0);
737            I = new SolvableIdeal<BigRational>(fac, L, true);
738            //System.out.println("I = " + I);
739            dim = I.dimension();
740            //System.out.println("dim(I) = " + dim);
741            assertEquals("dimension( I )", rl - L.size(), dim.d);
742        }
743
744        L = (List<GenSolvablePolynomial<BigRational>>) fac.univariateList();
745        I = new SolvableIdeal<BigRational>(fac, L, true);
746        I = I.product(I);
747        //System.out.println("I = " + I);
748        dim = I.dimension();
749        //System.out.println("dim(I) = " + dim);
750        assertTrue("dimension( I )", 0 >= dim.d);
751
752        L = I.getList();
753        while (L.size() > 0) {
754            L.remove(0);
755            I = new SolvableIdeal<BigRational>(fac, L, true);
756            //System.out.println("I = " + I);
757            dim = I.dimension();
758            //System.out.println("dim(I) = " + dim);
759            assertTrue("dimension( I )", dim.d > 0);
760        }
761    }
762
763
764    /**
765     * Test elimination SolvableIdeals.
766     */
767    public void testElimSolvableIdeal() {
768        BigRational coeff = new BigRational(17, 1);
769        String[] vars = new String[] { "w", "x", "y", "z" };
770        fac = new GenSolvablePolynomialRing<BigRational>(coeff, rl, to, vars);
771        RelationGenerator<BigRational> wli = new WeylRelationsIterated<BigRational>();
772        wli.generate(fac);
773        //String[] vars = fac.getVars();
774        //System.out.println("vars = " + Arrays.toString(vars));
775        //System.out.println("fac = " + fac);
776
777        SolvableIdeal<BigRational> I, J, K;
778        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
779        //non-com
780        a = fac.univariate(0, 3L); //fac.random(kl, ll, el, q );
781        b = fac.univariate(1, 2L); //fac.random(kl, ll, el, q );
782        c = fac.univariate(0, 1L); //fac.random(kl, ll, el, q );
783
784        L.add(a);
785        //L.add(b);
786        L.add(c);
787
788        I = new SolvableIdeal<BigRational>(fac, L);
789        I.doGB();
790        //System.out.println("I = " + I.toScript());
791        assertTrue("not isZERO( I )", !I.isZERO());
792        //assertTrue("not isONE( I )", !I.isONE());
793        assertTrue("isGB( I )", I.isGB());
794
795        List<String> sv = new ArrayList<String>(vars.length);
796        for (int i = 0; i < vars.length; i++) {
797            sv.add(vars[i]);
798        }
799        //System.out.println("sv    = " + sv);
800
801        for (int i = 2; i <= vars.length; i = i + 2) {
802            KsubSet<String> ps = new KsubSet<String>(sv, i);
803            //System.out.println("========================== ps : " + i);
804            for (List<String> ev : ps) {
805                int si = Collections.indexOfSubList(sv, ev);
806                if (si < 0 || si % 2 != 0) { // substring and iterated Weyl algebra
807                    continue;
808                }
809                //System.out.println("ev = " + ev);
810                List<String> svr = new ArrayList<String>(vars.length);
811                K = null;
812                if (si != 0) { // and substring on even index
813                    svr.addAll(ev);
814                    for (String e : sv) {
815                        if (svr.contains(e)) {
816                            continue;
817                        }
818                        svr.add(e);
819                    }
820                    //System.out.println("svr = " + svr);
821                    String[] rvars = new String[svr.size()];
822                    for (int j = 0; j < svr.size(); j++) {
823                        rvars[j] = svr.get(j);
824                    }
825                    List<Integer> P = new ArrayList<Integer>(sv.size());
826                    for (int j = 0; j < rvars.length; j++) {
827                        int k = sv.indexOf(rvars[j]);
828                        P.add(k);
829                    }
830                    //System.out.println("P = " + P);
831                    GenSolvablePolynomialRing<BigRational> rfac;
832                    rfac = (GenSolvablePolynomialRing<BigRational>) fac.permutation(P);
833                    //System.out.println("rfac = " + rfac.toScript());
834                    List<GenSolvablePolynomial<BigRational>> id = TermOrderOptimization
835                                    .<BigRational> permutation(P, rfac, I.list.castToSolvableList());
836                    K = new SolvableIdeal<BigRational>(rfac, id);
837                    //System.out.println("K = " + K.toScript());
838                    //continue;
839                }
840                String[] evars = new String[ev.size()];
841                for (int j = 0; j < ev.size(); j++) {
842                    evars[j] = ev.get(j);
843                }
844                GenSolvablePolynomialRing<BigRational> efac;
845                efac = new GenSolvablePolynomialRing<BigRational>(fac.coFac, evars.length, fac.tord, evars);
846                //RelationGenerator<BigRational> wl = new WeylRelations<BigRational>();
847                RelationGenerator<BigRational> wl = new WeylRelationsIterated<BigRational>();
848                wl.generate(efac);
849                //System.out.println("efac = " + efac.toScript());
850
851                if (K == null) {
852                    J = I.eliminate(efac);
853                } else {
854                    J = K.eliminate(efac);
855                }
856                //System.out.println("J = " + J.toScript());
857                assertTrue("isGB( J )", J.isGB());
858                assertTrue("size( J ) <=  |ev|", J.getList().size() <= ev.size());
859            }
860        }
861    }
862
863
864    /**
865     * Test univariate polynomials in ideal.
866     */
867    public void testUnivPoly() {
868        String[] vars;
869        BigRational coeff = new BigRational(17, 1);
870        to = new TermOrder(TermOrder.INVLEX);
871        vars = new String[] { "w", "x", "y", "z" };
872        fac = new GenSolvablePolynomialRing<BigRational>(coeff, rl, to, vars);
873
874        vars = fac.getVars();
875        //System.out.println("vars = " + Arrays.toString(vars));
876        //System.out.println("fac = " + fac);
877        assertTrue("vars.length == 4 ", vars.length == 4);
878
879        SolvableIdeal<BigRational> I;
880        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
881
882        a = fac.parse("( x^3 + 34/55 x^2 + 1/9 x + 99 )");
883        b = fac.parse("( y^4 - x )");
884        c = fac.parse("( z^3 - x y )");
885        d = fac.parse("( w^2 + 3 )");
886
887        if (a.isZERO() || b.isZERO() || c.isZERO()) {
888            return;
889        }
890
891        L.add(a);
892        L.add(b);
893        L.add(c);
894        L.add(d);
895        I = new SolvableIdeal<BigRational>(fac, L);
896        //I.doGB();
897        assertTrue("not isZERO( I )", !I.isZERO());
898        assertTrue("isGB( I )", I.isGB());
899        //System.out.println("I = " + I);
900
901        for (int i = 0; i < rl; i++) { // rl
902            GenSolvablePolynomial<BigRational> u = I.constructUnivariate(rl - 1 - i);
903            //System.out.println("u = " + u);
904            GenSolvablePolynomial<BigRational> U = fac.parse(u.toString());
905            //System.out.println("U = " + U + "\n");
906            assertTrue("I.contains(U) ", I.contains(U));
907        }
908
909        List<GenSolvablePolynomial<BigRational>> Us = I.constructUnivariate();
910        for (GenSolvablePolynomial<BigRational> u : Us) {
911            //System.out.println("u = " + u);
912            GenSolvablePolynomial<BigRational> U = fac.parse(u.toString());
913            //System.out.println("U = " + U + "\n");
914            assertTrue("I.contains(U) ", I.contains(U));
915        }
916    }
917
918
919    /**
920     * Test SolvableIdeal annihilator.
921     */
922    public void testAnnihilator() {
923        SolvableIdeal<BigRational> I, J, K;
924        do {
925            a = fac.random(kl, ll, el, q);
926        } while (a.isZERO() || a.isConstant());
927        b = fac.univariate(1);
928        c = fac.univariate(rl - 1);
929        //b = fac.random(kl - 1, ll, el, q);
930        //c = fac.random(kl - 1, ll - 1, el, q / 2);
931
932        L = new ArrayList<GenSolvablePolynomial<BigRational>>();
933        L.add(a);
934        L.add(b);
935        //L.add(c);
936        //System.out.println("L = " + L);
937        L = bb.leftGB(L);
938        I = new SolvableIdeal<BigRational>(fac, L, true);
939        assertTrue("isGB( I )", I.isGB());
940        //System.out.println("I = " + I + "\n");
941
942        J = I.annihilator(c);
943        //System.out.println("J = " + J + "\n");
944        J.doGB();
945        //System.out.println("c = " + c);
946        //System.out.println("J = " + J + "\n");
947        assertTrue("isAnnihilator(c,J)", I.isAnnihilator(c, J));
948
949        d = fac.univariate(rl - 2);
950        //d = fac.random(kl - 1, ll, el, q);
951        M = new ArrayList<GenSolvablePolynomial<BigRational>>();
952        M.add(c);
953        M.add(d);
954        //System.out.println("M = " + M);
955        K = new SolvableIdeal<BigRational>(fac, M);
956        //System.out.println("K = " + K + "\n");
957
958        J = I.annihilator(K);
959        //System.out.println("J = " + J + "\n");
960        J.doGB();
961        //System.out.println("K = " + K);
962        //System.out.println("J = " + J + "\n");
963        assertTrue("isAnnihilator(M,J)", I.isAnnihilator(K, J));
964    }
965
966}