001/*
002 * $Id$
003 */
004
005package edu.jas.vector;
006
007
008import java.util.ArrayList;
009import java.util.List;
010import java.util.SortedMap;
011
012import edu.jas.arith.BigRational;
013import edu.jas.arith.BigInteger;
014import edu.jas.arith.ModLong;
015import edu.jas.arith.ModLongRing;
016import edu.jas.poly.GenPolynomial;
017import edu.jas.poly.GenPolynomialRing;
018import edu.jas.ufd.FactorAbstract;
019import edu.jas.ufd.FactorFactory;
020import edu.jas.kern.ComputerThreads;
021
022import junit.framework.Test;
023import junit.framework.TestCase;
024import junit.framework.TestSuite;
025
026
027/**
028 * GenMatrix tests with JUnit
029 * @author Heinz Kredel
030 */
031
032public class GenMatrixTest extends TestCase {
033
034
035    /**
036     * main.
037     */
038    public static void main(String[] args) {
039        junit.textui.TestRunner.run(suite());
040    }
041
042
043    /**
044     * Constructs a <CODE>GenMatrixTest</CODE> object.
045     * @param name String.
046     */
047    public GenMatrixTest(String name) {
048        super(name);
049    }
050
051
052    /**
053     */
054    public static Test suite() {
055        TestSuite suite = new TestSuite(GenMatrixTest.class);
056        return suite;
057    }
058
059
060    int rl = 5;
061
062
063    int kl = 10;
064
065
066    int ll = 10;
067
068
069    float q = 0.5f;
070
071
072    int rows = 3 + 20;
073
074
075    int cols = 3 + 20;
076
077
078    @Override
079    protected void setUp() {
080    }
081
082
083    @Override
084    protected void tearDown() {
085    }
086
087
088    /**
089     * Test constructor and toString.
090     */
091    public void testConstruction() {
092        BigRational cfac = new BigRational(1);
093        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
094
095        assertTrue("#rows = " + rows, mfac.rows == rows);
096        assertTrue("#columns = " + cols, mfac.cols == cols);
097        assertTrue("cfac == coFac ", cfac == mfac.coFac);
098
099        GenMatrix<BigRational> a;
100        a = mfac.getZERO();
101        //System.out.println("a = " + a);
102        assertTrue("isZERO( a )", a.isZERO());
103
104        GenMatrix<BigRational> b = new GenMatrix<BigRational>(mfac);
105        //System.out.println("b = " + b);
106        assertTrue("isZERO( b )", b.isZERO());
107
108        assertTrue("a == b ", a.equals(b));
109
110        GenMatrix<BigRational> c = b.copy();
111        //System.out.println("c = " + c);
112        assertTrue("isZERO( c )", c.isZERO());
113        assertTrue("a == c ", a.equals(c));
114
115        GenMatrix<BigRational> d = mfac.copy(b);
116        //System.out.println("d = " + d);
117        assertTrue("isZERO( d )", d.isZERO());
118        assertTrue("a == d ", a.equals(d));
119
120        a = mfac.getONE();
121        //System.out.println("a = " + a);
122        assertTrue("isONE( a )", a.isONE());
123
124        List<ArrayList<BigRational>> m = a.matrix;
125        List<List<BigRational>> ml = new ArrayList<List<BigRational>>(m.size());
126        for (ArrayList<BigRational> r : m) {
127            ml.add(r);
128        }
129        b = mfac.fromList(ml);
130        assertEquals("a == fromList(a.matrix)", a, b);
131
132        GenMatrix<BigRational> e = mfac.generate((i, j) -> cfac.getZERO());
133        //System.out.println("e = " + e);
134        assertTrue("e == 0: ", e.isZERO());
135
136        e = mfac.generate((i, j) -> i == j ? cfac.getONE() : cfac.getZERO());
137        //System.out.println("e = " + e);
138        assertTrue("e == 1: ", e.isONE());
139
140        e = mfac.generate((i, j) -> i == j + 1 ? cfac.getONE() : cfac.getZERO());
141        //System.out.println("e = " + e);
142        assertTrue("e**" + mfac.cols + " == 0: ", e.power(mfac.cols).isZERO());
143    }
144
145
146    /**
147     * Test random matrix.
148     */
149    public void testRandom() {
150        BigRational cfac = new BigRational(1);
151        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
152        GenMatrixRing<BigRational> tfac = mfac.transpose();
153
154        if (rows == cols) {
155            assertTrue(" mfac = tfac ", mfac.equals(tfac));
156        }
157
158        GenMatrix<BigRational> a, b, c;
159
160        for (int i = 0; i < 5; i++) {
161            a = mfac.random(kl, q);
162            //System.out.println("a = " + a);
163            if (a.isZERO()) {
164                continue;
165            }
166            assertTrue(" not isZERO( a" + i + " )", !a.isZERO());
167            b = a.transpose(tfac);
168            //System.out.println("b = " + b);
169            assertTrue(" not isZERO( b" + i + " )", !b.isZERO());
170            c = b.transpose(mfac);
171            //System.out.println("c = " + c);
172            assertEquals(" a^r^r == a ", a, c);
173        }
174    }
175
176
177    /**
178     * Test addition.
179     */
180    public void testAddition() {
181        BigRational cfac = new BigRational(1);
182        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
183        GenMatrix<BigRational> a, b, c, d, e;
184
185        a = mfac.random(kl, q);
186        b = mfac.random(kl, q);
187        //System.out.println("a = " + a);
188        //System.out.println("b = " + b);
189
190        c = a.sum(b);
191        d = c.subtract(b);
192        //System.out.println("c = " + c);
193        //System.out.println("d = " + d);
194        assertEquals("a+b-b = a", a, d);
195
196        c = a.sum(b);
197        d = c.sum(b.negate());
198        //System.out.println("c = " + c);
199        //System.out.println("d = " + d);
200        assertEquals("a+b+(-b) = a", a, d);
201
202        c = a.sum(b);
203        d = b.sum(a);
204        //System.out.println("c = " + c);
205        //System.out.println("d = " + d);
206        assertEquals("a+b = b+a", c, d);
207
208        c = mfac.random(kl, q);
209        d = a.sum(b).sum(c);
210        e = a.sum(b.sum(c));
211        //System.out.println("d = " + d);
212        //System.out.println("e = " + e);
213        assertEquals("a+(b+c) = (a+b)+c", d, e);
214    }
215
216
217    /**
218     * Test scalar multiplication.
219     */
220    public void testScalarMultiplication() {
221        BigRational cfac = new BigRational(1);
222        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
223        BigRational r, s, t;
224        GenMatrix<BigRational> a, b, c, d;
225
226        r = cfac.random(kl);
227        //System.out.println("r = " + r);
228        s = r.inverse();
229        //System.out.println("s = " + s);
230
231        a = mfac.random(kl, q);
232        //System.out.println("a = " + a);
233
234        c = a.scalarMultiply(r);
235        d = c.scalarMultiply(s);
236        //System.out.println("c = " + c);
237        //System.out.println("d = " + d);
238        assertEquals("a*b*(1/b) = a", a, d);
239
240        b = mfac.random(kl, q);
241        //System.out.println("b = " + b);
242
243        t = cfac.getONE();
244        //System.out.println("t = " + t);
245        c = a.linearCombination(b, t);
246        d = b.linearCombination(a, t);
247        //System.out.println("c = " + c);
248        //System.out.println("d = " + d);
249        assertEquals("a+1*b = b+1*a", c, d);
250
251        c = a.linearCombination(b, t);
252        d = a.sum(b);
253        //System.out.println("c = " + c);
254        //System.out.println("d = " + d);
255        assertEquals("a+1*b = b+1*a", c, d);
256
257        s = t.negate();
258        //System.out.println("s = " + s);
259        c = a.linearCombination(b, t);
260        d = c.linearCombination(b, s);
261        //System.out.println("c = " + c);
262        //System.out.println("d = " + d);
263        assertEquals("a+1*b+(-1)*b = a", a, d);
264
265        c = a.linearCombination(t, b, t);
266        d = c.linearCombination(t, b, s);
267        //System.out.println("c = " + c);
268        //System.out.println("d = " + d);
269        assertEquals("a*1+b*1+b*(-1) = a", a, d);
270
271        t = cfac.getZERO();
272        //System.out.println("t = " + t);
273        c = a.linearCombination(b, t);
274        //System.out.println("c = " + c);
275        assertEquals("a+0*b = a", a, c);
276
277        d = a.linearCombination(t, b, t);
278        //System.out.println("d = " + d);
279        assertEquals("0*a+0*b = 0", mfac.getZERO(), d);
280    }
281
282
283    /**
284     * Test (simple) multiplication.
285     */
286    public void testSimpleMultiplication() {
287        BigRational cfac = new BigRational(1);
288        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
289        GenMatrix<BigRational> a, b, c, d, e, f;
290
291        a = mfac.getZERO();
292        b = mfac.getZERO();
293        c = a.multiplySimple(b);
294        //System.out.println("a = " + a);
295        //System.out.println("b = " + b);
296        //System.out.println("c = " + c);
297        assertTrue("0*0 = 0 ", c.isZERO());
298
299        a = mfac.getONE();
300        b = mfac.getONE();
301        c = a.multiplySimple(b);
302        //System.out.println("a = " + a);
303        //System.out.println("b = " + b);
304        //System.out.println("c = " + c);
305        assertTrue("1*1 = 1 ", c.isONE());
306
307        a = mfac.random(kl, q);
308        b = mfac.getONE();
309        c = a.multiplySimple(b);
310        d = a.multiply(b);
311        //System.out.println("a = " + a);
312        //System.out.println("b = " + b);
313        //System.out.println("c = " + c);
314        //System.out.println("d = " + d);
315        assertEquals("a*1 = a ", a, c);
316        assertEquals("a*1 = a*1 ", c, d);
317
318        c = b.multiplySimple(a);
319        d = a.multiply(b);
320        //System.out.println("a = " + a);
321        //System.out.println("b = " + b);
322        //System.out.println("c = " + c);
323        //System.out.println("d = " + d);
324        assertEquals("1*a = a ", a, c);
325        assertEquals("a*1 = a*1 ", c, d);
326
327        b = mfac.random(kl, q);
328        long s, t;
329        s = System.currentTimeMillis();
330        c = a.multiplySimple(b);
331        s = System.currentTimeMillis() - s;
332        assertTrue("nonsense " + s, s >= 0L);
333        d = b.multiplySimple(a);
334        t = System.currentTimeMillis();
335        e = a.multiply(b);
336        t = System.currentTimeMillis() - t;
337        assertTrue("nonsense " + t, t >= 0L);
338        f = b.multiply(a);
339        //System.out.println("a = " + a);
340        //System.out.println("b = " + b);
341        //System.out.println("c = " + c);
342        //System.out.println("d = " + d);
343        //System.out.println("e = " + e);
344        //System.out.println("f = " + e);
345        //System.out.println("e = " + e);
346        assertTrue("a*b != b*a ", !c.equals(d));
347        assertEquals("a*1 = a*1 ", c, e);
348        assertEquals("a*1 = a*1 ", d, f);
349        //System.out.println("time: s = " + s + ", t = " + t);
350
351        if (!mfac.isAssociative()) {
352            return;
353        }
354        c = mfac.random(kl, q);
355
356        d = a.multiply(b.sum(c));
357        e = (a.multiply(b)).sum(a.multiply(c));
358        assertEquals("a*(b+c) = a*b+a*c", d, e);
359
360        d = a.multiply(b.multiply(c));
361        e = (a.multiply(b)).multiply(c);
362        assertEquals("a*(b*c) = (a*b)*c", d, e);
363    }
364
365
366    /**
367     * Test parse matrix.
368     */
369    public void testParse() {
370        BigRational cfac = new BigRational(1);
371        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, rows, cols);
372
373        GenMatrix<BigRational> a, c;
374
375        a = mfac.random(kl, q);
376        //System.out.println("a = " + a);
377        if (!a.isZERO()) {
378            //return;
379            assertTrue(" not isZERO( a )", !a.isZERO());
380        }
381        String s = a.toString();
382        //System.out.println("s = " + s);
383        c = mfac.parse(s);
384        //System.out.println("c = " + c);
385        assertEquals("parse(toStirng(a) == a ", a, c);
386    }
387
388
389    /**
390     * Test LU decomposition.
391     */
392    public void testLUdecomp() {
393        BigRational cfac = new BigRational(1);
394        int n = 10;
395        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, n, n);//rows, cols);
396        GenVectorModul<BigRational> vfac = new GenVectorModul<BigRational>(cfac, n);//rows);
397
398        GenMatrix<BigRational> A, Ap, iA, AiA;
399        //A = mfac.getONE().negate(); //.sum(mfac.getONE());
400        A = mfac.random(kl, 0.7f);
401        //A = mfac.parse("[ [3,4], [1,2] ]");
402        //System.out.println("A = " + A);
403        if (A.isZERO()) {
404            return;
405        }
406        assertTrue(" not isZERO( A )", !A.isZERO());
407        Ap = A.copy();
408
409        LinAlg<BigRational> lu = new LinAlg<BigRational>();
410        BasicLinAlg<BigRational> blas = new BasicLinAlg<BigRational>();
411
412        List<Integer> P = lu.decompositionLU(A);
413        //System.out.println("P = " + P);
414        //System.out.println("A = " + A);
415        if (P.size() == 0) {
416            System.out.println("undecomposable");
417            return;
418        }
419
420        GenVector<BigRational> s;
421        //b = vfac.random(kl);
422        //b = vfac.parse("[5,5]");
423        //s = vfac.parse("[1,1]");
424        s = vfac.random(kl);
425        //System.out.println("s = " + s);
426        GenVector<BigRational> b = blas.rightProduct(s, Ap);
427        //System.out.println("b = " + b);
428
429        GenVector<BigRational> x = lu.solveLU(A, P, b);
430        //System.out.println("x = " + x);
431        assertEquals("s == x: ", s, x);
432
433        GenVector<BigRational> r = blas.rightProduct(x, Ap);
434        //System.out.println("r = " + r);
435
436        //System.out.println("b == r: " + b.equals(r));
437        assertEquals("b == r: ", b, r);
438
439        BigRational det = lu.determinantLU(A, P);
440        //System.out.println("det = " + det + " ~= " + det.getDecimal());
441        assertFalse("det(A) != 0: ", det.isZERO());
442
443        iA = lu.inverseLU(A, P);
444        //System.out.println("iA = " + iA);
445        AiA = Ap.multiply(iA);
446        //System.out.println("AiA = " + AiA);
447        assertTrue("A*iA == 1: ", AiA.isONE());
448
449        GenMatrix<BigRational> I = Ap.inverse();
450        GenMatrix<BigRational> CI = Ap.multiply(I);
451        //System.out.println("C*I:   " + CI.toScript());
452        assertTrue("Ap*I == 1: ", CI.isONE());
453
454        GenMatrix<BigRational> C = mfac.random(3, 0.5f);
455        GenMatrix<BigRational> CA = C.divide(Ap);
456        GenMatrix<BigRational> AC = C.divideLeft(Ap);
457        //System.out.println("C/A :    " + CA);
458        //System.out.println("A\\C :   " + AC);
459        assertFalse("C/A != A\\C: ", CA.equals(AC));
460
461        GenMatrix<BigRational> B = CA.multiply(Ap);
462        assertEquals("C == C/A*A: ", B, C);
463        B = Ap.multiply(AC);
464        assertEquals("C == A*A\\C: ", B, C);
465    }
466
467
468    /**
469     * Test Null Space basis, modular coeffs.
470     */
471    public void testNullSpaceMod() {
472        ModLongRing cfac = new ModLongRing(11); //11, 32003
473        int n = 100;
474        GenMatrixRing<ModLong> mfac = new GenMatrixRing<ModLong>(cfac, n, n);//rows, cols);
475        //System.out.println("mfac = " + mfac.toScript());
476        //GenVectorModul<ModLong> vfac = new GenVectorModul<ModLong>(cfac, n);//rows);
477        GenMatrixRing<ModLong> tfac = mfac.transpose();
478
479        GenMatrix<ModLong> A, Ap, B, T;
480        //A = mfac.getONE(); //.negate(); //.sum(mfac.getONE());
481        A = mfac.random(kl, 0.5f / n);
482        //A = mfac.parse("[ [3,4,5], [1,2,3], [2,4,6] ]");
483        //A = mfac.parse("[ [1,0,0,0,0], [3,0,0,0,0], [0,0,1,0,0], [2,0,4,0,0], [0,0,0,0,1] ]");
484        //A = mfac.parse("[ [0,0,0,0,0,0], [3,4,-3,-3,5,5], [3,-5,5,1,-1,0], [-2,4,-1,2,-4,-2], [-4,-3,-1,0,-1,-3], [-3,-1,-4,-3,-1,-4] ]");
485        //A = A.sum( mfac.getONE() );
486        if (n < 50)
487            System.out.println("A = " + A);
488        if (A.isZERO()) {
489            return;
490        }
491        assertTrue(" not isZERO( A )", !A.isZERO());
492        Ap = A.copy();
493        T = A.transpose(tfac);
494        if (n < 10)
495            System.out.println("At = " + T);
496
497        LinAlg<ModLong> lu = new LinAlg<ModLong>();
498        BasicLinAlg<ModLong> blas = new BasicLinAlg<ModLong>();
499
500        List<GenVector<ModLong>> NSB = lu.nullSpaceBasis(A);
501        //System.out.println("NS basis = " + NSB.size());
502        if (NSB.size() == 0) {
503            System.out.println("no null space basis");
504            return;
505        }
506        if (n < 10)
507            System.out.println("mod A-I = " + A);
508        for (GenVector<ModLong> v : NSB) {
509            GenVector<ModLong> z = blas.leftProduct(v, T);
510            //System.out.println("z == 0: " + z.isZERO());
511            assertTrue("z == 0: " + z, z.isZERO());
512        }
513        // test idempotent
514        Ap = A.sum(mfac.getONE());
515        B = Ap.multiply(Ap);
516        if (!Ap.equals(B)) {
517            System.out.println("Ap = " + Ap);
518            System.out.println("B = " + B);
519        }
520        assertEquals("A*A == B: ", Ap, B);
521    }
522
523
524    /**
525     * Test Null Space basis.
526     */
527    public void testNullSpace() {
528        BigRational cfac = new BigRational(11);
529        int n = 100;
530        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, n, n);//rows, cols);
531        //System.out.println("mfac = " + mfac.toScript());
532        //GenVectorModul<BigRational> vfac = new GenVectorModul<BigRational>(cfac, n);//rows);
533        GenMatrixRing<BigRational> tfac = mfac.transpose();
534
535        GenMatrix<BigRational> A, Ap, B, T;
536        //A = mfac.getZERO(); //.negate(); //.sum(mfac.getONE());
537        //A.setMutate(4,1, cfac.parse("44") );
538        //A.setMutate(5,2, cfac.parse("22") );
539        //A.setMutate(5,3, cfac.parse("33") );
540        A = mfac.random(kl, 0.5f / n);
541        //A = mfac.parse("[ [3,4,5], [1,2,3], [2,4,6] ]");
542        //A = mfac.parse("[ [1,0,0,0,0], [3,0,0,0,0], [0,0,1,0,0], [2,0,4,0,0], [0,0,0,0,1] ]");
543        //A = mfac.parse("[ [0,0,0,0,0,0], [3,4,-3,-3,5,5], [3,-5,5,1,-1,0], [-2,4,-1,2,-4,-2], [-4,-3,-1,0,-1,-3], [-3,-1,-4,-3,-1,-4] ]");
544        //A = A.sum( mfac.getONE() ); // subtract
545        if (n < 10)
546            System.out.println("A = " + A);
547        if (A.isZERO()) {
548            return;
549        }
550        assertTrue(" not isZERO( A )", !A.isZERO());
551        Ap = A.copy();
552        T = A.transpose(tfac);
553
554        LinAlg<BigRational> lu = new LinAlg<BigRational>();
555        BasicLinAlg<BigRational> blas = new BasicLinAlg<BigRational>();
556
557        List<GenVector<BigRational>> NSB = lu.nullSpaceBasis(A);
558        //System.out.println("NS basis = " + NSB.size());
559        if (NSB.size() == 0) {
560            System.out.println("no null space basis");
561            return;
562        }
563        if (n < 10)
564            System.out.println("mod A-I = " + A);
565        if (n < 10)
566            System.out.println("T = " + T);
567        for (GenVector<BigRational> v : NSB) {
568            //System.out.println("v = " + v);
569            GenVector<BigRational> z = blas.leftProduct(v, T);
570            //System.out.println("z == 0: " + z.isZERO());
571            assertTrue("z == 0: " + z, z.isZERO());
572        }
573        // test idempotent
574        Ap = A.sum(mfac.getONE());
575        B = Ap.multiply(Ap);
576        if (!Ap.equals(B)) {
577            System.out.println("Ap = " + Ap);
578            System.out.println("B = " + B);
579        }
580        assertEquals("A*A == B: ", Ap, B);
581    }
582
583
584    /**
585     * Test Null Space basis for cokernel and kernel.
586     */
587    public void testNullSpaceKernels() {
588        BigRational cfac = new BigRational(11);
589        int n = 10;
590        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, n, n);//rows, cols);
591        //System.out.println("mfac = " + mfac.toScript());
592        GenMatrixRing<BigRational> tfac = mfac.transpose();
593
594        GenMatrix<BigRational> A, Ap, T, Tp;
595        A = mfac.random(kl, 0.7f / n);
596        if (n < 10)
597            System.out.println("A = " + A);
598        if (A.isZERO()) {
599            return;
600        }
601        assertTrue(" not isZERO( A )", !A.isZERO());
602        Ap = A.copy();
603        T = Ap.transpose(tfac);
604        Tp = T.copy();
605        if (n < 10)
606            System.out.println("T = " + T);
607
608        LinAlg<BigRational> lu = new LinAlg<BigRational>();
609        BasicLinAlg<BigRational> blas = new BasicLinAlg<BigRational>();
610
611        List<GenVector<BigRational>> cokern = lu.nullSpaceBasis(A);
612        //System.out.println("cokern basis = " + cokern);
613        if (cokern.size() == 0) {
614            System.out.println("no cokern null space basis");
615            //return;
616        }
617        for (GenVector<BigRational> v : cokern) {
618            //System.out.println("v = " + v);
619            GenVector<BigRational> z = blas.leftProduct(v, Tp);
620            //System.out.println("z == 0: " + z.isZERO());
621            assertTrue("z == 0: " + z, z.isZERO());
622        }
623
624        List<GenVector<BigRational>> kern = lu.nullSpaceBasis(T);
625        //System.out.println("kern basis = " + kern);
626        if (kern.size() == 0) {
627            System.out.println("no kern null space basis");
628            //return;
629        }
630        for (GenVector<BigRational> v : kern) {
631            //System.out.println("v = " + v);
632            GenVector<BigRational> z = blas.rightProduct(v, Ap);
633            //System.out.println("z == 0: " + z.isZERO());
634            assertTrue("z == 0: " + z, z.isZERO());
635        }
636
637        // test ranks
638        long r1, r2, k, c;
639        //System.out.println("diag(Ap): " + Ap.getDiagonal());
640        //System.out.println("Ap: " + Ap);
641        r1 = lu.rankNS(Ap);
642        c = cokern.size();
643        assertTrue("0 <= rank < n: ", 0 <= r1 && r1 <= n);
644        assertTrue("rank + dim coker == n ", r1 + c == n);
645
646        //System.out.println("diag(Tp): " + Tp.getDiagonal());
647        //System.out.println("Tp: " + Tp);
648        r2 = lu.rankNS(Tp);
649        k = kern.size();
650        //System.out.println("rank A = " + r1 + ", c = " + c + ", n = " + n);
651        //System.out.println("rank T = " + r2 + ", k = " + k);
652        assertTrue("0 <= rank < n: ", 0 <= r2 && r2 <= n);
653        assertTrue("rank + dim ker == n ", r2 + k == n);
654    }
655
656
657    /**
658     * Test row echelon form and rank.
659     */
660    public void testRowEchelonForm() {
661        BigRational cfac = new BigRational(11);
662        int n = 50;
663        GenMatrixRing<BigRational> mfac = new GenMatrixRing<BigRational>(cfac, n, n);//rows, cols);
664        //System.out.println("mfac = " + mfac.toScript());
665        GenMatrixRing<BigRational> tfac = mfac.transpose();
666
667        GenMatrix<BigRational> A, Ap, App, B, T, Tpp;
668        A = mfac.random(kl, 2.0f / n);
669        //A = mfac.getONE();
670        //A = mfac.getZERO(); A.setMutate(3,4, cfac.parse("2")); A.setMutate(5,4, cfac.parse("3"));
671        if (n < 10)
672            System.out.println("A = " + A);
673        if (A.isZERO()) {
674            return;
675        }
676        assertTrue(" not isZERO( A )", !A.isZERO());
677        Ap = A.copy();
678        T = Ap.transpose(tfac);
679        //Tp = T.copy();
680        if (n < 10)
681            System.out.println("T = " + T.ring.rows);
682
683        LinAlg<BigRational> lu = new LinAlg<BigRational>();
684        //BasicLinAlg<BigRational> blas = new BasicLinAlg<BigRational>();
685
686        // test ranks
687        long r1 = 0, r2 = 0;
688        App = lu.rowEchelonForm(A);
689        //System.out.println("A:   " + Ap);
690        //System.out.println("App: " + App);
691        r1 = lu.rankRE(App);
692        //System.out.println("rank A = " + r1 + ", c = " + c + ", n = " + n);
693        assertTrue("0 <= rank < n: ", 0 <= r1 && r1 <= n);
694
695        Tpp = lu.rowEchelonForm(T);
696        //System.out.println("T:   " + T);
697        //System.out.println("Tpp: " + Tpp);
698        r2 = lu.rankRE(Tpp);
699        //System.out.println("rank A = " + r1 + ", c = " + c + ", n = " + n);
700        //System.out.println("rank T = " + r2 + ", k = " + k);
701        assertTrue("0 <= rank < n: ", 0 <= r2 && r2 <= n);
702        //assertTrue("rank == rank^t: ", r1 == r2);
703
704        // reduce upper triagonal part
705        //System.out.println("App: " + App);
706        B = lu.rowEchelonFormSparse(App);
707        //System.out.println("B:   " + B);
708        //System.out.println("B^2: " + B.power(2));
709        r2 = lu.rankRE(B);
710        assertTrue("rank1 == rank2: ", r1 == r2);
711    }
712
713
714    /**
715     * Test fraction free GE.
716     */
717    public void testFractionfreeGE() {
718        BigInteger cfac = new BigInteger(1);
719        int n = 4;
720        int m = 5;
721        GenMatrixRing<BigInteger> mfac = new GenMatrixRing<BigInteger>(cfac, n, m);//rows, cols);
722        //GenVectorModul<BigInteger> vfac = new GenVectorModul<BigInteger>(cfac, m);//rows);
723
724        GenMatrix<BigInteger> A, Ap, iA, AiA;
725        //A = mfac.random(kl, 0.7f);
726        A = mfac.parse("[ [3,4,-2,1,-2], [1,-1,2,2,7], [4,-3,4,-3,2], [-1,1,6,-1,1] ]");
727        //System.out.println("A = " + A);
728        if (A.isZERO()) {
729            return;
730        }
731        assertTrue(" not isZERO( A )", !A.isZERO());
732        Ap = A.copy();
733
734        LinAlg<BigInteger> lu = new LinAlg<BigInteger>();
735        BasicLinAlg<BigInteger> blas = new BasicLinAlg<BigInteger>();
736
737        List<Integer> P = lu.fractionfreeGaussElimination(A);
738        //System.out.println("P = " + P);
739        if (P.size() == 0) {
740            //System.out.println("undecomposable");
741            return;
742        }
743        assertTrue("#P != 0: ", P.size() > 0);
744        //System.out.println("A = " + A);
745
746        n = 10;
747        m = n;
748        mfac = new GenMatrixRing<BigInteger>(cfac, n, m);//rows, cols);
749
750        A = mfac.random(5, 0.67f);
751        //System.out.println("A = " + A);
752        if (A.isZERO()) {
753            return;
754        }
755        assertTrue(" not isZERO( A )", !A.isZERO());
756        Ap = A.copy();
757
758        P = lu.fractionfreeGaussElimination(A);
759        //System.out.println("P = " + P);
760        if (P.size() == 0) {
761            //System.out.println("undecomposable");
762            return;
763        }
764        assertTrue("#P != 0: ", P.size() > 0);
765        //System.out.println("A = " + A);
766    }
767
768
769    /**
770     * Test fraction free GE polynomial.
771     */
772    public void testFractionfreeGEpoly() {
773        BigRational cfac = new BigRational(1);
774        int n = 4;
775        int m = n;
776        String[] vars = new String[]{ "a1", "a2", "a3", "a4" };
777        GenPolynomialRing<BigRational> pfac = new GenPolynomialRing<BigRational>(cfac, vars);
778        GenMatrixRing<GenPolynomial<BigRational>> mfac = new GenMatrixRing<GenPolynomial<BigRational>>(pfac, n, m);
779
780        GenMatrix<GenPolynomial<BigRational>> A, Ap, iA, AiA;
781        A = mfac.random(4, 0.5f);
782        //A = mfac.parse("[ [3,4,-2,1,-2], [1,-1,2,2,7], [4,-3,4,-3,2], [-1,1,6,-1,1] ]");
783        //System.out.println("A = " + A);
784        if (A.isZERO()) {
785            return;
786        }
787        assertTrue(" not isZERO( A )", !A.isZERO());
788        Ap = A.copy();
789
790        LinAlg<GenPolynomial<BigRational>> lu = new LinAlg<GenPolynomial<BigRational>>();
791
792        List<Integer> P = lu.fractionfreeGaussElimination(A);
793        //System.out.println("P = " + P);
794        if (P.size() == 0) {
795            //System.out.println("undecomposable");
796            return;
797        }
798        assertTrue("#P != 0: ", P.size() > 0);
799        //System.out.println("A = " + A);
800
801
802        vars = new String[]{ "a11", "a12", "a13", "a14", "a21", "a22", "a23", "a24", "a31", "a32", "a33", "a34", "a41", "a42", "a43", "a44" };
803        pfac = new GenPolynomialRing<BigRational>(cfac, vars);
804        mfac = new GenMatrixRing<GenPolynomial<BigRational>>(pfac, n, m);
805        A = mfac.parse("[ [a11, a12, a13, a14], [a21, a22, a23, a24], [a31, a32, a33, a34], [a41, a42, a43, a44]] ");
806        //System.out.println("A = " + A);
807        if (A.isZERO()) {
808            return;
809        }
810        assertTrue(" not isZERO( A )", !A.isZERO());
811        Ap = A.copy();
812
813        P = lu.fractionfreeGaussElimination(A);
814        //System.out.println("P = " + P);
815        if (P.size() == 0) {
816            //System.out.println("undecomposable");
817            return;
818        }
819        assertTrue("#P != 0: ", P.size() > 0);
820        //System.out.println("A = " + A);
821
822        FactorAbstract<BigRational> ufd = FactorFactory.getImplementation(cfac);
823        int i = 0;
824        for (ArrayList<GenPolynomial<BigRational>> row : A.matrix) {
825             int j = 0;
826             for (GenPolynomial<BigRational> elem : row) {
827                 if (elem.isZERO()) {
828                     j++;
829                     continue;
830                 }
831                 SortedMap<GenPolynomial<BigRational>, Long> pf = ufd.factors(elem);
832                 //System.out.println("A(" + i + "," + j + ") = " + elem);
833                 //System.out.println("factors = " + pf);
834                 assertTrue("#factors == 1:", pf.size() == 1);
835                 j++;
836             }
837             i++;
838        }
839        ComputerThreads.terminate();
840    }
841
842}