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>