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