001/*
002 * $Id$
003 */
004
005package edu.jas.arith;
006
007
008import java.util.List;
009
010import edu.jas.structure.Power;
011
012import junit.framework.Test;
013import junit.framework.TestCase;
014import junit.framework.TestSuite;
015
016
017/**
018 * Basic arithmetic tests with JUnit.
019 * @author Heinz Kredel
020 */
021
022public class ArithTest extends TestCase {
023
024
025    /**
026     * main.
027     */
028    public static void main(String[] args) {
029        junit.textui.TestRunner.run(suite());
030    }
031
032
033    /**
034     * Constructs a <CODE>ArithTest</CODE> object.
035     * @param name String.
036     */
037    public ArithTest(String name) {
038        super(name);
039    }
040
041
042    /**
043     * suite.
044     */
045    public static Test suite() {
046        TestSuite suite = new TestSuite(ArithTest.class);
047        return suite;
048    }
049
050
051    @Override
052    protected void setUp() {
053        //a = b = c = d = e = null;
054    }
055
056
057    @Override
058    protected void tearDown() {
059        //a = b = c = d = e = null;
060    }
061
062
063    /**
064     * Test static initialization and constants for BigInteger.
065     */
066    public void testIntegerConstants() {
067        BigInteger a, b, c, d;
068        a = BigInteger.ZERO;
069        b = BigInteger.ONE;
070        c = b.subtract(b);
071
072        assertTrue("0.isZERO()", a.isZERO());
073        assertTrue("1.isONE", b.isONE());
074
075        assertEquals("1-1 = 0", c, a);
076        assertTrue("(1-1).isZERO()", c.isZERO());
077
078        d = b.multiply(b);
079        assertTrue("1*1 = 1", d.isONE());
080
081        d = b.multiply(a);
082        assertTrue("1*0 = 0", d.isZERO());
083    }
084
085
086    //--------------------------------------------------------
087
088
089    /**
090     * Test string constructor and toString for BigInteger.
091     */
092    public void testIntegerConstructor() {
093        BigInteger a, b, c, d;
094        a = new BigInteger(1);
095        b = new BigInteger(-1);
096        c = new BigInteger(0);
097
098        d = a.sum(b);
099        assertTrue("'1'.isONE()", a.isONE());
100        assertTrue("1+(-1) = 0", d.isZERO());
101        d = a.negate();
102        assertEquals("-1 = -(1)", d, b);
103
104        d = a.multiply(c);
105        assertTrue("'0'.isZERO()", d.isZERO());
106        d = b.multiply(b);
107        assertTrue("(-1)*(-1) = 1", d.isONE());
108
109        a = new BigInteger(3);
110        b = new BigInteger("3");
111        assertEquals("3 = '3'", a, b);
112
113        a = new BigInteger(-5);
114        b = new BigInteger("-5");
115        assertEquals("-5 = '-5'", a, b);
116
117        //          0         1         2         3         4 
118        //          0123456789012345678901234567890123456789012345
119        String s = "1111111111111111111111111111111111111111111111";
120        a = new BigInteger(s);
121        String t = a.toString();
122        assertEquals("stringConstr = toString", s, t);
123    }
124
125
126    //--------------------------------------------------------
127
128
129    /**
130     * Test random and compares Integer.
131     */
132    public void testIntegerRandom() {
133        BigInteger a, b, c;
134        a = BigInteger.ZERO.random(500);
135        b = new BigInteger("" + a);
136        c = b.subtract(a);
137
138        assertTrue("a-'a' = 0", c.isZERO());
139        assertEquals("compareTo('a',a) = 0", 0, b.compareTo(a));
140        assertEquals("signum('a'-a) = 0", 0, c.signum());
141    }
142
143
144    //--------------------------------------------------------
145
146
147    /**
148     * Test addition for Integer.
149     */
150    public void testIntegerAddition() {
151        BigInteger a, b, c, d, e;
152        // neutral element
153        a = BigInteger.ZERO.random(500);
154        d = a.sum(BigInteger.ZERO);
155        assertEquals("a+0 = a", d, a);
156        d = a.subtract(BigInteger.ZERO);
157        assertEquals("a-0 = a", d, a);
158
159        // inverse operations
160        b = a.sum(a);
161        c = b.subtract(a);
162        assertEquals("(a+a)-a = a", c, a);
163        b = a.subtract(a);
164        c = b.sum(a);
165        assertEquals("(a-a)+a = a", c, a);
166
167        // comutativity
168        b = BigInteger.ZERO.random(500);
169        c = a.sum(b);
170        d = b.sum(a);
171        assertEquals("a+b = b+a", c, d);
172
173        // negation
174        c = a.subtract(b);
175        d = a.sum(b.negate());
176        assertEquals("a-b = a+(-b)", c, d);
177
178        // associativity
179        c = BigInteger.ZERO.random(500);
180        d = a.sum(b.sum(c));
181        e = a.sum(b).sum(c);
182        assertEquals("a+(b+c) = (a+b)+c", d, e);
183    }
184
185
186    //--------------------------------------------------------
187
188
189    /**
190     * Test multiplication for Integer.
191     */
192    public void testIntegerMultiplication() {
193        BigInteger a, b, c, d, e;
194        // neutral element
195        a = BigInteger.ZERO.random(500);
196        d = a.multiply(BigInteger.ONE);
197        assertEquals("a*1 = a", d, a);
198        d = a.divide(BigInteger.ONE);
199        assertEquals("a/1 = a", d, a);
200
201        // inverse operations
202        b = a.multiply(a);
203        c = b.divide(a);
204        assertEquals("(a*a)/a = a", c, a);
205        b = a.divide(a);
206        c = b.multiply(a);
207        assertEquals("(a/a)*a = a", c, a);
208
209        // comutativity
210        b = BigInteger.ZERO.random(500);
211        c = a.multiply(b);
212        d = b.multiply(a);
213        assertEquals("a*b = b*a", c, d);
214
215        // inverse
216        d = c.divide(b);
217        // e = c.multiply( b.inverse() );
218        e = a;
219        assertEquals("a/b = a*(1/b)", d, e);
220
221        // associativity
222        c = BigInteger.ZERO.random(500);
223        d = a.multiply(b.multiply(c));
224        e = a.multiply(b).multiply(c);
225        assertEquals("a*(b*c) = (a*b)*c", d, e);
226    }
227
228
229    /**
230     * Test static initialization and constants for BigRational.
231     */
232    public void testRationalConstants() {
233        BigRational a, b, c, d;
234        a = BigRational.ZERO;
235        b = BigRational.ONE;
236        //System.out.println("a = " + a);
237        //System.out.println("b = " + b);
238        c = b.subtract(b);
239
240        assertTrue("0.isZERO()", a.isZERO());
241        assertTrue("1.isONE", b.isONE());
242
243        assertEquals("1-1 = 0", c, a);
244        assertTrue("(1-1).isZERO()", c.isZERO());
245
246        d = b.multiply(b);
247        assertTrue("1*1 = 1", d.isONE());
248
249        d = b.multiply(a);
250        assertTrue("1*0 = 0", d.isZERO());
251    }
252
253
254    /**
255     * Test static initialization and constants for BigComplex.
256     */
257    public void testComplexConstants() {
258        BigComplex a, b, c, d;
259        a = BigComplex.ZERO;
260        b = BigComplex.ONE;
261        c = b.subtract(b);
262
263        assertTrue("0.isZERO()", a.isZERO());
264        assertTrue("1.isONE", b.isONE());
265
266        assertEquals("1-1 = 0", c, a);
267        assertTrue("(1-1).isZERO()", c.isZERO());
268
269        d = b.multiply(b);
270        assertTrue("1*1 = 1", d.isONE());
271
272        d = b.multiply(a);
273        assertTrue("1*0 = 0", d.isZERO());
274    }
275
276
277    /**
278     * Test static initialization and constants for BigQuaternion.
279     */
280    public void testQuaternionConstants() {
281        BigQuaternionRing fac = new BigQuaternionRing();
282        BigQuaternion a, b, c, d;
283        a = fac.ZERO;
284        b = fac.ONE;
285        c = b.subtract(b);
286
287        assertTrue("0.isZERO()", a.isZERO());
288        assertTrue("1.isONE", b.isONE());
289
290        assertEquals("1-1 = 0", c, a);
291        assertTrue("(1-1).isZERO()", c.isZERO());
292
293        d = b.multiply(b);
294        assertTrue("1*1 = 1", d.isONE());
295
296        d = b.multiply(a);
297        assertTrue("1*0 = 0", d.isZERO());
298    }
299
300
301    //--------------------------------------------------------
302
303
304    /**
305     * Test string constructor and toString for BigRational.
306     */
307    public void testRationalConstructor() {
308        BigRational a, b, c, d;
309        a = new BigRational(1);
310        b = new BigRational(-1);
311        c = new BigRational(0);
312
313        d = a.sum(b);
314        assertTrue("'1'.isONE()", a.isONE());
315        assertTrue("1+(-1) = 0", d.isZERO());
316        d = a.negate();
317        assertEquals("-1 = -(1)", d, b);
318
319        d = a.multiply(c);
320        assertTrue("'0'.isZERO()", d.isZERO());
321        d = b.multiply(b);
322        assertTrue("(-1)*(-1) = 1", d.isONE());
323
324        a = new BigRational(3);
325        b = new BigRational("3");
326        assertEquals("3 = '3'", a, b);
327
328        a = new BigRational(-5);
329        b = new BigRational("-5");
330        assertEquals("-5 = '-5'", a, b);
331
332        //          0         1         2         3         4 
333        //          0123456789012345678901234567890123456789012345
334        String s = "1111111111111111111111111111111111111111111111";
335        a = new BigRational(s);
336        String t = a.toString();
337        assertEquals("stringConstr = toString", s, t);
338
339        s = "2/4";
340        a = new BigRational(s);
341        t = a.toString(5);
342        //System.out.println("a = " + a);
343        //System.out.println("t = " + t);
344        String r = "0.5";
345        assertEquals("stringConstr = toString", r, t);
346    }
347
348
349    /**
350     * Test string constructor and toString for BigComplex.
351     */
352    public void testComplexConstructor() {
353        BigComplex a, b, c, d;
354        a = new BigComplex(1);
355        b = new BigComplex(-1);
356        c = new BigComplex(0);
357
358        d = a.sum(b);
359        assertTrue("'1'.isONE()", a.isONE());
360        assertTrue("1+(-1) = 0", d.isZERO());
361        d = a.negate();
362        assertEquals("-1 = -(1)", d, b);
363
364        d = a.multiply(c);
365        assertTrue("'0'.isZERO()", d.isZERO());
366        d = b.multiply(b);
367        assertTrue("(-1)*(-1) = 1", d.isONE());
368
369        a = new BigComplex(3);
370        b = new BigComplex("3");
371        assertEquals("3 = '3'", a, b);
372
373        a = new BigComplex(-5);
374        b = new BigComplex("-5");
375        assertEquals("-5 = '-5'", a, b);
376
377        //          0         1         2         3         4 
378        //          0123456789012345678901234567890123456789012345
379        String s = "1111111111111111111111111111111111111111111111";
380        a = new BigComplex(s);
381        String t = a.toString();
382        assertEquals("stringConstr = toString", s, t);
383    }
384
385
386    /**
387     * Test string constructor and toString for BigQuaternion.
388     */
389    public void testQuaternionConstructor() {
390        BigQuaternionRing fac = new BigQuaternionRing();
391        BigQuaternion a, b, c, d;
392        a = new BigQuaternion(fac, 1);
393        b = new BigQuaternion(fac, -1);
394        c = new BigQuaternion(fac, 0);
395
396        d = a.sum(b);
397        assertTrue("'1'.isONE()", a.isONE());
398        assertTrue("1+(-1) = 0", d.isZERO());
399        d = a.negate();
400        assertEquals("-1 = -(1)", d, b);
401
402        d = a.multiply(c);
403        assertTrue("'0'.isZERO()", d.isZERO());
404        d = b.multiply(b);
405        assertTrue("(-1)*(-1) = 1", d.isONE());
406
407        a = new BigQuaternion(fac, 3);
408        b = new BigQuaternion(fac, "3");
409        assertEquals("3 = '3'", a, b);
410
411        a = new BigQuaternion(fac, -5);
412        b = new BigQuaternion(fac, "-5");
413        assertEquals("-5 = '-5'", a, b);
414
415        //          0         1         2         3         4 
416        //          0123456789012345678901234567890123456789012345
417        String s = "1111111111111111111111111111111111111111111111";
418        a = new BigQuaternion(fac, s);
419        String t = a.toString();
420        assertEquals("stringConstr = toString", s, t);
421    }
422
423
424    //--------------------------------------------------------
425
426
427    /**
428     * Test random and compares Rational.
429     */
430    public void testRationalRandom() {
431        BigRational a, b, c;
432        a = BigRational.ZERO.random(500);
433        b = new BigRational("" + a);
434        c = b.subtract(a);
435
436        assertTrue("a-'a' = 0", c.isZERO());
437        assertEquals("compareTo('a',a) = 0", 0, b.compareTo(a));
438        assertEquals("signum('a'-a) = 0", 0, c.signum());
439    }
440
441
442    /**
443     * Test random and compares Complex.
444     */
445    public void testComplexRandom() {
446        BigComplex a, b, c;
447        a = BigComplex.ZERO.random(500);
448        b = new BigComplex("" + a);
449        c = b.subtract(a);
450
451        assertTrue("a-'a' = 0", c.isZERO());
452        assertEquals("compareTo('a',a) = 0", 0, b.compareTo(a));
453        assertEquals("signum('a'-a) = 0", 0, c.signum());
454    }
455
456
457    /**
458     * Test random and compares Quaternion.
459     */
460    public void testQuaternionRandom() {
461        BigQuaternionRing fac = new BigQuaternionRing();
462        BigQuaternion a, b, c;
463        a = fac.random(500);
464        b = new BigQuaternion(fac, a.toString());
465        c = b.subtract(a);
466
467        assertTrue("a-'a' = 0", c.isZERO());
468        assertEquals("signum('a'-a) = 0", 0, c.signum());
469        assertEquals("compareTo('a',a) = 0", 0, b.compareTo(a));
470    }
471
472
473    //--------------------------------------------------------
474
475
476    /**
477     * Test addition for Rational.
478     */
479    public void testRationalAddition() {
480        BigRational a, b, c, d, e;
481        // neutral element
482        a = BigRational.ZERO.random(500);
483        d = a.sum(BigRational.ZERO);
484        assertEquals("a+0 = a", d, a);
485        d = a.subtract(BigRational.ZERO);
486        assertEquals("a-0 = a", d, a);
487
488        // inverse operations
489        b = a.sum(a);
490        c = b.subtract(a);
491        assertEquals("(a+a)-a = a", c, a);
492        b = a.subtract(a);
493        c = b.sum(a);
494        assertEquals("(a-a)+a = a", c, a);
495
496        // comutativity
497        b = BigRational.ZERO.random(500);
498        c = a.sum(b);
499        d = b.sum(a);
500        assertEquals("a+b = b+a", c, d);
501
502        // negation
503        c = a.subtract(b);
504        d = a.sum(b.negate());
505        assertEquals("a-b = a+(-b)", c, d);
506
507        // associativity
508        c = BigRational.ZERO.random(500);
509        d = a.sum(b.sum(c));
510        e = a.sum(b).sum(c);
511        assertEquals("a+(b+c) = (a+b)+c", d, e);
512    }
513
514
515    /**
516     * Test addition for Complex.
517     */
518    public void testComplexAddition() {
519        BigComplex a, b, c, d, e;
520        // neutral element
521        a = BigComplex.ZERO.random(500);
522        d = a.sum(BigComplex.ZERO);
523        assertEquals("a+0 = a", d, a);
524        d = a.subtract(BigComplex.ZERO);
525        assertEquals("a-0 = a", d, a);
526
527        // inverse operations
528        b = a.sum(a);
529        c = b.subtract(a);
530        assertEquals("(a+a)-a = a", c, a);
531        b = a.subtract(a);
532        c = b.sum(a);
533        assertEquals("(a-a)+a = a", c, a);
534
535        // comutativity
536        b = BigComplex.ZERO.random(500);
537        c = a.sum(b);
538        d = b.sum(a);
539        assertEquals("a+b = b+a", c, d);
540
541        // negation
542        c = a.subtract(b);
543        d = a.sum(b.negate());
544        assertEquals("a-b = a+(-b)", c, d);
545
546        // associativity
547        c = BigComplex.ZERO.random(500);
548        d = a.sum(b.sum(c));
549        e = a.sum(b).sum(c);
550        assertEquals("a+(b+c) = (a+b)+c", d, e);
551    }
552
553
554    /**
555     * Test addition for Quaternion.
556     */
557    public void testQuaternionAddition() {
558        BigQuaternionRing fac = new BigQuaternionRing();
559        BigQuaternion a, b, c, d, e;
560        // neutral element
561        a = fac.random(500);
562        d = a.sum(fac.ZERO);
563        assertEquals("a+0 = a", d, a);
564        d = a.subtract(fac.ZERO);
565        assertEquals("a-0 = a", d, a);
566
567        // inverse operations
568        b = a.sum(a);
569        c = b.subtract(a);
570        assertEquals("(a+a)-a = a", c, a);
571        b = a.subtract(a);
572        c = b.sum(a);
573        assertEquals("(a-a)+a = a", c, a);
574
575        // comutativity
576        b = fac.random(500);
577        c = a.sum(b);
578        d = b.sum(a);
579        assertEquals("a+b = b+a", c, d);
580
581        // negation
582        c = a.subtract(b);
583        d = a.sum(b.negate());
584        assertEquals("a-b = a+(-b)", c, d);
585
586        // associativity
587        c = fac.random(500);
588        d = a.sum(b.sum(c));
589        e = a.sum(b).sum(c);
590        assertEquals("a+(b+c) = (a+b)+c", d, e);
591    }
592
593
594    //--------------------------------------------------------
595
596
597    /**
598     * Test multiplication for Rational.
599     */
600    public void testRationalMultiplication() {
601        BigRational a, b, c, d, e;
602        // neutral element
603        a = BigRational.ZERO.random(500);
604        d = a.multiply(BigRational.ONE);
605        assertEquals("a*1 = a", d, a);
606        d = a.divide(BigRational.ONE);
607        assertEquals("a/1 = a", d, a);
608
609        // inverse operations
610        b = a.multiply(a);
611        c = b.divide(a);
612        assertEquals("(a*a)/a = a", c, a);
613        b = a.divide(a);
614        c = b.multiply(a);
615        assertEquals("(a/a)*a = a", c, a);
616
617        // comutativity
618        b = BigRational.ZERO.random(500);
619        c = a.multiply(b);
620        d = b.multiply(a);
621        assertEquals("a*b = b*a", c, d);
622
623        // inverse
624        d = c.divide(b);
625        e = c.multiply(b.inverse());
626        //e = a;
627        assertEquals("a/b = a*(1/b)", d, e);
628
629        // associativity
630        c = BigRational.ZERO.random(500);
631        d = a.multiply(b.multiply(c));
632        e = a.multiply(b).multiply(c);
633        assertEquals("a*(b*c) = (a*b)*c", d, e);
634    }
635
636
637    /**
638     * Test multiplication for Complex.
639     */
640    public void testComplexMultiplication() {
641        BigComplex a, b, c, d, e;
642        // neutral element
643        a = BigComplex.ZERO.random(500);
644        d = a.multiply(BigComplex.ONE);
645        assertEquals("a*1 = a", d, a);
646        d = a.divide(BigComplex.ONE);
647        assertEquals("a/1 = a", d, a);
648
649        // inverse operations
650        b = a.multiply(a);
651        c = b.divide(a);
652        assertEquals("(a*a)/a = a", c, a);
653        b = a.divide(a);
654        c = b.multiply(a);
655        assertEquals("(a/a)*a = a", c, a);
656
657        // comutativity
658        b = BigComplex.ZERO.random(500);
659        c = a.multiply(b);
660        d = b.multiply(a);
661        assertEquals("a*b = b*a", c, d);
662
663        // inverse
664        d = c.divide(b);
665        e = c.multiply(b.inverse());
666        //e = a;
667        assertEquals("a/b = a*(1/b)", d, e);
668
669        // associativity
670        c = BigComplex.ZERO.random(500);
671        d = a.multiply(b.multiply(c));
672        e = a.multiply(b).multiply(c);
673        assertEquals("a*(b*c) = (a*b)*c", d, e);
674    }
675
676
677    /**
678     * Test multiplication for Quaternion.
679     */
680    public void testQuaternionMultiplication() {
681        BigQuaternionRing fac = new BigQuaternionRing();
682        BigQuaternion a, b, c, d, e;
683        // neutral element
684        a = fac.random(500);
685        d = a.multiply(fac.ONE);
686        assertEquals("a*1 = a", d, a);
687        d = a.divide(fac.ONE);
688        assertEquals("a/1 = a", d, a);
689
690        // inverse operations
691        b = a.multiply(a);
692        c = b.divide(a);
693        assertEquals("(a*a)/a = a", c, a);
694        b = a.divide(a);
695        c = b.multiply(a);
696        assertEquals("(a/a)*a = a", c, a);
697
698        // inverse
699        b = fac.random(500);
700        c = b.multiply(a);
701        d = c.divide(b);
702        e = c.multiply(b.inverse());
703        //e = a;
704        assertEquals("a/b = a*(1/b)", d, e);
705
706        // associativity
707        c = fac.random(500);
708        d = a.multiply(b.multiply(c));
709        e = a.multiply(b).multiply(c);
710        assertEquals("a*(b*c) = (a*b)*c", d, e);
711
712        // non comutativity
713        a = fac.I;
714        b = fac.J;
715        c = a.multiply(b);
716        d = b.multiply(a);
717        assertEquals("I*J = -J*I", c, d.negate());
718        a = fac.I;
719        b = fac.K;
720        c = a.multiply(b);
721        d = b.multiply(a);
722        assertEquals("I*K = -K*I", c, d.negate());
723        a = fac.J;
724        b = fac.K;
725        c = a.multiply(b);
726        d = b.multiply(a);
727        assertEquals("J*K = -K*J", c, d.negate());
728    }
729
730
731    /**
732     * Test power for Rational.
733     */
734    public void testRationalPower() {
735        BigRational a, b, c, d;
736        a = BigRational.ZERO.random(100);
737
738        // power operations
739        b = Power.<BigRational> positivePower(a, 1);
740        assertEquals("a^1 = a", b, a);
741
742        Power<BigRational> pow = new Power<BigRational>(BigRational.ONE);
743        b = pow.power(a, 1);
744        assertEquals("a^1 = a", b, a);
745
746        b = pow.power(a, 2);
747        c = a.multiply(a);
748        assertEquals("a^2 = a*a", b, c);
749
750        d = pow.power(a, -2);
751        c = b.multiply(d);
752        assertTrue("a^2 * a^-2 = 1", c.isONE());
753
754        b = pow.power(a, 3);
755        c = a.multiply(a).multiply(a);
756        assertEquals("a^3 = a*a*a", b, c);
757
758        d = pow.power(a, -3);
759        c = b.multiply(d);
760        assertTrue("a^3 * a^-3 = 1", c.isONE());
761
762        //Java 8:
763        d = a.power(-3);
764        c = b.multiply(d);
765        assertTrue("a^3 * a^-3 = 1", c.isONE());
766    }
767
768
769    /**
770     * Test power for Integer.
771     */
772    public void testIntegerPower() {
773        BigInteger a, b, c, d, e;
774        a = BigInteger.ZERO.random(500);
775
776        // power operations
777        b = Power.<BigInteger> positivePower(a, 1);
778        assertEquals("a^1 = a", b, a);
779
780        Power<BigInteger> pow = new Power<BigInteger>(BigInteger.ONE);
781        b = pow.power(a, 1);
782        assertEquals("a^1 = a", b, a);
783
784        b = pow.power(a, 2);
785        c = a.multiply(a);
786        assertEquals("a^2 = a*a", b, c);
787
788        b = pow.power(a, 3);
789        c = a.multiply(a).multiply(a);
790        assertEquals("a^3 = a*a*a", b, c);
791
792        // mod power operations
793        a = new BigInteger(3);
794        b = Power.<BigInteger> positivePower(a, 1);
795        assertEquals("a^1 = a", b, a);
796
797        a = new BigInteger(11);
798        e = new BigInteger(2);
799        c = Power.<BigInteger> modPositivePower(a, 10, e);
800        assertTrue("3^n mod 2 = 1", c.isONE());
801
802        // little fermat
803        a = BigInteger.ZERO.random(500);
804        b = new BigInteger(11);
805        c = Power.<BigInteger> modPositivePower(a, 11, b);
806        d = a.remainder(b);
807        assertEquals("a^p = a mod p", c, d);
808
809        c = pow.modPower(a, 11, b);
810        assertEquals("a^p = a mod p", c, d);
811
812        //Java 8:
813        a = BigInteger.ZERO.random(100);
814        d = a.power(1);
815        c = a;
816        assertEquals("a^1 == a", c, d);
817
818        d = a.power(0);
819        c = BigInteger.ONE;
820        assertEquals("a^0 == 1", c, d);
821
822        d = a.power(3);
823        c = a.multiply(a).multiply(a);
824        assertEquals("a^3 == a*a*a", c, d);
825    }
826
827
828    /**
829     * Test Combinatoric.
830     */
831    public void testCombinatoric() {
832        BigInteger a, b, c;
833
834        a = Combinatoric.binCoeff(5, 0);
835        assertTrue("(5 0) == 1 ", a.isONE());
836
837        a = Combinatoric.binCoeff(5, 7);
838        //System.out.println(5 + " over " + 7 + " = " + a);
839        assertTrue("(5 7) == 1 ", a.isONE());
840
841        int n = 7;
842        for (int k = 0; k <= n; k++) {
843            a = Combinatoric.binCoeff(n, k);
844            b = Combinatoric.binCoeff(n, n - k);
845            assertEquals("(5 k) == (5 5-k) ", b, a);
846            //System.out.println(n + " over " + k + " = " + a);
847        }
848        assertTrue("(5 5) == 1 ", a.isONE());
849
850        b = Combinatoric.binCoeffSum(n, n);
851        //System.out.println("sum( " + n + " over " + n + " ) = " + b);
852        c = Power.positivePower(new BigInteger(2), n);
853        assertEquals("sum(5 5) == 1 ", b, c);
854
855        b = Combinatoric.factorial(3);
856        assertEquals("3! == 6 ", b, new BigInteger(6));
857        b = Combinatoric.factorial(0);
858        assertEquals("0! == 1 ", b, new BigInteger(1));
859    }
860
861
862    /**
863     * Test square root.
864     */
865    public void testSquareRoot() {
866        BigInteger a, b, c, d, e, f;
867        a = BigInteger.ONE;
868
869        b = a.random(47).abs();
870        //b = c.multiply(c);
871        d = Roots.sqrtInt(b);
872        //System.out.println("b          = " + b);
873        //System.out.println("root       = " + d);
874        e = d.multiply(d);
875        //System.out.println("root^2     = " + e);
876        assertTrue("root^2 <= a ", e.compareTo(b) <= 0);
877        d = d.sum(BigInteger.ONE);
878        f = d.multiply(d);
879        //System.out.println("(root+1)^2 = " + f);
880        assertTrue("(root+1)^2 >= a ", f.compareTo(b) >= 0);
881
882        c = Roots.sqrt(b);
883        //System.out.println("b          = " + b);
884        //System.out.println("root       = " + c);
885        e = c.multiply(c);
886        //System.out.println("root^2     = " + e);
887        assertTrue("root^2 <= a ", e.compareTo(b) <= 0);
888        c = c.sum(BigInteger.ONE);
889        f = c.multiply(c);
890        //System.out.println("(root+1)^2 = " + f);
891        assertTrue("(root+1)^2 >= a ", f.compareTo(b) >= 0);
892    }
893
894
895    /**
896     * Test root.
897     */
898    public void testRoot() {
899        BigInteger a, b, d, e, f;
900        a = BigInteger.ONE;
901
902        b = a.random(47).abs();
903        //System.out.println("\nb          = " + b);
904        //System.out.println("bitsize(b) = " + b.val.bitLength());
905        for (int n = 2; n < 8; n++) {
906            d = Roots.root(b, n);
907            //System.out.println(n+"-th root  = " + d);
908            e = Power.positivePower(d, n);
909            //System.out.println("root^"+n+"     = " + e);
910            assertTrue("root^" + n + " <= a " + (b.subtract(e)), e.compareTo(b) <= 0);
911            d = d.sum(BigInteger.ONE);
912            f = Power.positivePower(d, n);
913            //System.out.println("(root+1)^"+n+" = " + f);
914            assertTrue("(root+1)^" + n + " >= a ", f.compareTo(b) >= 0);
915        }
916    }
917
918
919    /**
920     * Test root decimal.
921     */
922    public void testRootDecimal() {
923        BigDecimal a, b, d, e;
924        a = BigDecimal.ONE;
925        BigRational eps = new BigRational(1, 10).power(BigDecimal.DEFAULT_PRECISION - 2);
926        BigDecimal epsd = new BigDecimal(eps);
927
928        b = a.random(17).abs();
929        //System.out.println("\nb         = " + b);
930        //System.out.println("ulp(b)     = " + b.val.ulp());
931        for (int n = 1; n < 8; n++) {
932            d = Roots.root(b, n);
933            //System.out.println(n+"-th root = " + d);
934            e = Power.positivePower(d, n);
935            //System.out.println("root^"+n+"    = " + e);
936            if (b.compareTo(e) == 0) {
937                assertTrue("root^" + n + " == b: " + e, b.compareTo(e) == 0);
938                continue;
939            }
940            BigDecimal r = b.subtract(e).abs().divide(b.abs().sum(e.abs()));
941            assertTrue("root(a,n)**n == a: " + r, r.compareTo(epsd) <= 0);
942        }
943    }
944
945
946    /**
947     * Test root decimal.
948     */
949    public void test2RootDecimal() {
950        BigDecimal a, b, c, d;
951        a = BigDecimal.ZERO;
952        b = Roots.sqrt(a);
953        assertTrue("sqrt(0) == 0: " + b, b.isZERO());
954
955        a = BigDecimal.ONE;
956        b = Roots.sqrt(a);
957        assertTrue("sqrt(1) == 1: " + b, b.isONE());
958
959        a = new BigDecimal("4");
960        b = Roots.sqrt(a);
961        //b = Roots.root(a,2);
962        c = b.multiply(b);
963        assertTrue("sqrt(4)*sqrt(4) == 4: " + a.subtract(c), a.compareTo(c) == 0);
964        //System.out.println("DEFAULT_PRECISION = " + BigDecimal.DEFAULT_PRECISION);
965
966        a = new BigDecimal("0.5");
967        b = Roots.sqrt(a);
968        //b = Roots.root(a,2);
969        c = b.multiply(b);
970        //System.out.println("a = " + a + ", sqrt(a) = " + b + ", b^2 = " + c);
971        assertTrue("sqrt(0.5)*sqrt(0.5) == 0.5: " + a.subtract(c), a.compareTo(c) == 0);
972        assertTrue("sqrt(0.5)*sqrt(0.5) == 0.5: " + b, a.compareTo(c) == 0);
973
974        a = a.random(5).abs();
975        b = Roots.sqrt(a);
976        //b = Roots.root(a,2);
977        c = b.multiply(b);
978        //System.out.println("a = " + a + ", sqrt(a) = " + b + ", b^2 = " + c);
979        BigDecimal eps = new BigDecimal("0.1").power(BigDecimal.DEFAULT_PRECISION - 2);
980        d = a.subtract(c).abs().divide(a.abs().sum(BigDecimal.ONE));
981        assertTrue("sqrt(a)*sqrt(a) == a: " + d, d.compareTo(eps) <= 0);
982    }
983
984
985    /**
986     * Test root complex decimal.
987     */
988    public void testRootDecimalComplex() {
989        BigDecimalComplex a, b, c, d, e;
990        a = BigDecimalComplex.ZERO;
991        b = Roots.sqrt(a);
992        assertTrue("sqrt(0) == 0: " + b, b.isZERO());
993
994        a = BigDecimalComplex.ONE;
995        b = Roots.sqrt(a);
996        assertTrue("sqrt(1) == 1: " + b, b.isONE());
997
998        a = BigDecimalComplex.ONE.negate();
999        b = Roots.sqrt(a);
1000        d = b.multiply(b);
1001        //System.out.println("a = " + a + ", b = " + b + ", d = " + d);
1002        assertTrue("sqrt(-1) == I: " + b, b.isIMAG());
1003        assertTrue("sqrt(-1)*sqrt(-1) == -1: " + a + ", b = " + b, a.compareTo(d) == 0);
1004
1005        b = BigDecimalComplex.I;
1006        c = Roots.sqrt(b);
1007        d = c.multiply(c);
1008        //System.out.println("b = " + b + ", c = " + c + ", d = " + d);
1009        assertTrue("sqrt(b)*sqrt(b) == b: " + c + ", b = " + b, b.compareTo(d) == 0);
1010
1011        b = a.fromInteger(4);
1012        c = Roots.sqrt(b);
1013        d = BigDecimalComplex.ONE.sum(BigDecimalComplex.ONE);
1014        //System.out.println("b = " + b + ", c = " + c + ", d = " + d);
1015        assertTrue("sqrt(4) == 2: " + c, c.compareTo(d) == 0);
1016
1017        b = b.multiply(BigDecimalComplex.I);
1018        c = Roots.sqrt(b);
1019        d = c.multiply(c);
1020        //System.out.println("b = " + b + ", c = " + c + ", d = " + d);
1021        assertTrue("sqrt(b)*sqrt(b) == b: " + c + ", b = " + b, b.compareTo(d) == 0);
1022
1023        b = a.random(5);
1024        c = b.norm();
1025        d = b.multiply(b.conjugate());
1026        assertTrue("norm(b) == b*b^: b-d = " + c.subtract(d), c.compareTo(d) == 0);
1027
1028        BigRational eps = new BigRational(1, 10).power(BigDecimal.DEFAULT_PRECISION - 1);
1029        //System.out.println("eps = " + eps + ", epsd = " + new BigDecimal(eps));
1030        BigDecimal epsd = new BigDecimal(eps);
1031        BigDecimal dd;
1032
1033        //System.out.println("b = " + b + ", c = " + c);
1034        //c = b.norm();
1035        d = b.abs();
1036        e = d.multiply(d);
1037        dd = e.re.subtract(c.re).abs().divide(e.re.abs().sum(c.re.abs()));
1038        //System.out.println("dd = " + dd + ", d = " + d + ", e = " + e);
1039        assertTrue("abs()*abs() == norm(): " + dd, dd.compareTo(epsd) <= 0);
1040    }
1041
1042
1043    /**
1044     * Test root rational.
1045     */
1046    public void test2RootRational() {
1047        BigRational a, b, c, d;
1048        a = BigRational.ZERO;
1049        b = Roots.sqrt(a);
1050        assertTrue("sqrt(0) == 0: " + b, b.isZERO());
1051
1052        a = BigRational.ONE;
1053        b = Roots.sqrt(a);
1054        assertTrue("sqrt(1) == 1: " + b, b.isONE());
1055
1056        a = BigRational.ONE.negate();
1057        try {
1058            b = Roots.sqrt(a);
1059            fail("sqrt(-1) illegal: " + b);
1060        } catch (ArithmeticException e) {
1061            // pass
1062        }
1063
1064        a = new BigRational("4");
1065        b = Roots.sqrt(a);
1066        c = b.multiply(b);
1067        assertTrue("sqrt(4)*sqrt(4) == 4: " + a.subtract(c), a.compareTo(c) == 0);
1068        BigRational eps = new BigRational(1, 10).power(BigDecimal.DEFAULT_PRECISION - 1);
1069        //System.out.println("eps = " + eps + ", epsd = " + new BigDecimal(eps));
1070
1071        a = new BigRational("0.5");
1072        b = Roots.sqrt(a);
1073        c = b.multiply(b);
1074        //System.out.println("a = " + a + ", sqrt(a) = " + b + ", b^2 = " + c);
1075        d = a.subtract(c).abs().divide(a.abs().sum(c.abs()));
1076        //System.out.println("d = " + d + ", dd = " + new BigDecimal(d));
1077        assertTrue("sqrt(0.5)*sqrt(0.5) == 0.5: " + c, d.compareTo(eps) <= 0);
1078
1079        a = a.random(5).abs();
1080        b = Roots.sqrt(a);
1081        c = b.multiply(b);
1082        //System.out.println("a = " + a + ", sqrt(a) = " + b + ", b^2 = " + c);
1083        d = a.subtract(c).abs().divide(a.abs().sum(c.abs()));
1084        //System.out.println("d = " + d + ", dd = " + new BigDecimal(d));
1085        assertTrue("sqrt(0.5)*sqrt(0.5) == 0.5: " + c, d.compareTo(eps) <= 0);
1086    }
1087
1088
1089    /**
1090     * Test root/norm complex.
1091     */
1092    public void test2NormComplex() {
1093        BigComplex a, b;
1094        a = BigComplex.ZERO;
1095        b = a.abs();
1096        assertTrue("abs(0) == 0: " + b, b.isZERO());
1097
1098        a = BigComplex.ONE;
1099        b = a.abs();
1100        assertTrue("abs(1) == 1: " + b, b.isONE());
1101
1102        a = BigComplex.ONE.negate();
1103        b = a.abs();
1104        assertTrue("abs(-1): " + b, b.isONE());
1105
1106        BigRational eps = new BigRational(1, 10).power(BigDecimal.DEFAULT_PRECISION - 1);
1107        //System.out.println("eps = " + eps); // + ", epsd = " + new BigDecimal(eps));
1108
1109        BigRational r, s, t;
1110        a = a.random(5);
1111        b = a.abs();
1112        //System.out.println("a = " + a + ", b = " + b);
1113        r = b.multiply(b).re;
1114        s = a.multiply(a.conjugate()).re;
1115        //System.out.println("r = " + r + ", s = " + s);
1116        t = r.subtract(s).abs().divide(r.abs().sum(s.abs()));
1117        //System.out.println("t = " + t + ", eps = " + eps);
1118        assertTrue("abs()*abs() == norm(): " + b, t.compareTo(eps) <= 0);
1119    }
1120
1121
1122    /**
1123     * Test root/norm quaternion.
1124     */
1125    public void test2NormQuaternion() {
1126        BigQuaternion a, b;
1127        BigQuaternionRing fac = new BigQuaternionRing();
1128        a = fac.ZERO;
1129        b = a.abs();
1130        assertTrue("abs(0) == 0: " + b, b.isZERO());
1131
1132        a = fac.ONE;
1133        b = a.abs();
1134        assertTrue("abs(1) == 1: " + b, b.isONE());
1135
1136        a = fac.ONE.negate();
1137        b = a.abs();
1138        assertTrue("abs(-1): " + b, b.isONE());
1139
1140        BigRational eps = new BigRational(1, 10).power(BigDecimal.DEFAULT_PRECISION - 1);
1141        //System.out.println("eps = " + eps); // + ", epsd = " + new BigDecimal(eps));
1142
1143        BigRational r, s, t;
1144        a = fac.random(5);
1145        b = a.abs();
1146        //System.out.println("\na = " + a + ", b = " + b);
1147        r = b.multiply(b).re;
1148        s = a.multiply(a.conjugate()).re;
1149        //System.out.println("r = " + r + ", s = " + s);
1150        t = r.subtract(s).abs().divide(r.abs().sum(s.abs()));
1151        //System.out.println("t = " + t + ", eps = " + eps);
1152
1153        assertTrue("sqrt(x)*sqrt(x): " + b, t.compareTo(eps) <= 0);
1154    }
1155
1156
1157    /**
1158     * Test root/norm octonion.
1159     */
1160    public void test2NormOctonion() {
1161        BigOctonion a, b;
1162        BigQuaternionRing fac = new BigQuaternionRing();
1163        BigOctonion ofac = new BigOctonion(fac);
1164
1165        a = ofac.getZERO();
1166        b = a.abs();
1167        assertTrue("abs(0) == 0: " + b, b.isZERO());
1168
1169        a = ofac.getONE();
1170        b = a.abs();
1171        assertTrue("abs(1) == 1: " + b, b.isONE());
1172
1173        a = ofac.getONE().negate();
1174        b = a.abs();
1175        assertTrue("abs(-1): " + b, b.isONE());
1176
1177        BigRational eps = new BigRational(1, 10).power(BigDecimal.DEFAULT_PRECISION - 1);
1178        //System.out.println("eps = " + eps); // + ", epsd = " + new BigDecimal(eps));
1179
1180        BigRational r, s, t;
1181        a = ofac.random(5);
1182        b = a.abs();
1183        //System.out.println("\na = " + a + ", b = " + b);
1184        r = b.multiply(b).or.re;
1185        s = a.multiply(a.conjugate()).or.re;
1186        //System.out.println("r = " + r + ", s = " + s);
1187        t = r.subtract(s).abs().divide(r.abs().sum(s.abs()));
1188        //System.out.println("t = " + t + ", eps = " + eps);
1189
1190        assertTrue("sqrt(x)*sqrt(x): " + b, t.compareTo(eps) <= 0);
1191    }
1192
1193
1194    /**
1195     * Test continued fraction.
1196     */
1197    public void testContinuedFraction() {
1198        BigRational fac = BigRational.ONE;
1199        BigRational x = fac.random(35);
1200        //x = fac.parse("5/12");
1201        //x = fac.parse("-1");
1202
1203        List<BigInteger> cf = ArithUtil.continuedFraction(x);
1204        //System.out.println("cf(" + x + ") = " + cf);
1205
1206        BigRational a = ArithUtil.continuedFractionApprox(cf);
1207        //System.out.println("a = " + a);
1208        assertEquals("a = approx(cf(a)): ", x, a);
1209    }
1210
1211}