001/*
002 * $Id: GCDLeftRightTest.java 5863 2018-07-20 11:13:34Z kredel $
003 */
004
005package edu.jas.fd;
006
007
008
009import edu.jas.arith.BigQuaternion;
010import edu.jas.arith.BigQuaternionRing;
011import edu.jas.gbufd.SolvableSyzygyAbstract;
012import edu.jas.gbufd.SolvableSyzygySeq;
013import edu.jas.kern.ComputerThreads;
014import edu.jas.poly.GenPolynomial;
015import edu.jas.poly.GenSolvablePolynomial;
016import edu.jas.poly.GenSolvablePolynomialRing;
017import edu.jas.poly.RecSolvablePolynomialRing;
018import edu.jas.poly.RelationGenerator;
019import edu.jas.poly.TermOrder;
020import edu.jas.poly.TermOrderByName;
021import edu.jas.poly.WeylRelationsIterated;
022import edu.jas.structure.GcdRingElem;
023
024import junit.framework.Test;
025import junit.framework.TestCase;
026import junit.framework.TestSuite;
027
028
029/**
030 * GCD LeftRight PRS algorithm tests with JUnit. <b>Note:</b> not in sync with
031 * implementation.
032 * @author Heinz Kredel
033 */
034
035public class GCDLeftRightTest extends TestCase {
036
037
038    /**
039     * main.
040     */
041    public static void main(String[] args) {
042        junit.textui.TestRunner.run(suite());
043        ComputerThreads.terminate();
044    }
045
046
047    /**
048     * Constructs a <CODE>GCDLeftRightTest</CODE> object.
049     * @param name String.
050     */
051    public GCDLeftRightTest(String name) {
052        super(name);
053    }
054
055
056    /**
057     */
058    public static Test suite() {
059        TestSuite suite = new TestSuite(GCDLeftRightTest.class);
060        return suite;
061    }
062
063
064    //GreatestCommonDivisorAbstract<BigQuaternion> fd;
065    GreatestCommonDivisorLR<BigQuaternion> fd;
066
067
068    TermOrder to = TermOrderByName.INVLEX;
069
070
071    BigQuaternionRing cfac;
072
073
074    GenSolvablePolynomialRing<BigQuaternion> dfac;
075
076
077    //GenSolvablePolynomialRing<GenPolynomial<BigQuaternion>> rfac;
078    RecSolvablePolynomialRing<BigQuaternion> rfac;
079
080
081    GenSolvablePolynomial<BigQuaternion> a, b, c, d, e, f, g, h, r, s;
082
083
084    GenSolvablePolynomial<GenPolynomial<BigQuaternion>> ar, br, cr, dr, er;
085
086
087    SolvableSyzygyAbstract<BigQuaternion> syz;
088
089
090    int rl = 4;
091
092
093    int kl = 2;
094
095
096    int ll = 4;
097
098
099    int el = 3;
100
101
102    float q = 0.35f;
103
104
105    @Override
106    protected void setUp() {
107        a = b = c = d = e = null;
108        ar = br = cr = dr = er = null;
109        String[] vars = new String[] { "a", "b", "c", "d" };
110        cfac = new BigQuaternionRing();
111        syz = new SolvableSyzygySeq<BigQuaternion>(cfac);
112        //System.out.println("syz = " + syz);
113        fd = new GreatestCommonDivisorLR<BigQuaternion>(cfac, syz);
114        //fd = new GreatestCommonDivisorFake<BigQuaternion>(cfac);
115        dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, rl, to, vars);
116        RelationGenerator<BigQuaternion> wl = new WeylRelationsIterated<BigQuaternion>();
117        dfac.addRelations(wl);
118        rfac = (RecSolvablePolynomialRing<BigQuaternion>) dfac.recursive(1);
119        //System.out.println("dfac = " + dfac);
120    }
121
122
123    @Override
124    protected void tearDown() {
125        a = b = c = d = e = null;
126        ar = br = cr = dr = er = null;
127        fd = null;
128        cfac = null;
129        dfac = null;
130        rfac = null;
131        syz = null;
132    }
133
134
135    /**
136     * Test base field gcd left - right.
137     */
138    public void testBaseGcdLeftRight() {
139        String[] uvars = new String[] { "x" };
140        dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars);
141        BigQuaternion cc;
142        for (int i = 0; i < 1; i++) {
143            a = dfac.random(kl * (i + 2), ll + i, el + 1, q);
144            b = dfac.random(kl * (i + 1), ll + i, el + 1, q);
145            c = dfac.random(kl * (i + 1), ll + 1, el + 0, q);
146            //c = dfac.getONE(); 
147            c = c.multiply(dfac.univariate(0));
148            cc = cfac.random(kl);
149            //c = c.multiplyLeft(cc);
150            if (c.isZERO() || cc.isZERO()) {
151                // skip for this turn
152                continue;
153            }
154            //a = fd.basePrimitivePart(a);
155            //b = fd.basePrimitivePart(b);
156            //c = (GenSolvablePolynomial<BigQuaternion>) fd.basePrimitivePart(c).abs();
157            //System.out.println("a  = " + a);
158            //System.out.println("b  = " + b);
159            //System.out.println("cc = " + cc);
160            //System.out.println("c  = " + c);
161
162            a = a.multiply(c).multiplyLeft(cc);
163            b = b.multiply(c).multiplyLeft(cc);
164            //System.out.println("a  = " + a);
165            //System.out.println("b  = " + b);
166
167            GCDcoFactors<BigQuaternion> cont = fd.leftRightBaseGcd(a, b);
168            //d = (GenSolvablePolynomial<BigQuaternion>) cont.left;
169            //System.out.println("cont = " + cont);
170            //System.out.println("cont.isGCD() = " + cont.isGCD());
171            assertTrue("cont.isGCD() ", cont.isGCD());
172        }
173    }
174
175
176    /**
177     * Test base field gcd right - left.
178     */
179    public void testBaseGcdRightLeft() {
180        String[] uvars = new String[] { "x" };
181        dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars);
182        BigQuaternion cc;
183        for (int i = 0; i < 1; i++) {
184            a = dfac.random(kl * (i + 2), ll + i, el + 1, q);
185            b = dfac.random(kl * (i + 1), ll + i, el + 1, q);
186            c = dfac.random(kl * (i + 1), ll + 1, el + 0, q);
187            //c = dfac.getONE(); 
188            c = c.multiply(dfac.univariate(0));
189            cc = cfac.random(kl);
190            //c = c.multiplyLeft(cc);
191            if (c.isZERO() || cc.isZERO()) {
192                // skip for this turn
193                continue;
194            }
195            //a = fd.basePrimitivePart(a);
196            //b = fd.basePrimitivePart(b);
197            //c = (GenSolvablePolynomial<BigQuaternion>) fd.basePrimitivePart(c).abs();
198            //System.out.println("a  = " + a);
199            //System.out.println("b  = " + b);
200            //System.out.println("cc = " + cc);
201            //System.out.println("c  = " + c);
202
203            a = c.multiply(cc).multiply(a);
204            b = c.multiply(cc).multiply(b);
205            //System.out.println("a  = " + a);
206            //System.out.println("b  = " + b);
207
208            GCDcoFactors<BigQuaternion> cont = fd.rightLeftBaseGcd(a, b);
209            //d = (GenSolvablePolynomial<BigQuaternion>) cont.left;
210            //System.out.println("cont = " + cont);
211            //System.out.println("cont.isGCD() = " + cont.isGCD());
212            assertTrue("cont.isGCD() ", cont.isGCD());
213        }
214    }
215
216
217    /**
218     * Test base field left gcd.
219     */
220    public void testBaseLeftGcd() {
221        String[] uvars = new String[] { "x" };
222        dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars);
223        BigQuaternion cc;
224        for (int i = 0; i < 1; i++) {
225            a = dfac.random(kl * (i + 2), ll + i, el + 1, q);
226            b = dfac.random(kl * (i + 1), ll + i, el + 1, q);
227            c = dfac.random(kl * (i + 1), ll + 1, el + 0, q);
228            //c = dfac.getONE(); 
229            c = c.multiply(dfac.univariate(0));
230            cc = cfac.random(kl);
231            c = c.multiplyLeft(cc);
232            if (c.isZERO() || cc.isZERO()) {
233                // skip for this turn
234                continue;
235            }
236            //a = fd.basePrimitivePart(a);
237            //b = fd.basePrimitivePart(b);
238            //c = (GenSolvablePolynomial<BigQuaternion>) fd.basePrimitivePart(c).abs();
239            //System.out.println("a  = " + a);
240            //System.out.println("b  = " + b);
241            ////System.out.println("cc = " + cc);
242            //System.out.println("c  = " + c);
243
244            a = c.multiply(a);
245            b = c.multiply(b);
246            //System.out.println("a  = " + a);
247            //System.out.println("b  = " + b);
248
249            d = fd.leftBaseGcd(a, b);
250            //System.out.println("c = " + c);
251            //System.out.println("d = " + d);
252            //assertTrue("cont.isGCD() ", cont.isGCD());
253
254            e = FDUtil.<BigQuaternion> rightBaseSparsePseudoRemainder(a, d);
255            //System.out.println("e = " + e);
256            assertTrue("e == 0 ", e.isZERO());
257            f = FDUtil.<BigQuaternion> rightBaseSparsePseudoRemainder(b, d);
258            //System.out.println("f = " + f);
259            assertTrue("f == 0 ", f.isZERO());
260        }
261    }
262
263
264    /**
265     * Test base field right gcd.
266     */
267    public void testBaseRightGcd() {
268        String[] uvars = new String[] { "x" };
269        dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars);
270        BigQuaternion cc;
271        for (int i = 0; i < 1; i++) {
272            a = dfac.random(kl * (i + 2), ll + i, el + 1, q);
273            b = dfac.random(kl * (i + 1), ll + i, el + 1, q);
274            c = dfac.random(kl * (i + 1), ll + 1, el + 0, q);
275            //c = dfac.getONE(); 
276            c = c.multiply(dfac.univariate(0));
277            cc = cfac.random(kl);
278            c = c.multiply(cc);
279            if (c.isZERO() || cc.isZERO()) {
280                // skip for this turn
281                continue;
282            }
283            //a = fd.basePrimitivePart(a);
284            //b = fd.basePrimitivePart(b);
285            //c = (GenSolvablePolynomial<BigQuaternion>) fd.basePrimitivePart(c).abs();
286            //System.out.println("a  = " + a);
287            //System.out.println("b  = " + b);
288            ////System.out.println("cc = " + cc);
289            //System.out.println("c  = " + c);
290
291            a = a.multiply(c);
292            b = b.multiply(c);
293            //System.out.println("a  = " + a);
294            //System.out.println("b  = " + b);
295
296            d = fd.rightBaseGcd(a, b);
297            //System.out.println("c = " + c);
298            //System.out.println("d = " + d);
299            //assertTrue("cont.isGCD() ", cont.isGCD());
300
301            e = FDUtil.<BigQuaternion> leftBaseSparsePseudoRemainder(a, d);
302            //System.out.println("e = " + e);
303            assertTrue("e == 0 ", e.isZERO());
304            f = FDUtil.<BigQuaternion> leftBaseSparsePseudoRemainder(b, d);
305            //System.out.println("f = " + f);
306            assertTrue("f == 0 ", f.isZERO());
307        }
308    }
309
310
311    /**
312     * Test base integer gcd left - right.
313     */
314    public void testBaseIntegerGcdLeftRight() {
315        String[] uvars = new String[] { "x" };
316        cfac = new BigQuaternionRing(true);
317        syz = new SolvableSyzygySeq<BigQuaternion>(cfac);
318        //System.out.println("syz = " + syz);
319        dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars);
320        fd = new GreatestCommonDivisorLR<BigQuaternion>(cfac, syz);
321        BigQuaternion cc;
322        for (int i = 0; i < 1; i++) {
323            a = dfac.random(kl * (i + 2), ll + 1, el + 2, q);
324            b = dfac.random(kl * (i + 1), ll + 1, el + 2, q);
325            c = dfac.random(kl * (i + 1), ll + 1, el + 1, q);
326            //c = dfac.getONE(); 
327            c = c.multiply(dfac.univariate(0));
328            c = (GenSolvablePolynomial<BigQuaternion>) c.abs();
329            cc = cfac.random(kl);
330            //cc = cfac.getONE(); 
331            //c = c.multiplyLeft(cc);
332            if (c.isZERO() || cc.isZERO()) {
333                // skip for this turn
334                continue;
335            }
336            //a = fd.basePrimitivePart(a);
337            //b = fd.basePrimitivePart(b);
338            //c = (GenSolvablePolynomial<BigQuaternion>) fd.basePrimitivePart(c).abs();
339            // replace - by ~ in coefficents for polynomial tokenizer
340            //a = dfac.parse("( 3/2i1/2j1/2k~1/2 ) x^3 - ( 1i~1j0k~2 ) x + ( 11/2i15/2j1/2k~1/2 )");
341            //b = dfac.parse("( ~1i2j3k1 ) x^4 + ( 0i1j~2k0 ) x^2 + ( 1/2i~3/2j1/2k3/2 )");
342            //c = dfac.parse("( 1/2i1/2j~1/2k1/2 ) x^4 + ( 1i~1j0k0 ) x^3 + 1i1j0k1 x");
343
344            //System.out.println("a  = " + a);
345            //System.out.println("b  = " + b);
346            //System.out.println("cc = " + cc);
347            //System.out.println("c  = " + c);
348
349            a = a.multiply(c).multiplyLeft(cc);
350            b = b.multiply(c).multiplyLeft(cc);
351            //System.out.println("a  = " + a);
352            //System.out.println("b  = " + b);
353
354            GCDcoFactors<BigQuaternion> cont = fd.leftRightBaseGcd(a, b);
355            //d = (GenSolvablePolynomial<BigQuaternion>) cont.left;
356            //System.out.println("cont = " + cont);
357            //System.out.println("cont.isGCD() = " + cont.isGCD());
358            //System.out.println("r = " + cont.right + ", l=" + cont.left);
359            //System.out.println("c = " + c + ", cc = " + cc); 
360            assertTrue("cont.isGCD() ", cont.isGCD());
361        }
362    }
363
364
365    /**
366     * Test base integer gcd right - left.
367     */
368    public void testBaseIntegerGcdRightLeft() {
369        String[] uvars = new String[] { "x" };
370        cfac = new BigQuaternionRing(true);
371        syz = new SolvableSyzygySeq<BigQuaternion>(cfac);
372        //System.out.println("syz = " + syz);
373        dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars);
374        fd = new GreatestCommonDivisorLR<BigQuaternion>(cfac, syz);
375        BigQuaternion cc;
376        for (int i = 0; i < 1; i++) {
377            a = dfac.random(kl * (i + 2), ll + 1, el + 2, q);
378            b = dfac.random(kl * (i + 1), ll + 1, el + 2, q);
379            c = dfac.random(kl * (i + 1), ll + 1, el + 1, q);
380            //c = dfac.getONE(); 
381            c = c.multiply(dfac.univariate(0));
382            c = (GenSolvablePolynomial<BigQuaternion>) c.abs();
383            cc = cfac.random(kl);
384            //cc = cfac.getONE(); 
385            //c = c.multiplyLeft(cc);
386            if (c.isZERO() || cc.isZERO()) {
387                // skip for this turn
388                continue;
389            }
390            //System.out.println("a  = " + a);
391            //System.out.println("b  = " + b);
392            //System.out.println("cc = " + cc);
393            //System.out.println("c  = " + c);
394
395            a = a.multiply(c).multiplyLeft(cc);
396            b = b.multiply(c).multiplyLeft(cc);
397            //System.out.println("a  = " + a);
398            //System.out.println("b  = " + b);
399
400            GCDcoFactors<BigQuaternion> cont = fd.rightLeftBaseGcd(a, b);
401            //d = (GenSolvablePolynomial<BigQuaternion>) cont.left;
402            //System.out.println("cont = " + cont);
403            //System.out.println("cont.isGCD() = " + cont.isGCD());
404            //System.out.println("r = " + cont.right + ", l=" + cont.left);
405            //System.out.println("c = " + c + ", cc = " + cc); 
406            assertTrue("cont.isGCD() ", cont.isGCD());
407        }
408    }
409
410
411    /**
412     * Test base integral left gcd.
413     */
414    public void testBaseIntegralLeftGcd() {
415        String[] uvars = new String[] { "x" };
416        cfac = new BigQuaternionRing(true);
417        syz = new SolvableSyzygySeq<BigQuaternion>(cfac);
418        //System.out.println("syz = " + syz);
419        dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars);
420        fd = new GreatestCommonDivisorLR<BigQuaternion>(cfac, syz);
421        BigQuaternion cc;
422        for (int i = 0; i < 1; i++) {
423            a = dfac.random(kl * (i + 2), ll + i, el + 1, q);
424            b = dfac.random(kl * (i + 1), ll + i, el + 1, q);
425            c = dfac.random(kl * (i + 1), ll + 1, el + 0, q);
426            //c = dfac.getONE(); 
427            c = c.multiply(dfac.univariate(0));
428            cc = cfac.random(kl);
429            c = c.multiplyLeft(cc);
430            if (c.isZERO() || cc.isZERO()) {
431                // skip for this turn
432                continue;
433            }
434            // replace - by ~ in coefficents for polynomial tokenizer
435            //a = dfac.parse("( 1i0j~1k0 ) x^2 - ( 9/2i5/2j~1/2k~1/2 ) x + 5/2i5/2j9/2k3/2");
436            //b = dfac.parse("1i1j1k1 x^3 + ( 1i~1j1k1 )");
437            ////c = dfac.parse("( ~3i11j~3k~1 ) x^2 - ( 5i~10j~5k0 ) x");
438            //c = dfac.parse("( ~3i11j~3k~1 ) x - ( 5i~10j~5k0 ) ");
439
440            //System.out.println("a  = " + a);
441            //System.out.println("b  = " + b);
442            ////System.out.println("cc = " + cc);
443            //System.out.println("c  = " + c);
444
445            a = c.multiply(a);
446            b = c.multiply(b);
447            //System.out.println("a  = " + a);
448            //System.out.println("b  = " + b);
449
450            d = fd.leftBaseGcd(a, b);
451            //System.out.println("c = " + c);
452            //System.out.println("d = " + d);
453
454            e = FDUtil.<BigQuaternion> rightBaseSparsePseudoRemainder(a, d);
455            //System.out.println("e = " + e);
456            assertTrue("e == 0 ", e.isZERO());
457            f = FDUtil.<BigQuaternion> rightBaseSparsePseudoRemainder(b, d);
458            //System.out.println("f = " + f);
459            assertTrue("f == 0 ", f.isZERO());
460        }
461    }
462
463
464    /**
465     * Test base integral right gcd.
466     */
467    public void testBaseIntegralRightGcd() {
468        String[] uvars = new String[] { "x" };
469        cfac = new BigQuaternionRing(true);
470        syz = new SolvableSyzygySeq<BigQuaternion>(cfac);
471        //System.out.println("syz = " + syz);
472        dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars);
473        fd = new GreatestCommonDivisorLR<BigQuaternion>(cfac, syz);
474        BigQuaternion cc;
475        for (int i = 0; i < 1; i++) {
476            a = dfac.random(kl * (i + 2), ll + i, el + 1, q);
477            b = dfac.random(kl * (i + 1), ll + i, el + 1, q);
478            c = dfac.random(kl * (i + 1), ll + 1, el + 0, q);
479            //c = dfac.getONE(); 
480            c = c.multiply(dfac.univariate(0));
481            cc = cfac.random(kl);
482            c = c.multiply(cc);
483            if (c.isZERO() || cc.isZERO()) {
484                // skip for this turn
485                continue;
486            }
487            // replace - by ~ in coefficents for polynomial tokenizer
488            //a = dfac.parse("( 5/2i~1/2j~3/2k~3/2 ) x^2 - ( 1i0j0k~1 )");
489            //b = dfac.parse("( 1i~1j1k0 ) x^2 - 1i2j0k0 x + ( 1/2i1/2j~1/2k3/2 )");
490            //c = dfac.parse("( 0i~1j~2k~14 ) x");
491
492            //System.out.println("a  = " + a);
493            //System.out.println("b  = " + b);
494            ////System.out.println("cc = " + cc);
495            //System.out.println("c  = " + c);
496
497            a = a.multiply(c);
498            b = a.multiply(c);
499            //System.out.println("a  = " + a);
500            //System.out.println("b  = " + b);
501
502            d = fd.rightBaseGcd(a, b);
503            //System.out.println("c = " + c);
504            //System.out.println("d = " + d);
505            //d = fd.leftBasePrimitivePart(fd.rightBasePrimitivePart(d));
506            //System.out.println("d = " + d);
507
508            e = FDUtil.<BigQuaternion> leftBaseSparsePseudoRemainder(a, d);
509            //System.out.println("e = " + e);
510            assertTrue("e == 0 ", e.isZERO());
511            f = FDUtil.<BigQuaternion> leftBaseSparsePseudoRemainder(b, d);
512            //System.out.println("f = " + f);
513            assertTrue("f == 0 ", f.isZERO());
514        }
515    }
516
517
518    /**
519     * Test base integer quotient remainder.
520     */
521    public void testBaseQR() {
522        String[] uvars = new String[] { "x" };
523        cfac = new BigQuaternionRing(true);
524        syz = new SolvableSyzygySeq<BigQuaternion>(cfac);
525        //System.out.println("syz = " + syz);
526        dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars);
527        fd = new GreatestCommonDivisorLR<BigQuaternion>(cfac, syz);
528        GreatestCommonDivisorAbstract<BigQuaternion> fds = new GreatestCommonDivisorSimple<BigQuaternion>(
529                        cfac);
530        //BigQuaternion cc;
531        for (int i = 0; i < 1; i++) {
532            a = dfac.random(kl * (i + 2), ll + 1, el + 2, q);
533            b = dfac.random(kl * (i + 1), ll + 1, el + 2, q);
534            c = dfac.random(kl * (i + 1), ll + 1, el + 1, q);
535            //c = dfac.getONE(); 
536            c = c.multiply(dfac.univariate(0));
537            c = (GenSolvablePolynomial<BigQuaternion>) c.abs();
538            if (c.isZERO()) {
539                // skip for this turn
540                continue;
541            }
542            //System.out.println("a  = " + a);
543            //System.out.println("b  = " + b);
544            //System.out.println("c  = " + c);
545
546            a = a.multiply(c);
547            b = b.multiply(c);
548            //System.out.println("a  = " + a);
549            //System.out.println("b  = " + b);
550
551            GenSolvablePolynomial<BigQuaternion>[] aqr, bqr;
552
553            aqr = FDUtil.<BigQuaternion> leftBasePseudoQuotientRemainder(a, c);
554            bqr = FDUtil.<BigQuaternion> leftBasePseudoQuotientRemainder(b, c);
555            d = aqr[0];
556            e = bqr[0];
557
558            //System.out.println("d  = " + d + ", rem = " + aqr[1]);
559            //System.out.println("e  = " + e + ", rem = " + bqr[1]);
560            assertTrue("a rem == 0: ", aqr[1].isZERO());
561            assertTrue("b rem == 0: ", bqr[1].isZERO());
562
563            boolean t;
564            f = d.multiply(c);
565            //System.out.println("f  = " + f);
566            //System.out.println("a  = " + a);
567            t = f.equals(a);
568            //System.out.println("d*c == a: " + t);
569
570            BigQuaternion qa, qb, oa, ob;
571            qa = a.leadingBaseCoefficient();
572            qb = f.leadingBaseCoefficient();
573            GcdRingElem<BigQuaternion>[] oc = fd.leftOreCond(qa, qb);
574            oa = (BigQuaternion) oc[0];
575            ob = (BigQuaternion) oc[1];
576
577            a = a.multiplyLeft(oa);
578            f = f.multiplyLeft(ob);
579            //System.out.println("f  = " + f);
580            //System.out.println("a  = " + a);
581            t = f.equals(a);
582            //System.out.println("d*c == a: " + t);
583            assertTrue("d*c == a: ", t);
584
585
586            g = e.multiply(c);
587            //System.out.println("g  = " + g);
588            //System.out.println("b  = " + b);
589            t = g.equals(b);
590            //System.out.println("e*c == b: " + t);
591            assertTrue("e*c == b: ", t || true);
592
593            r = (GenSolvablePolynomial<BigQuaternion>) fds.leftBasePrimitivePart(b).abs();
594            s = (GenSolvablePolynomial<BigQuaternion>) fds.leftBasePrimitivePart(g).abs();
595            //System.out.println("pp(b)  = " + r);
596            //System.out.println("pp(g)  = " + s);
597            assertEquals("pp(b) == pp(g): ", r, s);
598
599            qa = b.leadingBaseCoefficient();
600            qb = g.leadingBaseCoefficient();
601            oc = fd.leftOreCond(qa, qb);
602            oa = (BigQuaternion) oc[0];
603            ob = (BigQuaternion) oc[1];
604
605            b = b.multiplyLeft(oa);
606            g = g.multiplyLeft(ob);
607            //System.out.println("g  = " + g);
608            //System.out.println("b  = " + b);
609            t = g.equals(b);
610            //System.out.println("e*c == b: " + t);
611            assertTrue("e*c == b: ", t);
612        }
613    }
614
615
616    /**
617     * Test base integral left / right pseudo division.
618     */
619    public void testBaseIntegralDivision() {
620        String[] uvars = new String[] { "x" };
621        cfac = new BigQuaternionRing(true);
622        syz = new SolvableSyzygySeq<BigQuaternion>(cfac);
623        //System.out.println("syz = " + syz);
624        dfac = new GenSolvablePolynomialRing<BigQuaternion>(cfac, 1, to, uvars);
625        fd = new GreatestCommonDivisorLR<BigQuaternion>(cfac, syz);
626        BigQuaternion cc;
627        for (int i = 0; i < 1; i++) {
628            a = dfac.random(kl * (i + 2), ll + i, el + 1, q);
629            b = dfac.random(kl * (i + 1), ll + i, el + 1, q);
630            c = dfac.random(kl * (i + 1), ll + 1, el + 0, q);
631            //c = dfac.getONE(); 
632            c = c.multiply(dfac.univariate(0));
633            cc = cfac.random(kl);
634            c = c.multiplyLeft(cc);
635            if (c.isZERO() || cc.isZERO()) {
636                // skip for this turn
637                continue;
638            }
639            // replace - by ~ in coefficents for polynomial tokenizer
640            //a = dfac.parse("( 1i~3j~3k~3 ) x^3 - ( 9i7j~12k~8 ) x^2 + 20i17j14k10 x + ( 19/2i27/2j~31/2k~7/2 ) ");
641            //b = dfac.parse("( 3i2j~1k0 ) x^4 + ( 2i1j~3k~1 ) x^3 + ( 3i0j2k~1 ) x + ( 5/2i3/2j1/2k~5/2 ) ");
642            //c = dfac.parse("0i0j4k0 x - ( 1/2i~1/2j~5/2k~5/2 ) ");
643
644            //System.out.println("a  = " + a);
645            //System.out.println("b  = " + b);
646            ////System.out.println("cc = " + cc);
647            //System.out.println("c  = " + c);
648
649            //System.out.println("ppl(a) = " + fd.leftPrimitivePart(a));
650            //System.out.println("ppl(b) = " + fd.leftPrimitivePart(b));
651            //System.out.println("ppr(a) = " + fd.rightPrimitivePart(a));
652            //System.out.println("ppr(b) = " + fd.rightPrimitivePart(b));
653            //b = fd.rightPrimitivePart(b);
654
655            s = b;
656            r = a;
657            while (!r.isZERO()) {
658                GenSolvablePolynomial<BigQuaternion>[] qr;
659                GenSolvablePolynomial<BigQuaternion> x, y, z;
660                qr = FDUtil.<BigQuaternion> rightBasePseudoQuotientRemainder(s, r);
661                y = qr[0];
662                x = qr[1];
663                z = (GenSolvablePolynomial<BigQuaternion>) r.multiply(y).sum(x);
664                //System.out.println("z = " + z + ", s = " + s);
665                BigQuaternion lz, ls;
666                lz = z.leadingBaseCoefficient();
667                ls = s.leadingBaseCoefficient();
668                GcdRingElem[] oc = fd.rightOreCond(lz, ls);
669                z = z.multiply((BigQuaternion) oc[0]);
670                s = s.multiply((BigQuaternion) oc[1]);
671                //System.out.println("z * oa = " + z);
672                //System.out.println("s * os = " + s);
673                //System.out.println("z * oz == s * os: " + z.equals(s));
674                assertEquals("z * oz == s * os: ", z, s);
675                s = r;
676                r = x;
677                //System.out.println("r  = " + r);
678            }
679            //System.out.println("s  = " + s);
680            //s = fd.rightPrimitivePart(s);
681            //s = fd.leftPrimitivePart(s);
682            //System.out.println("s  = " + s);
683            //System.out.println("c  = " + c + ", s==c: " + s.equals(c));
684            g = s;
685
686            GenSolvablePolynomial<BigQuaternion>[] qr;
687            qr = FDUtil.<BigQuaternion> rightBasePseudoQuotientRemainder(a, g);
688            d = qr[0];
689            h = (GenSolvablePolynomial<BigQuaternion>) g.multiply(d).sum(qr[1]);
690            //System.out.println("h  = " + h);
691            //System.out.println("a  = " + a);
692
693            BigQuaternion lh, la, lb;
694            lh = h.leadingBaseCoefficient();
695            la = a.leadingBaseCoefficient();
696            GcdRingElem[] oc = fd.rightOreCond(lh, la);
697            h = h.multiply((BigQuaternion) oc[0]);
698            s = a.multiply((BigQuaternion) oc[1]);
699            assertEquals("h * oh == a * oa: ", h, s);
700
701            //assertTrue("r==0: ", qr[1].isZERO());
702
703            qr = FDUtil.<BigQuaternion> rightBasePseudoQuotientRemainder(b, g);
704            e = qr[0];
705            h = (GenSolvablePolynomial<BigQuaternion>) g.multiply(e).sum(qr[1]);
706            //System.out.println("h  = " + h);
707            //System.out.println("b  = " + b);
708
709            lh = h.leadingBaseCoefficient();
710            lb = b.leadingBaseCoefficient();
711            oc = fd.rightOreCond(lh, lb);
712            h = h.multiply((BigQuaternion) oc[0]);
713            s = b.multiply((BigQuaternion) oc[1]);
714            assertEquals("h * oh == a * oa: ", h, s);
715
716
717            //System.out.println("d  = " + d + ", rem = " + qr[1]);
718            //System.out.println("e  = " + e + ", rem = " + qr[1]);
719            f = g.multiply(d);
720            g = g.multiply(e);
721            //System.out.println("f  = " + f + ", a==f? " + a.equals(f));
722            //System.out.println("g  = " + g + ", b==g? " + b.equals(g));
723
724            BigQuaternion lf, lg;
725            la = a.leadingBaseCoefficient();
726            lb = b.leadingBaseCoefficient();
727            lf = f.leadingBaseCoefficient();
728            lg = g.leadingBaseCoefficient();
729
730            oc = fd.rightOreCond(la, lf);
731            r = a.multiply((BigQuaternion) oc[0]);
732            s = f.multiply((BigQuaternion) oc[1]);
733            //System.out.println("a * oa = " + r);
734            //System.out.println("f * of = " + s);
735            //System.out.println("a * oa == f * of: " + r.equals(s));
736            assertEquals("a * oa == f * of: ", r, s);
737
738            oc = fd.rightOreCond(lb, lg);
739            r = b.multiply((BigQuaternion) oc[0]);
740            s = g.multiply((BigQuaternion) oc[1]);
741            //System.out.println("b * ob = " + r);
742            //System.out.println("g * og = " + s);
743            //System.out.println("b * ob == g * og: " + r.equals(s));
744            assertEquals("b * ob == g * og: ", r, s);
745
746        }
747    }
748}