[BACK]Return to test.pl CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / demos / perl

Annotation of OpenXM_contrib/gmp/demos/perl/test.pl, Revision 1.1

1.1     ! ohara       1: # GMP perl module tests
        !             2:
        !             3: # Copyright 2001 Free Software Foundation, Inc.
        !             4: #
        !             5: # This file is part of the GNU MP Library.
        !             6: #
        !             7: # The GNU MP Library is free software; you can redistribute it and/or modify
        !             8: # it under the terms of the GNU Lesser General Public License as published
        !             9: # by the Free Software Foundation; either version 2.1 of the License, or (at
        !            10: # your option) any later version.
        !            11: #
        !            12: # The GNU MP Library is distributed in the hope that it will be useful, but
        !            13: # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
        !            14: # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
        !            15: # License for more details.
        !            16: #
        !            17: # You should have received a copy of the GNU Lesser General Public License
        !            18: # along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
        !            19: # the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
        !            20: # MA 02111-1307, USA.
        !            21:
        !            22:
        !            23: # These tests aim to exercise the many possible combinations of operands
        !            24: # etc, and to run all functions at least once, which if nothing else will
        !            25: # check everything intended is in the :all list.
        !            26: #
        !            27: # Use the following in .emacs to match test failure messages.
        !            28: #
        !            29: # ;; perl "Test" module error messages
        !            30: # (eval-after-load "compile"
        !            31: #   '(add-to-list
        !            32: #     'compilation-error-regexp-alist
        !            33: #     '("^.*Failed test [0-9]+ in \\([^ ]+\\) at line \\([0-9]+\\)" 1 2)))
        !            34:
        !            35:
        !            36: use strict;
        !            37: use Test;
        !            38:
        !            39: BEGIN {
        !            40:   plan tests => 123,
        !            41:   onfail => sub { print "there were failures\n" },
        !            42: }
        !            43:
        !            44: use GMP qw(:all);
        !            45: use GMP::Mpz qw(:all);
        !            46: use GMP::Mpq qw(:all);
        !            47: use GMP::Mpf qw(:all);
        !            48: use GMP::Rand qw(:all);
        !            49:
        !            50: use GMP::Mpz qw(:constants);
        !            51: use GMP::Mpz qw(:noconstants);
        !            52: use GMP::Mpq qw(:constants);
        !            53: use GMP::Mpq qw(:noconstants);
        !            54: use GMP::Mpf qw(:constants);
        !            55: use GMP::Mpf qw(:noconstants);
        !            56:
        !            57: use GMP qw(version);
        !            58: print '$GMP::VERSION ',$GMP::VERSION,' GMP::version() ',version(),"\n";
        !            59:
        !            60: # force to a string, not a PVIV
        !            61: sub str {
        !            62:   my $s = "@_[0]" . "";
        !            63:   return $s;
        !            64: }
        !            65:
        !            66: foreach my $name ('mpz', 'mpq', 'mpf') {
        !            67:   print "$name\n";
        !            68:   my $mpx = eval("\\&$name");
        !            69:
        !            70:   ok (&$mpx() == 0);
        !            71:
        !            72:   foreach my $x (0, 1, -1, 123, -123) {
        !            73:     foreach my $y ($x, ""."$x", substr("$x",0), 0.0+$x,
        !            74:                   mpz($x), mpq($x), mpf($x)) {
        !            75:       ok (&$mpx($x) == $x);
        !            76:     }
        !            77:   }
        !            78:
        !            79:   ok (&$mpx(substr("11",0,1)) == 1);
        !            80:
        !            81:   ok (&$mpx(0) < 1);
        !            82:   ok (&$mpx(0) > -1);
        !            83:
        !            84:   ok (&$mpx(0) != 1);
        !            85:   ok (&$mpx(0) != -1);
        !            86:   ok (&$mpx(1) != 0);
        !            87:   ok (&$mpx(1) != -1);
        !            88:   ok (&$mpx(-1) != 0);
        !            89:   ok (&$mpx(-1) != 1);
        !            90:
        !            91:   ok (&$mpx(0) + 1 == 1);
        !            92:   ok (&$mpx(-1) + 1 == 0);
        !            93:   ok (1 + &$mpx(0) == 1);
        !            94:   ok (1 + &$mpx(-1) == 0);
        !            95:
        !            96:   ok (&$mpx(0) - 1 == -1);
        !            97:   ok (&$mpx(1) - 1 == 0);
        !            98:   ok (1 - &$mpx(0) == 1);
        !            99:   ok (1 - &$mpx(1) == 0);
        !           100:
        !           101:   ok (&$mpx(2) * 3 == 6);
        !           102:
        !           103:   ok (&$mpx(6) / 2 == 3);
        !           104:   ok (&$mpx(-6) / 2 == -3);
        !           105:   ok (&$mpx(6) / -2 == -3);
        !           106:   ok (&$mpx(-6) / -2 == 3);
        !           107:
        !           108:   ok (abs(&$mpx(0)) == 0);
        !           109:   ok (abs(&$mpx(1)) == 1);
        !           110:   ok (abs(&$mpx(-1)) == 1);
        !           111:   { my $x = &$mpx(-123); $x = abs($x); ok ($x == 123); }
        !           112:   { my $x = &$mpx(-1);   $x = abs($x); ok ($x == 1);   }
        !           113:   { my $x = &$mpx(0);    $x = abs($x); ok ($x == 0);   }
        !           114:   { my $x = &$mpx(1);    $x = abs($x); ok ($x == 1);   }
        !           115:   { my $x = &$mpx(123);  $x = abs($x); ok ($x == 123); }
        !           116:
        !           117:
        !           118:   foreach my $x (-123, -1, 0, 1, 123) {
        !           119:     foreach my $xv ($x, "$x", substr("$x",0), $x+0.0,
        !           120:                    mpz($x), mpq($x), mpf($x)) {
        !           121:       my $xm = &$mpx($xv);
        !           122:       if ($xm) {
        !           123:        ok ($x);
        !           124:       } else {
        !           125:        ok (not $x);
        !           126:       }
        !           127:       if (not $xm) {
        !           128:        ok (not $x);
        !           129:       } else {
        !           130:        ok ($x);
        !           131:       }
        !           132:       if (! $xm) {
        !           133:        ok (not $x);
        !           134:       } else {
        !           135:        ok ($x);
        !           136:       }
        !           137:     }
        !           138:   }
        !           139:
        !           140:   ok (- &$mpx(0) == 0);
        !           141:   ok (- &$mpx(1) == -1);
        !           142:   ok (- &$mpx(-1) == 1);
        !           143:
        !           144:   {
        !           145:     my $a = &$mpx(0); my $b = $a;
        !           146:     $a = &$mpx(1);
        !           147:     ok ($a == 1);
        !           148:     ok ($b == 0);
        !           149:   }
        !           150:   {
        !           151:     my $a = &$mpx(0); my $b = $a;
        !           152:     $a++;
        !           153:     ok ($a == 1);
        !           154:     ok ($b == 0);
        !           155:   }
        !           156:   {
        !           157:     my $a = &$mpx(0); my $b = $a;
        !           158:     $a--;
        !           159:     ok ($a == -1);
        !           160:     ok ($b == 0);
        !           161:   }
        !           162:   {
        !           163:     my $a = &$mpx(0); my $b = $a;
        !           164:     $a++;
        !           165:     ok ($a == 1);
        !           166:     ok ($b == 0);
        !           167:   }
        !           168:
        !           169:   { my $a = &$mpx(0); ok ($a++ == 0); }
        !           170:   { my $a = &$mpx(0); ok ($a-- == 0); }
        !           171:   { my $a = &$mpx(0); ok (++$a == 1); }
        !           172:   { my $a = &$mpx(0); ok (--$a == -1); }
        !           173:
        !           174:   { my $x = &$mpx(0);    ok("$x" eq "0"); }
        !           175:   { my $x = &$mpx(123);  ok("$x" eq "123"); }
        !           176:   { my $x = &$mpx(-123); ok("$x" eq "-123"); }
        !           177:
        !           178:   ok (&$mpx(0) ** 1 == 0);
        !           179:   ok (&$mpx(1) ** 1 == 1);
        !           180:   ok (&$mpx(2) ** 0 == 1);
        !           181:   ok (&$mpx(2) ** 1 == 2);
        !           182:   ok (&$mpx(2) ** 2 == 4);
        !           183:   ok (&$mpx(2) ** 3 == 8);
        !           184:   ok (&$mpx(2) ** 4 == 16);
        !           185:
        !           186:   ok (&$mpx(0) ** &$mpx(1) == 0);
        !           187:   ok (&$mpx(1) ** &$mpx(1) == 1);
        !           188:   ok (&$mpx(2) ** &$mpx(0) == 1);
        !           189:   ok (&$mpx(2) ** &$mpx(1) == 2);
        !           190:   ok (&$mpx(2) ** &$mpx(2) == 4);
        !           191:   ok (&$mpx(2) ** &$mpx(3) == 8);
        !           192:   ok (&$mpx(2) ** &$mpx(4) == 16);
        !           193:
        !           194:   { my $a = &$mpx(7);  $a += 1;  ok ($a == 8); }
        !           195:   { my $a = &$mpx(7);  $a -= 1;  ok ($a == 6); }
        !           196:   { my $a = &$mpx(7);  $a *= 3;  ok ($a == 21); }
        !           197:   { my $a = &$mpx(21); $a /= 3;  ok ($a == 7); }
        !           198:   { my $a = &$mpx(7);  $a <<= 1; ok ($a == 14); }
        !           199:   { my $a = &$mpx(32); $a >>= 1; ok ($a == 16); }
        !           200:   { my $a = &$mpx(3);  $a **= 4; ok ($a == 81); }
        !           201:
        !           202:   ok (! &$mpx("-9999999999999999999999999999999999999999999")->fits_slong_p());
        !           203:   ok (  &$mpx(-123)->fits_slong_p());
        !           204:   ok (  &$mpx(0)->fits_slong_p());
        !           205:   ok (  &$mpx(123)->fits_slong_p());
        !           206:   ok (! &$mpx("9999999999999999999999999999999999999999999")->fits_slong_p());
        !           207:
        !           208:   ok (&$mpx(-123)->sgn() == -1);
        !           209:   ok (&$mpx(-1)  ->sgn() == -1);
        !           210:   ok (&$mpx(0)   ->sgn() == 0);
        !           211:   ok (&$mpx(1)   ->sgn() == 1);
        !           212:   ok (&$mpx(123) ->sgn() == 1);
        !           213: }
        !           214:
        !           215: foreach my $x (-123, -1, 0, 1, 123) {
        !           216:   foreach my $xv ($x, "$x", substr("$x",0), $x+0.0,
        !           217:                  mpz($x), mpq($x), mpf($x)) {
        !           218:
        !           219:     ok (GMP::get_d($xv) == $x);
        !           220:     ok (GMP::get_si($xv) == $x);
        !           221:     ok (GMP::integer_p($xv) == 1);
        !           222:     ok (GMP::sgn($xv) == ($x <=> 0));
        !           223:
        !           224:     foreach my $y (-123, -1, 0, 1, 123) {
        !           225:       foreach my $yv ($y, "$y", 0.0+$y, mpz($y), mpq($y), mpf($y)) {
        !           226:
        !           227:        ok (($xv <=> $yv) == ($x <=> $y));
        !           228:       }
        !           229:     }
        !           230:   }
        !           231: }
        !           232:
        !           233: foreach my $xpair ([-123,"-7b"], [-1,"-1"], [0,"0"], [1,"1"], [123,"7b"]) {
        !           234:   my $x = $$xpair[0];
        !           235:   my $xhex = $$xpair[1];
        !           236:
        !           237:   foreach my $xv ($x, "$x", substr("$x",0),
        !           238:                  mpz($x), mpq($x)) {
        !           239:
        !           240:     ok (get_str($xv) eq "$x");
        !           241:     ok (get_str($xv,10) eq "$x");
        !           242:
        !           243:     ok (get_str($xv,16) == $xhex);
        !           244:     $xhex =~ tr [a-z] [A-Z];
        !           245:     ok (get_str($xv,-16) == $xhex);
        !           246:   }
        !           247: }
        !           248:
        !           249: ok (GMP::get_str(mpq(5/8)) eq "5/8");
        !           250: ok (GMP::get_str(mpq(-5/8)) eq "-5/8");
        !           251: ok (GMP::get_str(mpq(255/256),16) eq "ff/100");
        !           252: ok (GMP::get_str(mpq(255/256),-16) eq "FF/100");
        !           253: ok (GMP::get_str(mpq(-255/256),16) eq "-ff/100");
        !           254: ok (GMP::get_str(mpq(-255/256),-16) eq "-FF/100");
        !           255:
        !           256: foreach my $x (1.5, mpf(1.5)) {
        !           257:   { my ($s,$e) = get_str($x, 10);
        !           258:     ok ($s eq '15');
        !           259:     ok ($e == 1); }
        !           260: }
        !           261: foreach my $x (-1.5, mpf(-1.5)) {
        !           262:   { my ($s,$e) = get_str($x, 10);
        !           263:     ok ($s eq '-15');
        !           264:     ok ($e == 1); }
        !           265: }
        !           266: foreach my $x (1.5, mpf(1.5)) {
        !           267:   { my ($s,$e) = get_str($x, 16);
        !           268:     ok ($s eq '18');
        !           269:     ok ($e == 1); }
        !           270: }
        !           271: foreach my $x (-1.5, mpf(-1.5)) {
        !           272:   { my ($s,$e) = get_str($x, 16);
        !           273:     ok ($s eq '-18');
        !           274:     ok ($e == 1); }
        !           275: }
        !           276: foreach my $x (65536.0, mpf(65536.0)) {
        !           277:   { my ($s,$e) = get_str($x, 16);
        !           278:     ok ($s eq '1');
        !           279:     ok ($e == 5); }
        !           280: }
        !           281: foreach my $x (1.625, mpf(1.625)) {
        !           282:   { my ($s,$e) = get_str($x, 16);
        !           283:     ok ($s eq '1a');
        !           284:     ok ($e == 1); }
        !           285: }
        !           286: foreach my $x (1.625, mpf(1.625)) {
        !           287:   { my ($s,$e) = get_str($x, -16);
        !           288:     ok ($s eq '1A');
        !           289:     ok ($e == 1); }
        !           290: }
        !           291: foreach my $f (255.0, mpf(255)) {
        !           292:   my ($s, $e) = get_str(255.0,16,0);
        !           293:   ok ($s eq "ff");
        !           294:   ok ($e == 2);
        !           295: }
        !           296: foreach my $f (255.0, mpf(255)) {
        !           297:   my ($s, $e) = get_str(255.0,-16,0);
        !           298:   ok ($s eq "FF");
        !           299:   ok ($e == 2);
        !           300: }
        !           301: foreach my $f (-255.0, mpf(-255)) {
        !           302:   my ($s, $e) = get_str(-255.0,16,0);
        !           303:   ok ($s eq "-ff");
        !           304:   ok ($e == 2);
        !           305: }
        !           306: foreach my $f (-255.0, mpf(-255)) {
        !           307:   my ($s, $e) = get_str(-255.0,-16,0);
        !           308:   ok ($s eq "-FF");
        !           309:   ok ($e == 2);
        !           310: }
        !           311:
        !           312:
        !           313: ok (  GMP::integer_p (mpq(1)));
        !           314: ok (! GMP::integer_p (mpq(1,2)));
        !           315: ok (  GMP::integer_p (mpf(1.0)));
        !           316: ok (! GMP::integer_p (mpf(1.5)));
        !           317:
        !           318:
        !           319: ok (mpz(-8) % 3 == -2);
        !           320: ok (mpz(-7) % 3 == -1);
        !           321: ok (mpz(-6) % 3 == 0);
        !           322: ok (mpz(6) % 3 == 0);
        !           323: ok (mpz(7) % 3 == 1);
        !           324: ok (mpz(8) % 3 == 2);
        !           325:
        !           326: { my $a = mpz(24); $a %= 7; ok ($a == 3); }
        !           327:
        !           328: ok ((mpz(3) & 1) == 1);
        !           329: ok ((mpz(3) & 4) == 0);
        !           330: ok ((mpz(3) | 1) == 3);
        !           331: ok ((mpz(3) | 4) == 7);
        !           332: ok ((mpz(3) ^ 1) == 2);
        !           333: ok ((mpz(3) ^ 4) == 7);
        !           334: ok ((mpz("0xAA") | mpz("0x55")) == mpz("0xFF"));
        !           335:
        !           336: { my $a = mpz(3); $a &= 1; ok ($a == 1); }
        !           337: { my $a = mpz(3); $a &= 4; ok ($a == 0); }
        !           338: { my $a = mpz(3); $a |= 1; ok ($a == 3); }
        !           339: { my $a = mpz(3); $a |= 4; ok ($a == 7); }
        !           340: { my $a = mpz(3); $a ^= 1; ok ($a == 2); }
        !           341: { my $a = mpz(3); $a ^= 4; ok ($a == 7); }
        !           342:
        !           343: ok (~ mpz(0) == -1);
        !           344: ok (~ mpz(1) == -2);
        !           345: ok (~ mpz(-2) == 1);
        !           346: ok (~ mpz(0xFF) == -0x100);
        !           347: ok (~ mpz(-0x100) == 0xFF);
        !           348:
        !           349:
        !           350: # mpz functions
        !           351:
        !           352: ok (bin(2,0) == 1);
        !           353: ok (bin(2,1) == 2);
        !           354: ok (bin(2,2) == 1);
        !           355:
        !           356: ok (bin(3,0) == 1);
        !           357: ok (bin(3,1) == 3);
        !           358: ok (bin(3,2) == 3);
        !           359: ok (bin(3,3) == 1);
        !           360:
        !           361: { my ($q, $r);
        !           362:   ($q, $r) = cdiv (16, 3);
        !           363:   ok ($q == 6);
        !           364:   ok ($r == -2);
        !           365:   ($q, $r) = cdiv (16, -3);
        !           366:   ok ($q == -5);
        !           367:   ok ($r == 1);
        !           368:   ($q, $r) = cdiv (-16, 3);
        !           369:   ok ($q == -5);
        !           370:   ok ($r == -1);
        !           371:   ($q, $r) = cdiv (-16, -3);
        !           372:   ok ($q == 6);
        !           373:   ok ($r == 2);
        !           374: }
        !           375: { my ($q, $r);
        !           376:   ($q, $r) = fdiv (16, 3);
        !           377:   ok ($q == 5);
        !           378:   ok ($r == 1);
        !           379:   ($q, $r) = fdiv (16, -3);
        !           380:   ok ($q == -6);
        !           381:   ok ($r == -2);
        !           382:   ($q, $r) = fdiv (-16, 3);
        !           383:   ok ($q == -6);
        !           384:   ok ($r == 2);
        !           385:   ($q, $r) = fdiv (-16, -3);
        !           386:   ok ($q == 5);
        !           387:   ok ($r == -1);
        !           388: }
        !           389:
        !           390: { my ($q, $r);
        !           391:   ($q, $r) = tdiv (16, 3);
        !           392:   ok ($q == 5);
        !           393:   ok ($r == 1);
        !           394:   ($q, $r) = tdiv (16, -3);
        !           395:   ok ($q == -5);
        !           396:   ok ($r == 1);
        !           397:   ($q, $r) = tdiv (-16, 3);
        !           398:   ok ($q == -5);
        !           399:   ok ($r == -1);
        !           400:   ($q, $r) = tdiv (-16, -3);
        !           401:   ok ($q == 5);
        !           402:   ok ($r == -1);
        !           403: }
        !           404:
        !           405: { my ($q, $r);
        !           406:   ($q, $r) = cdiv_2exp (23, 2);
        !           407:   ok ($q == 6);
        !           408:   ok ($r == -1);
        !           409:   ($q, $r) = cdiv_2exp (-23, 2);
        !           410:   ok ($q == -5);
        !           411:   ok ($r == -3);
        !           412: }
        !           413: { my ($q, $r);
        !           414:   ($q, $r) = fdiv_2exp (23, 2);
        !           415:   ok ($q == 5);
        !           416:   ok ($r == 3);
        !           417:   ($q, $r) = fdiv_2exp (-23, 2);
        !           418:   ok ($q == -6);
        !           419:   ok ($r == 1);
        !           420: }
        !           421:
        !           422: { my ($q, $r);
        !           423:   ($q, $r) = tdiv_2exp (23, 2);
        !           424:   ok ($q == 5);
        !           425:   ok ($r == 3);
        !           426:   ($q, $r) = tdiv_2exp (-23, 2);
        !           427:   ok ($q == -5);
        !           428:   ok ($r == -3);
        !           429: }
        !           430:
        !           431: {
        !           432:   my $a = 3;
        !           433:   my $b = $a;
        !           434:   ok ($b == 3);
        !           435:   clrbit ($a, 0);
        !           436:   print "a==2\n";
        !           437:   ok ($a == 2);
        !           438:   print "b==3\n";
        !           439:   ok ($b == 3);
        !           440:   print "b=a\n";
        !           441:   $b = $a;
        !           442:   print "b==2\n";
        !           443:   ok ($b == 2);
        !           444:   print "done\n";
        !           445: }
        !           446: {
        !           447:   my $a = 0;
        !           448:   my $b = $a;
        !           449:   ok ($b == 0);
        !           450:   setbit ($a, 0);
        !           451:   ok ($a == 1);
        !           452:   ok ($b == 0);
        !           453:   $b = $a;
        !           454:   ok ($b == 1);
        !           455: }
        !           456:
        !           457: ok (  congruent_p (21, 0, 7));
        !           458: ok (! congruent_p (21, 1, 7));
        !           459: ok (  congruent_p (21, 5, 8));
        !           460: ok (! congruent_p (21, 6, 8));
        !           461:
        !           462: ok (  congruent_2exp_p (20, 0, 2));
        !           463: ok (! congruent_2exp_p (21, 0, 2));
        !           464: ok (! congruent_2exp_p (20, 1, 2));
        !           465:
        !           466: ok (divexact(27,3) == 9);
        !           467: ok (divexact(27,-3) == -9);
        !           468: ok (divexact(-27,3) == -9);
        !           469: ok (divexact(-27,-3) == 9);
        !           470:
        !           471: ok (  divisible_p (21, 7));
        !           472: ok (! divisible_p (21, 8));
        !           473:
        !           474: ok (  divisible_2exp_p (20, 2));
        !           475: ok (! divisible_2exp_p (21, 2));
        !           476:
        !           477: ok (! even_p(mpz(-3)));
        !           478: ok (  even_p(mpz(-2)));
        !           479: ok (! even_p(mpz(-1)));
        !           480: ok (  even_p(mpz(0)));
        !           481: ok (! even_p(mpz(1)));
        !           482: ok (  even_p(mpz(2)));
        !           483: ok (! even_p(mpz(3)));
        !           484:
        !           485: ok (fac(0) == 1);
        !           486: ok (fac(1) == 1);
        !           487: ok (fac(2) == 2);
        !           488: ok (fac(3) == 6);
        !           489: ok (fac(4) == 24);
        !           490: ok (fac(5) == 120);
        !           491:
        !           492: ok (fib(0) == 0);
        !           493: ok (fib(1) == 1);
        !           494: ok (fib(2) == 1);
        !           495: ok (fib(3) == 2);
        !           496: ok (fib(4) == 3);
        !           497: ok (fib(5) == 5);
        !           498: ok (fib(6) == 8);
        !           499:
        !           500: { my ($a, $b) = fib2(0); ok($a==0); ok($b==1); }
        !           501: { my ($a, $b) = fib2(1); ok($a==1); ok($b==0); }
        !           502: { my ($a, $b) = fib2(2); ok($a==1); ok($b==1); }
        !           503: { my ($a, $b) = fib2(3); ok($a==2); ok($b==1); }
        !           504: { my ($a, $b) = fib2(4); ok($a==3); ok($b==2); }
        !           505: { my ($a, $b) = fib2(5); ok($a==5); ok($b==3); }
        !           506: { my ($a, $b) = fib2(6); ok($a==8); ok($b==5); }
        !           507:
        !           508: ok (gcd (21) == 21);
        !           509: ok (gcd (21,15) == 3);
        !           510: ok (gcd (21,15,30,57) == 3);
        !           511: ok (gcd (21,-15) == 3);
        !           512: ok (gcd (-21,15) == 3);
        !           513: ok (gcd (-21,-15) == 3);
        !           514:
        !           515: {
        !           516:   my ($g, $x, $y) = gcdext (3,5);
        !           517:   ok ($g == 1);
        !           518:   ok ($x == 2);
        !           519:   ok ($y == -1);
        !           520: }
        !           521:
        !           522: ok (hamdist(5,7) == 1);
        !           523:
        !           524: ok (invert(1,123) == 1);
        !           525: ok (invert(6,7) == 6);
        !           526: ok (! defined invert(2,8));
        !           527:
        !           528: foreach my $i ([  1, 19,  1 ],
        !           529:               [  4, 19,  1 ],
        !           530:               [  5, 19,  1 ],
        !           531:               [  6, 19,  1 ],
        !           532:               [  7, 19,  1 ],
        !           533:               [  9, 19,  1 ],
        !           534:               [ 11, 19,  1 ],
        !           535:               [ 16, 19,  1 ],
        !           536:               [ 17, 19,  1 ],
        !           537:               [  2, 19, -1 ],
        !           538:               [  3, 19, -1 ],
        !           539:               [  8, 19, -1 ],
        !           540:               [ 10, 19, -1 ],
        !           541:               [ 12, 19, -1 ],
        !           542:               [ 13, 19, -1 ],
        !           543:               [ 14, 19, -1 ],
        !           544:               [ 15, 19, -1 ],
        !           545:               [ 18, 19, -1 ]) {
        !           546:   foreach my $fun (\&jacobi, \&kronecker) {
        !           547:     ok (&$fun ($$i[0], $$i[1]) == $$i[2]);
        !           548:
        !           549:     ok (&$fun ($$i[0],      str($$i[1])) == $$i[2]);
        !           550:     ok (&$fun (str($$i[0]),     $$i[1])  == $$i[2]);
        !           551:     ok (&$fun (str($$i[0]), str($$i[1])) == $$i[2]);
        !           552:
        !           553:     ok (&$fun ($$i[0],      mpz($$i[1])) == $$i[2]);
        !           554:     ok (&$fun (mpz($$i[0]), $$i[1]) == $$i[2]);
        !           555:     ok (&$fun (mpz($$i[0]), mpz($$i[1])) == $$i[2]);
        !           556:   }
        !           557: }
        !           558:
        !           559: ok (lcm (2) == 2);
        !           560: ok (lcm (0) == 0);
        !           561: ok (lcm (0,0) == 0);
        !           562: ok (lcm (0,0,0) == 0);
        !           563: ok (lcm (0,0,0,0) == 0);
        !           564: ok (lcm (2,0) == 0);
        !           565: ok (lcm (-2,0) == 0);
        !           566: ok (lcm (2,3) == 6);
        !           567: ok (lcm (2,3,4) == 12);
        !           568: ok (lcm (2,-3) == 6);
        !           569: ok (lcm (-2,3) == 6);
        !           570: ok (lcm (-2,-3) == 6);
        !           571: ok (lcm (mpz(2)**512,1) == mpz(2)**512);
        !           572: ok (lcm (mpz(2)**512,-1) == mpz(2)**512);
        !           573: ok (lcm (-mpz(2)**512,1) == mpz(2)**512);
        !           574: ok (lcm (-mpz(2)**512,-1) == mpz(2)**512);
        !           575: ok (lcm (mpz(2)**512,mpz(2)**512) == mpz(2)**512);
        !           576: ok (lcm (mpz(2)**512,-mpz(2)**512) == mpz(2)**512);
        !           577: ok (lcm (-mpz(2)**512,mpz(2)**512) == mpz(2)**512);
        !           578: ok (lcm (-mpz(2)**512,-mpz(2)**512) == mpz(2)**512);
        !           579:
        !           580: ok (lucnum(0) == 2);
        !           581: ok (lucnum(1) == 1);
        !           582: ok (lucnum(2) == 3);
        !           583: ok (lucnum(3) == 4);
        !           584: ok (lucnum(4) == 7);
        !           585: ok (lucnum(5) == 11);
        !           586: ok (lucnum(6) == 18);
        !           587:
        !           588: { my ($a, $b) = lucnum2(0); ok($a==2);  ok($b==-1); }
        !           589: { my ($a, $b) = lucnum2(1); ok($a==1);  ok($b==2); }
        !           590: { my ($a, $b) = lucnum2(2); ok($a==3);  ok($b==1); }
        !           591: { my ($a, $b) = lucnum2(3); ok($a==4);  ok($b==3); }
        !           592: { my ($a, $b) = lucnum2(4); ok($a==7);  ok($b==4); }
        !           593: { my ($a, $b) = lucnum2(5); ok($a==11); ok($b==7); }
        !           594: { my ($a, $b) = lucnum2(6); ok($a==18); ok($b==11); }
        !           595:
        !           596: ok (nextprime(2) == 3);
        !           597: ok (nextprime(3) == 5);
        !           598: ok (nextprime(5) == 7);
        !           599: ok (nextprime(7) == 11);
        !           600: ok (nextprime(11) == 13);
        !           601:
        !           602: ok (  odd_p(mpz(-3)));
        !           603: ok (! odd_p(mpz(-2)));
        !           604: ok (  odd_p(mpz(-1)));
        !           605: ok (! odd_p(mpz(0)));
        !           606: ok (  odd_p(mpz(1)));
        !           607: ok (! odd_p(mpz(2)));
        !           608: ok (  odd_p(mpz(3)));
        !           609:
        !           610: # ok (  perfect_power_p(mpz(-27)));
        !           611: # ok (! perfect_power_p(mpz(-9)));
        !           612: # ok (! perfect_power_p(mpz(-1)));
        !           613: ok (  perfect_power_p(mpz(0)));
        !           614: ok (  perfect_power_p(mpz(1)));
        !           615: ok (! perfect_power_p(mpz(2)));
        !           616: ok (! perfect_power_p(mpz(3)));
        !           617: ok (  perfect_power_p(mpz(4)));
        !           618: ok (  perfect_power_p(mpz(9)));
        !           619: ok (  perfect_power_p(mpz(27)));
        !           620: ok (  perfect_power_p(mpz(81)));
        !           621:
        !           622: ok (! perfect_square_p(mpz(-9)));
        !           623: ok (! perfect_square_p(mpz(-1)));
        !           624: ok (  perfect_square_p(mpz(0)));
        !           625: ok (  perfect_square_p(mpz(1)));
        !           626: ok (! perfect_square_p(mpz(2)));
        !           627: ok (! perfect_square_p(mpz(3)));
        !           628: ok (  perfect_square_p(mpz(4)));
        !           629: ok (  perfect_square_p(mpz(9)));
        !           630: ok (! perfect_square_p(mpz(27)));
        !           631: ok (  perfect_square_p(mpz(81)));
        !           632:
        !           633: ok (popcount(7) == 3);
        !           634:
        !           635: ok (powm (3,2,8) == 1);
        !           636:
        !           637: ok (  probab_prime_p(89,1));
        !           638: ok (! probab_prime_p(81,1));
        !           639:
        !           640: {
        !           641:   my $z = mpz(123);
        !           642:   realloc ($z, 512);
        !           643: }
        !           644:
        !           645: {
        !           646:   my ($rem, $mult);
        !           647:   ($rem, $mult) = remove(12,3);
        !           648:   ok ($rem == 4);
        !           649:   ok ($mult == 1);
        !           650:   ($rem, $mult) = remove(12,2);
        !           651:   ok ($rem == 3);
        !           652:   ok ($mult == 2);
        !           653: }
        !           654:
        !           655: ok (root(0,2) == 0);
        !           656: ok (root(8,3) == 2);
        !           657: ok (root(-8,3) == -2);
        !           658: ok (root(81,4) == 3);
        !           659: ok (root(243,5) == 3);
        !           660:
        !           661: { my ($r,$e);
        !           662:   ($r, $e) = roote(0,2);
        !           663:   ok ($r == 0);
        !           664:   ok ($e);
        !           665:   ($r, $e) = roote(81,4);
        !           666:   ok ($r == 3);
        !           667:   ok ($e);
        !           668:   ($r, $e) = roote(85,4);
        !           669:   ok ($r == 3);
        !           670:   ok (! $e);
        !           671: }
        !           672:
        !           673: {
        !           674:   my $ulong_max = ~ 0;
        !           675:   ok (scan0 (0, 0) == 0);
        !           676:   ok (scan0 (1, 0) == 1);
        !           677:   ok (scan0 (3, 0) == 2);
        !           678:   ok (scan0 (-1, 0) == $ulong_max);
        !           679:   ok (scan0 (-2, 1) == $ulong_max);
        !           680:
        !           681:   ok (scan1 (1, 0) == 0);
        !           682:   ok (scan1 (2, 0) == 1);
        !           683:   ok (scan1 (4, 0) == 2);
        !           684:   ok (scan1 (0, 0) == $ulong_max);
        !           685:   ok (scan1 (3, 2) == $ulong_max);
        !           686: }
        !           687:
        !           688: ok (sizeinbase(1,10) == 1);
        !           689: ok (sizeinbase(100,10) == 3);
        !           690: ok (sizeinbase(9999,10) == 5);
        !           691:
        !           692: foreach my $name ('mpz', 'mpf') {
        !           693:   print "$name\n";
        !           694:   my $mpx = eval("\\&$name");
        !           695:   ok (sqrt(&$mpx(0)) == 0);
        !           696:   ok (sqrt(&$mpx(1)) == 1);
        !           697:   ok (sqrt(&$mpx(4)) == 2);
        !           698:   ok (sqrt(&$mpx(81)) == 9);
        !           699: }
        !           700:
        !           701: {
        !           702:   my ($root, $rem) = sqrtrem(mpz(0));
        !           703:   ok ($root == 0);
        !           704:   ok ($rem == 0);
        !           705: }
        !           706: {
        !           707:   my ($root, $rem) = sqrtrem(mpz(1));
        !           708:   ok ($root == 1);
        !           709:   ok ($rem == 0);
        !           710: }
        !           711: {
        !           712:   my ($root, $rem) = sqrtrem(mpz(2));
        !           713:   ok ($root == 1);
        !           714:   ok ($rem == 1);
        !           715: }
        !           716: {
        !           717:   my ($root, $rem) = sqrtrem(mpz(9));
        !           718:   ok ($root == 3);
        !           719:   ok ($rem == 0);
        !           720: }
        !           721: {
        !           722:   my ($root, $rem) = sqrtrem(mpz(35));
        !           723:   ok ($root == 5);
        !           724:   ok ($rem == 10);
        !           725: }
        !           726: {
        !           727:   my ($root, $rem) = sqrtrem(mpz(0));
        !           728:   ok ($root == 0);
        !           729:   ok ($rem == 0);
        !           730: }
        !           731:
        !           732: ok (tstbit (6, 0) == 0);
        !           733: ok (tstbit (6, 1) == 1);
        !           734: ok (tstbit (6, 2) == 1);
        !           735: ok (tstbit (6, 3) == 0);
        !           736:
        !           737:
        !           738: # mpq functions
        !           739:
        !           740: ok (mpq('3/2') == mpq(3,2));
        !           741: ok (mpq('3/1') == mpq(3,1));
        !           742: ok (mpq('-3/2') == mpq(-3,2));
        !           743: ok (mpq('-3/1') == mpq(-3,1));
        !           744: ok (mpq('0x3') == mpq(3,1));
        !           745: ok (mpq('0b111') == mpq(7,1));
        !           746: ok (mpq('0b0') == mpq(0,1));
        !           747:
        !           748: ok (mpq(3,2) > 1);
        !           749: ok (mpq(3,2) < 2);
        !           750:
        !           751: ok (mpq(1,2)+mpq(1,3) == mpq(5,6));
        !           752: ok (mpq(1,2)+mpq(-1,3) == mpq(1,6));
        !           753: ok (mpq(-1,2)+mpq(1,3) == mpq(-1,6));
        !           754: ok (mpq(-1,2)+mpq(-1,3) == mpq(-5,6));
        !           755:
        !           756: ok (mpq(1,2)-mpq(1,3) == mpq(1,6));
        !           757: ok (mpq(1,2)-mpq(-1,3) == mpq(5,6));
        !           758: ok (mpq(-1,2)-mpq(1,3) == mpq(-5,6));
        !           759: ok (mpq(-1,2)-mpq(-1,3) == mpq(-1,6));
        !           760:
        !           761: {
        !           762:   my $q = mpq(21,15); canonicalize($q);
        !           763:   ok (num($q) == 7);
        !           764:   ok (den($q) == 5);
        !           765: }
        !           766:
        !           767: { my $q = mpq(5,7);  ok("$q" eq "5/7"); }
        !           768: { my $q = mpq(-5,7); ok("$q" eq "-5/7"); }
        !           769:
        !           770:
        !           771: # mpf functions
        !           772:
        !           773: ok (mpf(-1.5) == -1.5);
        !           774: ok (mpf(-1.0) == -1.0);
        !           775: ok (mpf(-0.5) == -0.5);
        !           776: ok (mpf(0) == 0);
        !           777: ok (mpf(0.5) == 0.5);
        !           778: ok (mpf(1.0) == 1.0);
        !           779: ok (mpf(1.5) == 1.5);
        !           780:
        !           781: ok (mpf("-1.5") == -1.5);
        !           782: ok (mpf("-1.0") == -1.0);
        !           783: ok (mpf("-0.5") == -0.5);
        !           784: ok (mpf("0") == 0);
        !           785: ok (mpf("0.5") == 0.5);
        !           786: ok (mpf("1.0") == 1.0);
        !           787: ok (mpf("1.5") == 1.5);
        !           788:
        !           789: { my $f = mpf(0.25);            ok("$f" eq "0.25"); }
        !           790: { my $f = mpf(-0.25);           ok("$f" eq "-0.25"); }
        !           791: { my $f = mpf(1.25);            ok("$f" eq "1.25"); }
        !           792: { my $f = mpf(-1.25);           ok("$f" eq "-1.25"); }
        !           793: { my $f = mpf(1000000);         ok("$f" eq "1000000"); }
        !           794: { my $f = mpf(-1000000); ok("$f" eq "-1000000"); }
        !           795:
        !           796: ok (floor(mpf(-7.5)) == -8.0);
        !           797: ok (ceil (mpf(-7.5)) == -7.0);
        !           798: ok (trunc(mpf(-7.5)) == -7.0);
        !           799: ok (floor(mpf(7.5)) == 7.0);
        !           800: ok (ceil (mpf(7.5)) == 8.0);
        !           801: ok (trunc(mpf(7.5)) == 7.0);
        !           802:
        !           803: set_default_prec(128);
        !           804: ok (  mpf_eq (mpz("0x10000000000000001"), mpz("0x10000000000000002"), 1));
        !           805: ok (! mpf_eq (mpz("0x11"), mpz("0x12"), 128));
        !           806:
        !           807: {
        !           808:   set_default_prec(128);
        !           809:   my $p = get_default_prec();
        !           810:   set_default_prec($p);
        !           811:   ok (get_default_prec() == $p);
        !           812: }
        !           813:
        !           814: ok (reldiff (2,4) == 1);
        !           815: ok (reldiff (4,2) == 0.5);
        !           816:
        !           817: {
        !           818:   my $x = mpf(1.0, 512);
        !           819:   my $y = $x;
        !           820:   my $yprec = get_prec ($y);
        !           821:   set_prec ($x, 1024);
        !           822:   ok (get_prec ($y) == $yprec);
        !           823:
        !           824:   my $xprec = get_prec ($x);
        !           825:   set_prec ($x, $xprec);
        !           826:   ok (get_prec ($x) == $xprec);
        !           827: }
        !           828:
        !           829:
        !           830: # random functions
        !           831:
        !           832: { my $r = randstate();                          ok (defined $r); }
        !           833: { my $r = randstate('lc_2exp', 1, 2, 3);        ok (defined $r); }
        !           834: { my $r = randstate('lc_2exp_size', 64);        ok (defined $r); }
        !           835: { my $r = randstate('lc_2exp_size', 999999999); ok (! defined $r); }
        !           836: {
        !           837:   my $r = randstate();
        !           838:   $r->seed(123);
        !           839:   $r->seed(time());
        !           840:   mpf_urandomb($r,1024);
        !           841:   mpz_urandomb($r,1024);
        !           842:   mpz_rrandomb($r,1024);
        !           843:   mpz_urandomm($r,mpz(3)**100);
        !           844: }
        !           845:
        !           846:
        !           847: # overloaded constants
        !           848:
        !           849: if ($^V > 5.00503) {
        !           850:   if (! do 'test2.pl') {
        !           851:     die "Cannot run test2.pl\n";
        !           852:   }
        !           853: }
        !           854:
        !           855:
        !           856: # printf functions
        !           857:
        !           858: {
        !           859:   GMP::printf ("hello world\n");
        !           860:
        !           861:   sub via_printf {
        !           862:     my $s;
        !           863:     open TEMP, ">test.tmp" or die;
        !           864:     GMP::printf TEMP @_;
        !           865:     close TEMP or die;
        !           866:     open TEMP, "<test.tmp" or die;
        !           867:     read (TEMP, $s, 1024);
        !           868:     close TEMP or die;
        !           869:     unlink 'test.tmp';
        !           870:     return $s;
        !           871:   }
        !           872:
        !           873:   my $z = mpz(123);
        !           874:   my $q = mpq(15,16);
        !           875:   my $f = mpf(1.5);
        !           876:
        !           877:   foreach my $name ('via_printf', 'sprintf') {
        !           878:     print "$name\n";
        !           879:     my $mpx = eval("\\&$name");
        !           880:
        !           881:     ok (&$mpx ("%d", $z) eq '123');
        !           882:     ok (&$mpx ("%d %d %d", 456, $z, 789) eq '456 123 789');
        !           883:     ok (&$mpx ("%d", $q) eq '15/16');
        !           884:     ok (&$mpx ("%f", $f) eq '1.500000');
        !           885:     ok (&$mpx ("%.2f", $f) eq '1.50');
        !           886:
        !           887:     ok (&$mpx ("%*d", 6, 123) eq '   123');
        !           888:     ok (&$mpx ("%*d", 6, $z)  eq '   123');
        !           889:     ok (&$mpx ("%*d", 6, $q)  eq ' 15/16');
        !           890:
        !           891:     ok (&$mpx ("%x", 123) eq '7b');
        !           892:     ok (&$mpx ("%x", $z)  eq '7b');
        !           893:     ok (&$mpx ("%X", 123) eq '7B');
        !           894:     ok (&$mpx ("%X", $z)  eq '7B');
        !           895:     ok (&$mpx ("%#x", 123) eq '0x7b');
        !           896:     ok (&$mpx ("%#x", $z)  eq '0x7b');
        !           897:     ok (&$mpx ("%#X", 123) eq '0X7B');
        !           898:     ok (&$mpx ("%#X", $z)  eq '0X7B');
        !           899:
        !           900:     ok (&$mpx ("%x", $q)  eq 'f/10');
        !           901:     ok (&$mpx ("%X", $q)  eq 'F/10');
        !           902:     ok (&$mpx ("%#x", $q)  eq '0xf/0x10');
        !           903:     ok (&$mpx ("%#X", $q)  eq '0XF/0X10');
        !           904:
        !           905:     ok (&$mpx ("%*.*f", 10, 3, 1.25) eq '     1.250');
        !           906:     ok (&$mpx ("%*.*f", 10, 3, $f)   eq '     1.500');
        !           907:   }
        !           908: }
        !           909:
        !           910: # Local variables:
        !           911: # perl-indent-level: 2
        !           912: # End:

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>