1#!/usr/bin/perl -w 2 3# GMP perl module tests 4 5# Copyright 2001, 2002, 2003 Free Software Foundation, Inc. 6# 7# This file is part of the GNU MP Library. 8# 9# The GNU MP Library is free software; you can redistribute it and/or modify 10# it under the terms of the GNU Lesser General Public License as published 11# by the Free Software Foundation; either version 3 of the License, or (at 12# your option) any later version. 13# 14# The GNU MP Library is distributed in the hope that it will be useful, but 15# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 16# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 17# License for more details. 18# 19# You should have received a copy of the GNU Lesser General Public License 20# along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. 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 36use strict; 37use Test; 38 39BEGIN { 40 plan tests => 123, 41 onfail => sub { print "there were failures\n" }, 42} 43 44use GMP qw(:all); 45use GMP::Mpz qw(:all); 46use GMP::Mpq qw(:all); 47use GMP::Mpf qw(:all); 48use GMP::Rand qw(:all); 49 50use GMP::Mpz qw(:constants); 51use GMP::Mpz qw(:noconstants); 52use GMP::Mpq qw(:constants); 53use GMP::Mpq qw(:noconstants); 54use GMP::Mpf qw(:constants); 55use GMP::Mpf qw(:noconstants); 56 57package Mytie; 58use Exporter; 59use vars qw($val $fetched $stored); 60$val = 0; 61$fetched = 0; 62$stored = 0; 63sub TIESCALAR { 64 my ($class, $newval) = @_; 65 my $var = 'mytie dummy refed var'; 66 $val = $newval; 67 $fetched = 0; 68 $stored = 0; 69 return bless \$var, $class; 70} 71sub FETCH { 72 my ($self) = @_; 73 $fetched++; 74 return $val; 75} 76sub STORE { 77 my ($self, $newval) = @_; 78 $val = $newval; 79 $stored++; 80} 81package main; 82 83# check Mytie does what it should 84{ tie my $t, 'Mytie', 123; 85 ok ($Mytie::val == 123); 86 $Mytie::val = 456; 87 ok ($t == 456); 88 $t = 789; 89 ok ($Mytie::val == 789); 90} 91 92 93# Usage: str(x) 94# Return x forced to a string, not a PVIV. 95# 96sub str { 97 my $s = "$_[0]" . ""; 98 return $s; 99} 100 101my $ivnv_2p128 = 65536.0 * 65536.0 * 65536.0 * 65536.0 102 * 65536.0 * 65536.0 * 65536.0 * 65536.0; 103kill (0, $ivnv_2p128); 104my $str_2p128 = '340282366920938463463374607431768211456'; 105 106my $uv_max = ~ 0; 107my $uv_max_str = ~ 0; 108$uv_max_str = "$uv_max_str"; 109$uv_max_str = "" . "$uv_max_str"; 110 111 112#------------------------------------------------------------------------------ 113# GMP::version 114 115use GMP qw(version); 116print '$GMP::VERSION ',$GMP::VERSION,' GMP::version() ',version(),"\n"; 117 118 119#------------------------------------------------------------------------------ 120# GMP::Mpz::new 121 122ok (mpz(0) == 0); 123ok (mpz('0') == 0); 124ok (mpz(substr('101',1,1)) == 0); 125ok (mpz(0.0) == 0); 126ok (mpz(mpz(0)) == 0); 127ok (mpz(mpq(0)) == 0); 128ok (mpz(mpf(0)) == 0); 129 130{ tie my $t, 'Mytie', 0; 131 ok (mpz($t) == 0); 132 ok ($Mytie::fetched > 0); 133} 134{ tie my $t, 'Mytie', '0'; 135 ok (mpz($t) == 0); 136 ok ($Mytie::fetched > 0); 137} 138{ tie my $t, 'Mytie', substr('101',1,1); ok (mpz($t) == 0); } 139{ tie my $t, 'Mytie', 0.0; ok (mpz($t) == 0); } 140{ tie my $t, 'Mytie', mpz(0); ok (mpz($t) == 0); } 141{ tie my $t, 'Mytie', mpq(0); ok (mpz($t) == 0); } 142{ tie my $t, 'Mytie', mpf(0); ok (mpz($t) == 0); } 143 144ok (mpz(-123) == -123); 145ok (mpz('-123') == -123); 146ok (mpz(substr('1-1231',1,4)) == -123); 147ok (mpz(-123.0) == -123); 148ok (mpz(mpz(-123)) == -123); 149ok (mpz(mpq(-123)) == -123); 150ok (mpz(mpf(-123)) == -123); 151 152{ tie my $t, 'Mytie', -123; ok (mpz($t) == -123); } 153{ tie my $t, 'Mytie', '-123'; ok (mpz($t) == -123); } 154{ tie my $t, 'Mytie', substr('1-1231',1,4); ok (mpz($t) == -123); } 155{ tie my $t, 'Mytie', -123.0; ok (mpz($t) == -123); } 156{ tie my $t, 'Mytie', mpz(-123); ok (mpz($t) == -123); } 157{ tie my $t, 'Mytie', mpq(-123); ok (mpz($t) == -123); } 158{ tie my $t, 'Mytie', mpf(-123); ok (mpz($t) == -123); } 159 160ok (mpz($ivnv_2p128) == $str_2p128); 161{ tie my $t, 'Mytie', $ivnv_2p128; ok (mpz($t) == $str_2p128); } 162 163ok (mpz($uv_max) > 0); 164ok (mpz($uv_max) == mpz($uv_max_str)); 165{ tie my $t, 'Mytie', $uv_max; ok (mpz($t) > 0); } 166{ tie my $t, 'Mytie', $uv_max; ok (mpz($t) == mpz($uv_max_str)); } 167 168{ my $s = '999999999999999999999999999999'; 169 kill (0, $s); 170 ok (mpz($s) == '999999999999999999999999999999'); 171 tie my $t, 'Mytie', $s; 172 ok (mpz($t) == '999999999999999999999999999999'); 173} 174 175#------------------------------------------------------------------------------ 176# GMP::Mpz::overload_abs 177 178ok (abs(mpz(0)) == 0); 179ok (abs(mpz(123)) == 123); 180ok (abs(mpz(-123)) == 123); 181 182{ my $x = mpz(-123); $x = abs($x); ok ($x == 123); } 183{ my $x = mpz(0); $x = abs($x); ok ($x == 0); } 184{ my $x = mpz(123); $x = abs($x); ok ($x == 123); } 185 186{ tie my $t, 'Mytie', mpz(0); ok (abs($t) == 0); } 187{ tie my $t, 'Mytie', mpz(123); ok (abs($t) == 123); } 188{ tie my $t, 'Mytie', mpz(-123); ok (abs($t) == 123); } 189 190#------------------------------------------------------------------------------ 191# GMP::Mpz::overload_add 192 193ok (mpz(0) + 1 == 1); 194ok (mpz(-1) + 1 == 0); 195ok (1 + mpz(0) == 1); 196ok (1 + mpz(-1) == 0); 197 198#------------------------------------------------------------------------------ 199# GMP::Mpz::overload_addeq 200 201{ my $a = mpz(7); $a += 1; ok ($a == 8); } 202{ my $a = mpz(7); my $b = $a; $a += 1; ok ($a == 8); ok ($b == 7); } 203 204#------------------------------------------------------------------------------ 205# GMP::Mpz::overload_and 206 207ok ((mpz(3) & 1) == 1); 208ok ((mpz(3) & 4) == 0); 209 210{ my $a = mpz(3); $a &= 1; ok ($a == 1); } 211{ my $a = mpz(3); $a &= 4; ok ($a == 0); } 212 213#------------------------------------------------------------------------------ 214# GMP::Mpz::overload_bool 215 216if (mpz(0)) { ok (0); } else { ok (1); } 217if (mpz(123)) { ok (1); } else { ok (0); } 218 219#------------------------------------------------------------------------------ 220# GMP::Mpz::overload_com 221 222ok (~ mpz(0) == -1); 223ok (~ mpz(1) == -2); 224ok (~ mpz(-2) == 1); 225ok (~ mpz(0xFF) == -0x100); 226ok (~ mpz(-0x100) == 0xFF); 227 228#------------------------------------------------------------------------------ 229# GMP::Mpz::overload_dec 230 231{ my $a = mpz(0); ok ($a-- == 0); ok ($a == -1); } 232{ my $a = mpz(0); ok (--$a == -1); } 233 234{ my $a = mpz(0); my $b = $a; $a--; ok ($a == -1); ok ($b == 0); } 235 236#------------------------------------------------------------------------------ 237# GMP::Mpz::overload_div 238 239ok (mpz(6) / 2 == 3); 240ok (mpz(-6) / 2 == -3); 241ok (mpz(6) / -2 == -3); 242ok (mpz(-6) / -2 == 3); 243 244#------------------------------------------------------------------------------ 245# GMP::Mpz::overload_diveq 246 247{ my $a = mpz(21); $a /= 3; ok ($a == 7); } 248{ my $a = mpz(21); my $b = $a; $a /= 3; ok ($a == 7); ok ($b == 21); } 249 250#------------------------------------------------------------------------------ 251# GMP::Mpz::overload_eq 252 253{ my $a = mpz(0); 254 my $b = $a; 255 $a = mpz(1); 256 ok ($a == 1); 257 ok ($b == 0); } 258 259#------------------------------------------------------------------------------ 260# GMP::Mpz::overload_inc 261 262{ my $a = mpz(0); ok ($a++ == 0); ok ($a == 1); } 263{ my $a = mpz(0); ok (++$a == 1); } 264 265{ my $a = mpz(0); my $b = $a; $a++; ok ($a == 1); ok ($b == 0); } 266 267#------------------------------------------------------------------------------ 268# GMP::Mpz::overload_ior 269 270ok ((mpz(3) | 1) == 3); 271ok ((mpz(3) | 4) == 7); 272 273{ my $a = mpz(3); $a |= 1; ok ($a == 3); } 274{ my $a = mpz(3); $a |= 4; ok ($a == 7); } 275 276ok ((mpz("0xAA") | mpz("0x55")) == mpz("0xFF")); 277 278#------------------------------------------------------------------------------ 279# GMP::Mpz::overload_lshift 280 281{ my $a = mpz(7) << 1; ok ($a == 14); } 282 283#------------------------------------------------------------------------------ 284# GMP::Mpz::overload_lshifteq 285 286{ my $a = mpz(7); $a <<= 1; ok ($a == 14); } 287{ my $a = mpz(7); my $b = $a; $a <<= 1; ok ($a == 14); ok ($b == 7); } 288 289#------------------------------------------------------------------------------ 290# GMP::Mpz::overload_mul 291 292ok (mpz(2) * 3 == 6); 293 294#------------------------------------------------------------------------------ 295# GMP::Mpz::overload_muleq 296 297{ my $a = mpz(7); $a *= 3; ok ($a == 21); } 298{ my $a = mpz(7); my $b = $a; $a *= 3; ok ($a == 21); ok ($b == 7); } 299 300#------------------------------------------------------------------------------ 301# GMP::Mpz::overload_neg 302 303ok (- mpz(0) == 0); 304ok (- mpz(123) == -123); 305ok (- mpz(-123) == 123); 306 307#------------------------------------------------------------------------------ 308# GMP::Mpz::overload_not 309 310if (not mpz(0)) { ok (1); } else { ok (0); } 311if (not mpz(123)) { ok (0); } else { ok (1); } 312 313ok ((! mpz(0)) == 1); 314ok ((! mpz(123)) == 0); 315 316#------------------------------------------------------------------------------ 317# GMP::Mpz::overload_pow 318 319ok (mpz(0) ** 1 == 0); 320ok (mpz(1) ** 1 == 1); 321ok (mpz(2) ** 0 == 1); 322ok (mpz(2) ** 1 == 2); 323ok (mpz(2) ** 2 == 4); 324ok (mpz(2) ** 3 == 8); 325ok (mpz(2) ** 4 == 16); 326 327ok (mpz(0) ** mpz(1) == 0); 328ok (mpz(1) ** mpz(1) == 1); 329ok (mpz(2) ** mpz(0) == 1); 330ok (mpz(2) ** mpz(1) == 2); 331ok (mpz(2) ** mpz(2) == 4); 332ok (mpz(2) ** mpz(3) == 8); 333ok (mpz(2) ** mpz(4) == 16); 334 335#------------------------------------------------------------------------------ 336# GMP::Mpz::overload_poweq 337 338{ my $a = mpz(3); $a **= 4; ok ($a == 81); } 339{ my $a = mpz(3); my $b = $a; $a **= 4; ok ($a == 81); ok ($b == 3); } 340 341#------------------------------------------------------------------------------ 342# GMP::Mpz::overload_rem 343 344ok (mpz(-8) % 3 == -2); 345ok (mpz(-7) % 3 == -1); 346ok (mpz(-6) % 3 == 0); 347ok (mpz(6) % 3 == 0); 348ok (mpz(7) % 3 == 1); 349ok (mpz(8) % 3 == 2); 350 351{ my $a = mpz(24); $a %= 7; ok ($a == 3); } 352 353#------------------------------------------------------------------------------ 354# GMP::Mpz::overload_rshift 355 356{ my $a = mpz(32) >> 1; ok ($a == 16); } 357 358#------------------------------------------------------------------------------ 359# GMP::Mpz::overload_rshifteq 360 361{ my $a = mpz(32); $a >>= 1; ok ($a == 16); } 362{ my $a = mpz(32); my $b = $a; $a >>= 1; ok ($a == 16); ok ($b == 32); } 363 364#------------------------------------------------------------------------------ 365# GMP::Mpz::overload_spaceship 366 367ok (mpz(0) < 1); 368ok (mpz(0) > -1); 369 370ok (mpz(0) != 1); 371ok (mpz(0) != -1); 372ok (mpz(1) != 0); 373ok (mpz(1) != -1); 374ok (mpz(-1) != 0); 375ok (mpz(-1) != 1); 376 377ok (mpz(0) < 1.0); 378ok (mpz(0) < '1'); 379ok (mpz(0) < substr('-1',1,1)); 380ok (mpz(0) < mpz(1)); 381ok (mpz(0) < mpq(1)); 382ok (mpz(0) < mpf(1)); 383ok (mpz(0) < $uv_max); 384 385#------------------------------------------------------------------------------ 386# GMP::Mpz::overload_sqrt 387 388ok (sqrt(mpz(0)) == 0); 389ok (sqrt(mpz(1)) == 1); 390ok (sqrt(mpz(4)) == 2); 391ok (sqrt(mpz(81)) == 9); 392 393#------------------------------------------------------------------------------ 394# GMP::Mpz::overload_string 395 396{ my $x = mpz(0); ok("$x" eq "0"); } 397{ my $x = mpz(123); ok("$x" eq "123"); } 398{ my $x = mpz(-123); ok("$x" eq "-123"); } 399 400#------------------------------------------------------------------------------ 401# GMP::Mpz::overload_sub 402 403ok (mpz(0) - 1 == -1); 404ok (mpz(1) - 1 == 0); 405ok (1 - mpz(0) == 1); 406ok (1 - mpz(1) == 0); 407 408#------------------------------------------------------------------------------ 409# GMP::Mpz::overload_subeq 410 411{ my $a = mpz(7); $a -= 1; ok ($a == 6); } 412{ my $a = mpz(7); my $b = $a; $a -= 1; ok ($a == 6); ok ($b == 7); } 413 414#------------------------------------------------------------------------------ 415# GMP::Mpz::overload_xor 416 417ok ((mpz(3) ^ 1) == 2); 418ok ((mpz(3) ^ 4) == 7); 419 420{ my $a = mpz(3); $a ^= 1; ok ($a == 2); } 421{ my $a = mpz(3); $a ^= 4; ok ($a == 7); } 422 423 424#------------------------------------------------------------------------------ 425# GMP::Mpz::bin 426 427ok (bin(2,0) == 1); 428ok (bin(2,1) == 2); 429ok (bin(2,2) == 1); 430 431ok (bin(3,0) == 1); 432ok (bin(3,1) == 3); 433ok (bin(3,2) == 3); 434ok (bin(3,3) == 1); 435 436 437#------------------------------------------------------------------------------ 438# GMP::Mpz::cdiv 439 440{ my ($q, $r); 441 ($q, $r) = cdiv (16, 3); 442 ok ($q == 6); 443 ok ($r == -2); 444 ($q, $r) = cdiv (16, -3); 445 ok ($q == -5); 446 ok ($r == 1); 447 ($q, $r) = cdiv (-16, 3); 448 ok ($q == -5); 449 ok ($r == -1); 450 ($q, $r) = cdiv (-16, -3); 451 ok ($q == 6); 452 ok ($r == 2); 453} 454 455 456#------------------------------------------------------------------------------ 457# GMP::Mpz::cdiv_2exp 458 459{ my ($q, $r); 460 ($q, $r) = cdiv_2exp (23, 2); 461 ok ($q == 6); 462 ok ($r == -1); 463 ($q, $r) = cdiv_2exp (-23, 2); 464 ok ($q == -5); 465 ok ($r == -3); 466} 467 468 469#------------------------------------------------------------------------------ 470# GMP::Mpz::clrbit 471 472{ my $a = mpz(3); clrbit ($a, 1); ok ($a == 1); 473 ok (UNIVERSAL::isa($a,"GMP::Mpz")); } 474{ my $a = mpz(3); clrbit ($a, 2); ok ($a == 3); 475 ok (UNIVERSAL::isa($a,"GMP::Mpz")); } 476 477{ my $a = 3; clrbit ($a, 1); ok ($a == 1); 478 ok (UNIVERSAL::isa($a,"GMP::Mpz")); } 479{ my $a = 3; clrbit ($a, 2); ok ($a == 3); 480 ok (UNIVERSAL::isa($a,"GMP::Mpz")); } 481 482# mutate only given variable 483{ my $a = mpz(3); 484 my $b = $a; 485 clrbit ($a, 0); 486 ok ($a == 2); 487 ok ($b == 3); 488} 489{ my $a = 3; 490 my $b = $a; 491 clrbit ($a, 0); 492 ok ($a == 2); 493 ok ($b == 3); 494} 495 496{ tie my $a, 'Mytie', mpz(3); 497 clrbit ($a, 1); 498 ok ($Mytie::fetched > 0); # used fetch 499 ok ($Mytie::stored > 0); # used store 500 ok ($a == 1); # expected result 501 ok (UNIVERSAL::isa($a,"GMP::Mpz")); 502 ok (tied($a)); # still tied 503} 504{ tie my $a, 'Mytie', 3; 505 clrbit ($a, 1); 506 ok ($Mytie::fetched > 0); # used fetch 507 ok ($Mytie::stored > 0); # used store 508 ok ($a == 1); # expected result 509 ok (UNIVERSAL::isa($a,"GMP::Mpz")); 510 ok (tied($a)); # still tied 511} 512 513{ my $b = mpz(3); 514 tie my $a, 'Mytie', $b; 515 clrbit ($a, 0); 516 ok ($a == 2); 517 ok ($b == 3); 518 ok (tied($a)); 519} 520{ my $b = 3; 521 tie my $a, 'Mytie', $b; 522 clrbit ($a, 0); 523 ok ($a == 2); 524 ok ($b == 3); 525 ok (tied($a)); 526} 527 528#------------------------------------------------------------------------------ 529# GMP::Mpz::combit 530 531{ my $a = mpz(3); combit ($a, 1); ok ($a == 1); 532 ok (UNIVERSAL::isa($a,"GMP::Mpz")); } 533{ my $a = mpz(3); combit ($a, 2); ok ($a == 7); 534 ok (UNIVERSAL::isa($a,"GMP::Mpz")); } 535 536{ my $a = 3; combit ($a, 1); ok ($a == 1); 537 ok (UNIVERSAL::isa($a,"GMP::Mpz")); } 538{ my $a = 3; combit ($a, 2); ok ($a == 7); 539 ok (UNIVERSAL::isa($a,"GMP::Mpz")); } 540 541# mutate only given variable 542{ my $a = mpz(3); 543 my $b = $a; 544 combit ($a, 0); 545 ok ($a == 2); 546 ok ($b == 3); 547} 548{ my $a = 3; 549 my $b = $a; 550 combit ($a, 0); 551 ok ($a == 2); 552 ok ($b == 3); 553} 554 555{ tie my $a, 'Mytie', mpz(3); 556 combit ($a, 2); 557 ok ($Mytie::fetched > 0); # used fetch 558 ok ($Mytie::stored > 0); # used store 559 ok ($a == 7); # expected result 560 ok (UNIVERSAL::isa($a,"GMP::Mpz")); 561 ok (tied($a)); # still tied 562} 563{ tie my $a, 'Mytie', 3; 564 combit ($a, 2); 565 ok ($Mytie::fetched > 0); # used fetch 566 ok ($Mytie::stored > 0); # used store 567 ok ($a == 7); # expected result 568 ok (UNIVERSAL::isa($a,"GMP::Mpz")); 569 ok (tied($a)); # still tied 570} 571 572{ my $b = mpz(3); 573 tie my $a, 'Mytie', $b; 574 combit ($a, 0); 575 ok ($a == 2); 576 ok ($b == 3); 577 ok (tied($a)); 578} 579{ my $b = 3; 580 tie my $a, 'Mytie', $b; 581 combit ($a, 0); 582 ok ($a == 2); 583 ok ($b == 3); 584 ok (tied($a)); 585} 586 587#------------------------------------------------------------------------------ 588# GMP::Mpz::congruent_p 589 590ok ( congruent_p (21, 0, 7)); 591ok (! congruent_p (21, 1, 7)); 592ok ( congruent_p (21, 5, 8)); 593ok (! congruent_p (21, 6, 8)); 594 595 596#------------------------------------------------------------------------------ 597# GMP::Mpz::congruent_2exp_p 598 599ok ( congruent_2exp_p (20, 0, 2)); 600ok (! congruent_2exp_p (21, 0, 2)); 601ok (! congruent_2exp_p (20, 1, 2)); 602 603#------------------------------------------------------------------------------ 604# GMP::Mpz::divexact 605 606ok (divexact(27,3) == 9); 607ok (divexact(27,-3) == -9); 608ok (divexact(-27,3) == -9); 609ok (divexact(-27,-3) == 9); 610 611#------------------------------------------------------------------------------ 612# GMP::Mpz::divisible_p 613 614ok ( divisible_p (21, 7)); 615ok (! divisible_p (21, 8)); 616 617#------------------------------------------------------------------------------ 618# GMP::Mpz::divisible_2exp_p 619 620ok ( divisible_2exp_p (20, 2)); 621ok (! divisible_2exp_p (21, 2)); 622 623#------------------------------------------------------------------------------ 624# GMP::Mpz::even_p 625 626ok (! even_p(mpz(-3))); 627ok ( even_p(mpz(-2))); 628ok (! even_p(mpz(-1))); 629ok ( even_p(mpz(0))); 630ok (! even_p(mpz(1))); 631ok ( even_p(mpz(2))); 632ok (! even_p(mpz(3))); 633 634#------------------------------------------------------------------------------ 635# GMP::Mpz::export 636 637{ my $s = mpz_export (1, 2, 1, 0, "0x61626364"); 638 ok ($s eq 'abcd'); } 639{ my $s = mpz_export (-1, 2, 1, 0, "0x61626364"); 640 ok ($s eq 'cdab'); } 641{ my $s = mpz_export (1, 2, -1, 0, "0x61626364"); 642 ok ($s eq 'badc'); } 643{ my $s = mpz_export (-1, 2, -1, 0, "0x61626364"); 644 ok ($s eq 'dcba'); } 645 646#------------------------------------------------------------------------------ 647# GMP::Mpz::fac 648 649ok (fac(0) == 1); 650ok (fac(1) == 1); 651ok (fac(2) == 2); 652ok (fac(3) == 6); 653ok (fac(4) == 24); 654ok (fac(5) == 120); 655 656#------------------------------------------------------------------------------ 657# GMP::Mpz::fdiv 658 659{ my ($q, $r); 660 ($q, $r) = fdiv (16, 3); 661 ok ($q == 5); 662 ok ($r == 1); 663 ($q, $r) = fdiv (16, -3); 664 ok ($q == -6); 665 ok ($r == -2); 666 ($q, $r) = fdiv (-16, 3); 667 ok ($q == -6); 668 ok ($r == 2); 669 ($q, $r) = fdiv (-16, -3); 670 ok ($q == 5); 671 ok ($r == -1); 672} 673 674#------------------------------------------------------------------------------ 675# GMP::Mpz::fdiv_2exp 676 677{ my ($q, $r); 678 ($q, $r) = fdiv_2exp (23, 2); 679 ok ($q == 5); 680 ok ($r == 3); 681 ($q, $r) = fdiv_2exp (-23, 2); 682 ok ($q == -6); 683 ok ($r == 1); 684} 685 686#------------------------------------------------------------------------------ 687# GMP::Mpz::fib 688 689ok (fib(0) == 0); 690ok (fib(1) == 1); 691ok (fib(2) == 1); 692ok (fib(3) == 2); 693ok (fib(4) == 3); 694ok (fib(5) == 5); 695ok (fib(6) == 8); 696 697#------------------------------------------------------------------------------ 698# GMP::Mpz::fib2 699 700{ my ($a, $b) = fib2(0); ok($a==0); ok($b==1); } 701{ my ($a, $b) = fib2(1); ok($a==1); ok($b==0); } 702{ my ($a, $b) = fib2(2); ok($a==1); ok($b==1); } 703{ my ($a, $b) = fib2(3); ok($a==2); ok($b==1); } 704{ my ($a, $b) = fib2(4); ok($a==3); ok($b==2); } 705{ my ($a, $b) = fib2(5); ok($a==5); ok($b==3); } 706{ my ($a, $b) = fib2(6); ok($a==8); ok($b==5); } 707 708#------------------------------------------------------------------------------ 709# GMP::Mpz::gcd 710 711ok (gcd (21) == 21); 712ok (gcd (21,15) == 3); 713ok (gcd (21,15,30,57) == 3); 714ok (gcd (21,-15) == 3); 715ok (gcd (-21,15) == 3); 716ok (gcd (-21,-15) == 3); 717 718#------------------------------------------------------------------------------ 719# GMP::Mpz::gcdext 720 721{ 722 my ($g, $x, $y) = gcdext (3,5); 723 ok ($g == 1); 724 ok ($x == 2); 725 ok ($y == -1); 726} 727 728#------------------------------------------------------------------------------ 729# GMP::Mpz::hamdist 730 731ok (hamdist(5,7) == 1); 732 733#------------------------------------------------------------------------------ 734# GMP::Mpz::import 735 736{ my $z = mpz_import (1, 2, 1, 0, 'abcd'); 737 ok ($z == 0x61626364); } 738{ my $z = mpz_import (-1, 2, 1, 0, 'abcd'); 739 ok ($z == 0x63646162); } 740{ my $z = mpz_import (1, 2, -1, 0, 'abcd'); 741 ok ($z == 0x62616463); } 742{ my $z = mpz_import (-1, 2, -1, 0, 'abcd'); 743 ok ($z == 0x64636261); } 744 745#------------------------------------------------------------------------------ 746# GMP::Mpz::invert 747 748ok (invert(1,123) == 1); 749ok (invert(6,7) == 6); 750ok (! defined invert(2,8)); 751 752#------------------------------------------------------------------------------ 753# GMP::Mpz::jacobi, GMP::Mpz::kronecker 754 755foreach my $i ([ 1, 19, 1 ], 756 [ 4, 19, 1 ], 757 [ 5, 19, 1 ], 758 [ 6, 19, 1 ], 759 [ 7, 19, 1 ], 760 [ 9, 19, 1 ], 761 [ 11, 19, 1 ], 762 [ 16, 19, 1 ], 763 [ 17, 19, 1 ], 764 [ 2, 19, -1 ], 765 [ 3, 19, -1 ], 766 [ 8, 19, -1 ], 767 [ 10, 19, -1 ], 768 [ 12, 19, -1 ], 769 [ 13, 19, -1 ], 770 [ 14, 19, -1 ], 771 [ 15, 19, -1 ], 772 [ 18, 19, -1 ]) { 773 foreach my $fun (\&jacobi, \&kronecker) { 774 ok (&$fun ($$i[0], $$i[1]) == $$i[2]); 775 776 ok (&$fun ($$i[0], str($$i[1])) == $$i[2]); 777 ok (&$fun (str($$i[0]), $$i[1]) == $$i[2]); 778 ok (&$fun (str($$i[0]), str($$i[1])) == $$i[2]); 779 780 ok (&$fun ($$i[0], mpz($$i[1])) == $$i[2]); 781 ok (&$fun (mpz($$i[0]), $$i[1]) == $$i[2]); 782 ok (&$fun (mpz($$i[0]), mpz($$i[1])) == $$i[2]); 783 } 784} 785 786#------------------------------------------------------------------------------ 787# GMP::Mpz::lcm 788 789ok (lcm (2) == 2); 790ok (lcm (0) == 0); 791ok (lcm (0,0) == 0); 792ok (lcm (0,0,0) == 0); 793ok (lcm (0,0,0,0) == 0); 794ok (lcm (2,0) == 0); 795ok (lcm (-2,0) == 0); 796ok (lcm (2,3) == 6); 797ok (lcm (2,3,4) == 12); 798ok (lcm (2,-3) == 6); 799ok (lcm (-2,3) == 6); 800ok (lcm (-2,-3) == 6); 801ok (lcm (mpz(2)**512,1) == mpz(2)**512); 802ok (lcm (mpz(2)**512,-1) == mpz(2)**512); 803ok (lcm (-mpz(2)**512,1) == mpz(2)**512); 804ok (lcm (-mpz(2)**512,-1) == mpz(2)**512); 805ok (lcm (mpz(2)**512,mpz(2)**512) == mpz(2)**512); 806ok (lcm (mpz(2)**512,-mpz(2)**512) == mpz(2)**512); 807ok (lcm (-mpz(2)**512,mpz(2)**512) == mpz(2)**512); 808ok (lcm (-mpz(2)**512,-mpz(2)**512) == mpz(2)**512); 809 810#------------------------------------------------------------------------------ 811# GMP::Mpz::lucnum 812 813ok (lucnum(0) == 2); 814ok (lucnum(1) == 1); 815ok (lucnum(2) == 3); 816ok (lucnum(3) == 4); 817ok (lucnum(4) == 7); 818ok (lucnum(5) == 11); 819ok (lucnum(6) == 18); 820 821#------------------------------------------------------------------------------ 822# GMP::Mpz::lucnum2 823 824{ my ($a, $b) = lucnum2(0); ok($a==2); ok($b==-1); } 825{ my ($a, $b) = lucnum2(1); ok($a==1); ok($b==2); } 826{ my ($a, $b) = lucnum2(2); ok($a==3); ok($b==1); } 827{ my ($a, $b) = lucnum2(3); ok($a==4); ok($b==3); } 828{ my ($a, $b) = lucnum2(4); ok($a==7); ok($b==4); } 829{ my ($a, $b) = lucnum2(5); ok($a==11); ok($b==7); } 830{ my ($a, $b) = lucnum2(6); ok($a==18); ok($b==11); } 831 832#------------------------------------------------------------------------------ 833# GMP::Mpz::nextprime 834 835ok (nextprime(2) == 3); 836ok (nextprime(3) == 5); 837ok (nextprime(5) == 7); 838ok (nextprime(7) == 11); 839ok (nextprime(11) == 13); 840 841#------------------------------------------------------------------------------ 842# GMP::Mpz::perfect_power_p 843 844# ok ( perfect_power_p(mpz(-27))); 845# ok (! perfect_power_p(mpz(-9))); 846# ok (! perfect_power_p(mpz(-1))); 847ok ( perfect_power_p(mpz(0))); 848ok ( perfect_power_p(mpz(1))); 849ok (! perfect_power_p(mpz(2))); 850ok (! perfect_power_p(mpz(3))); 851ok ( perfect_power_p(mpz(4))); 852ok ( perfect_power_p(mpz(9))); 853ok ( perfect_power_p(mpz(27))); 854ok ( perfect_power_p(mpz(81))); 855 856#------------------------------------------------------------------------------ 857# GMP::Mpz::perfect_square_p 858 859ok (! perfect_square_p(mpz(-9))); 860ok (! perfect_square_p(mpz(-1))); 861ok ( perfect_square_p(mpz(0))); 862ok ( perfect_square_p(mpz(1))); 863ok (! perfect_square_p(mpz(2))); 864ok (! perfect_square_p(mpz(3))); 865ok ( perfect_square_p(mpz(4))); 866ok ( perfect_square_p(mpz(9))); 867ok (! perfect_square_p(mpz(27))); 868ok ( perfect_square_p(mpz(81))); 869 870#------------------------------------------------------------------------------ 871# GMP::Mpz::popcount 872 873ok (popcount(7) == 3); 874 875#------------------------------------------------------------------------------ 876# GMP::Mpz::powm 877 878ok (powm (3,2,8) == 1); 879 880#------------------------------------------------------------------------------ 881# GMP::Mpz::probab_prime_p 882 883ok ( probab_prime_p(89,1)); 884ok (! probab_prime_p(81,1)); 885 886#------------------------------------------------------------------------------ 887# GMP::Mpz::realloc 888 889{ my $z = mpz(123); 890 realloc ($z, 512); } 891 892#------------------------------------------------------------------------------ 893# GMP::Mpz::remove 894 895{ 896 my ($rem, $mult); 897 ($rem, $mult) = remove(12,3); 898 ok ($rem == 4); 899 ok ($mult == 1); 900 ($rem, $mult) = remove(12,2); 901 ok ($rem == 3); 902 ok ($mult == 2); 903} 904 905#------------------------------------------------------------------------------ 906# GMP::Mpz::root 907 908ok (root(0,2) == 0); 909ok (root(8,3) == 2); 910ok (root(-8,3) == -2); 911ok (root(81,4) == 3); 912ok (root(243,5) == 3); 913 914#------------------------------------------------------------------------------ 915# GMP::Mpz::roote 916 917{ my ($r,$e); 918 ($r, $e) = roote(0,2); 919 ok ($r == 0); 920 ok ($e); 921 ($r, $e) = roote(81,4); 922 ok ($r == 3); 923 ok ($e); 924 ($r, $e) = roote(85,4); 925 ok ($r == 3); 926 ok (! $e); 927} 928 929#------------------------------------------------------------------------------ 930# GMP::Mpz::rootrem 931 932{ my ($root, $rem) = rootrem (mpz(0), 1); 933 ok ($root == 0); ok ($rem == 0); } 934{ my ($root, $rem) = rootrem (mpz(0), 2); 935 ok ($root == 0); ok ($rem == 0); } 936{ my ($root, $rem) = rootrem (mpz(64), 2); 937 ok ($root == 8); ok ($rem == 0); } 938{ my ($root, $rem) = rootrem (mpz(64), 3); 939 ok ($root == 4); ok ($rem == 0); } 940{ my ($root, $rem) = rootrem (mpz(65), 3); 941 ok ($root == 4); ok ($rem == 1); } 942 943#------------------------------------------------------------------------------ 944# GMP::Mpz::scan0 945 946ok (scan0 (0, 0) == 0); 947ok (scan0 (1, 0) == 1); 948ok (scan0 (3, 0) == 2); 949ok (scan0 (-1, 0) == ~0); 950ok (scan0 (-2, 1) == ~0); 951 952#------------------------------------------------------------------------------ 953# GMP::Mpz::scan1 954 955ok (scan1 (1, 0) == 0); 956ok (scan1 (2, 0) == 1); 957ok (scan1 (4, 0) == 2); 958ok (scan1 (0, 0) == ~0); 959ok (scan1 (3, 2) == ~0); 960 961#------------------------------------------------------------------------------ 962# GMP::Mpz::setbit 963 964{ my $a = mpz(3); setbit ($a, 1); ok ($a == 3); } 965{ my $a = mpz(3); setbit ($a, 2); ok ($a == 7); } 966 967{ my $a = 3; setbit ($a, 1); ok ($a == 3); } 968{ my $a = 3; setbit ($a, 2); ok ($a == 7); } 969 970# mutate only given variable 971{ my $a = mpz(0); 972 my $b = $a; 973 setbit ($a, 0); 974 ok ($a == 1); 975 ok ($b == 0); 976} 977{ my $a = 0; 978 my $b = $a; 979 setbit ($a, 0); 980 ok ($a == 1); 981 ok ($b == 0); 982} 983 984{ tie my $a, 'Mytie', mpz(3); 985 setbit ($a, 2); 986 ok ($Mytie::fetched > 0); # used fetch 987 ok ($Mytie::stored > 0); # used store 988 ok ($a == 7); # expected result 989 ok (UNIVERSAL::isa($a,"GMP::Mpz")); 990 ok (tied($a)); # still tied 991} 992{ tie my $a, 'Mytie', 3; 993 setbit ($a, 2); 994 ok ($Mytie::fetched > 0); # used fetch 995 ok ($Mytie::stored > 0); # used store 996 ok ($a == 7); # expected result 997 ok (UNIVERSAL::isa($a,"GMP::Mpz")); 998 ok (tied($a)); # still tied 999} 1000 1001{ my $b = mpz(2); 1002 tie my $a, 'Mytie', $b; 1003 setbit ($a, 0); 1004 ok ($a == 3); 1005 ok ($b == 2); 1006 ok (tied($a)); 1007} 1008{ my $b = 2; 1009 tie my $a, 'Mytie', $b; 1010 setbit ($a, 0); 1011 ok ($a == 3); 1012 ok ($b == 2); 1013 ok (tied($a)); 1014} 1015 1016#------------------------------------------------------------------------------ 1017# GMP::Mpz::sizeinbase 1018 1019ok (sizeinbase(1,10) == 1); 1020ok (sizeinbase(100,10) == 3); 1021ok (sizeinbase(9999,10) == 5); 1022 1023#------------------------------------------------------------------------------ 1024# GMP::Mpz::sqrtrem 1025 1026{ 1027 my ($root, $rem) = sqrtrem(mpz(0)); 1028 ok ($root == 0); 1029 ok ($rem == 0); 1030} 1031{ 1032 my ($root, $rem) = sqrtrem(mpz(1)); 1033 ok ($root == 1); 1034 ok ($rem == 0); 1035} 1036{ 1037 my ($root, $rem) = sqrtrem(mpz(2)); 1038 ok ($root == 1); 1039 ok ($rem == 1); 1040} 1041{ 1042 my ($root, $rem) = sqrtrem(mpz(9)); 1043 ok ($root == 3); 1044 ok ($rem == 0); 1045} 1046{ 1047 my ($root, $rem) = sqrtrem(mpz(35)); 1048 ok ($root == 5); 1049 ok ($rem == 10); 1050} 1051{ 1052 my ($root, $rem) = sqrtrem(mpz(0)); 1053 ok ($root == 0); 1054 ok ($rem == 0); 1055} 1056 1057#------------------------------------------------------------------------------ 1058# GMP::Mpz::tdiv 1059 1060{ my ($q, $r); 1061 ($q, $r) = tdiv (16, 3); 1062 ok ($q == 5); 1063 ok ($r == 1); 1064 ($q, $r) = tdiv (16, -3); 1065 ok ($q == -5); 1066 ok ($r == 1); 1067 ($q, $r) = tdiv (-16, 3); 1068 ok ($q == -5); 1069 ok ($r == -1); 1070 ($q, $r) = tdiv (-16, -3); 1071 ok ($q == 5); 1072 ok ($r == -1); 1073} 1074 1075#------------------------------------------------------------------------------ 1076# GMP::Mpz::tdiv_2exp 1077 1078{ my ($q, $r); 1079 ($q, $r) = tdiv_2exp (23, 2); 1080 ok ($q == 5); 1081 ok ($r == 3); 1082 ($q, $r) = tdiv_2exp (-23, 2); 1083 ok ($q == -5); 1084 ok ($r == -3); 1085} 1086 1087#------------------------------------------------------------------------------ 1088# GMP::Mpz::tstbit 1089 1090ok (tstbit (6, 0) == 0); 1091ok (tstbit (6, 1) == 1); 1092ok (tstbit (6, 2) == 1); 1093ok (tstbit (6, 3) == 0); 1094 1095 1096 1097 1098#------------------------------------------------------------------------------ 1099# GMP::Mpq 1100 1101#------------------------------------------------------------------------------ 1102# GMP::Mpq::new 1103 1104ok (mpq(0) == 0); 1105ok (mpq('0') == 0); 1106ok (mpq(substr('101',1,1)) == 0); 1107ok (mpq(0.0) == 0); 1108ok (mpq(mpz(0)) == 0); 1109ok (mpq(mpq(0)) == 0); 1110ok (mpq(mpf(0)) == 0); 1111 1112{ tie my $t, 'Mytie', 0; ok (mpq($t) == 0); } 1113{ tie my $t, 'Mytie', '0'; ok (mpq($t) == 0); } 1114{ tie my $t, 'Mytie', substr('101',1,1); ok (mpq($t) == 0); } 1115{ tie my $t, 'Mytie', 0.0; ok (mpq($t) == 0); } 1116{ tie my $t, 'Mytie', mpz(0); ok (mpq($t) == 0); } 1117{ tie my $t, 'Mytie', mpq(0); ok (mpq($t) == 0); } 1118{ tie my $t, 'Mytie', mpf(0); ok (mpq($t) == 0); } 1119 1120ok (mpq(-123) == -123); 1121ok (mpq('-123') == -123); 1122ok (mpq(substr('1-1231',1,4)) == -123); 1123ok (mpq(-123.0) == -123); 1124ok (mpq(mpz(-123)) == -123); 1125ok (mpq(mpq(-123)) == -123); 1126ok (mpq(mpf(-123)) == -123); 1127 1128{ tie my $t, 'Mytie', -123; ok (mpq($t) == -123); } 1129{ tie my $t, 'Mytie', '-123'; ok (mpq($t) == -123); } 1130{ tie my $t, 'Mytie', substr('1-1231',1,4); ok (mpq($t) == -123); } 1131{ tie my $t, 'Mytie', -123.0; ok (mpq($t) == -123); } 1132{ tie my $t, 'Mytie', mpz(-123); ok (mpq($t) == -123); } 1133{ tie my $t, 'Mytie', mpq(-123); ok (mpq($t) == -123); } 1134{ tie my $t, 'Mytie', mpf(-123); ok (mpq($t) == -123); } 1135 1136ok (mpq($ivnv_2p128) == $str_2p128); 1137{ tie my $t, 'Mytie', $ivnv_2p128; ok (mpq($t) == $str_2p128); } 1138 1139ok (mpq('3/2') == mpq(3,2)); 1140ok (mpq('3/1') == mpq(3,1)); 1141ok (mpq('-3/2') == mpq(-3,2)); 1142ok (mpq('-3/1') == mpq(-3,1)); 1143ok (mpq('0x3') == mpq(3,1)); 1144ok (mpq('0b111') == mpq(7,1)); 1145ok (mpq('0b0') == mpq(0,1)); 1146 1147ok (mpq($uv_max) > 0); 1148ok (mpq($uv_max) == mpq($uv_max_str)); 1149{ tie my $t, 'Mytie', $uv_max; ok (mpq($t) > 0); } 1150{ tie my $t, 'Mytie', $uv_max; ok (mpq($t) == mpq($uv_max_str)); } 1151 1152{ my $x = 123.5; 1153 kill (0, $x); 1154 ok (mpq($x) == 123.5); 1155 tie my $t, 'Mytie', $x; 1156 ok (mpq($t) == 123.5); 1157} 1158 1159#------------------------------------------------------------------------------ 1160# GMP::Mpq::overload_abs 1161 1162ok (abs(mpq(0)) == 0); 1163ok (abs(mpq(123)) == 123); 1164ok (abs(mpq(-123)) == 123); 1165 1166{ my $x = mpq(-123); $x = abs($x); ok ($x == 123); } 1167{ my $x = mpq(0); $x = abs($x); ok ($x == 0); } 1168{ my $x = mpq(123); $x = abs($x); ok ($x == 123); } 1169 1170{ tie my $t, 'Mytie', mpq(0); ok (abs($t) == 0); } 1171{ tie my $t, 'Mytie', mpq(123); ok (abs($t) == 123); } 1172{ tie my $t, 'Mytie', mpq(-123); ok (abs($t) == 123); } 1173 1174#------------------------------------------------------------------------------ 1175# GMP::Mpq::overload_add 1176 1177ok (mpq(0) + 1 == 1); 1178ok (mpq(-1) + 1 == 0); 1179ok (1 + mpq(0) == 1); 1180ok (1 + mpq(-1) == 0); 1181 1182ok (mpq(1,2)+mpq(1,3) == mpq(5,6)); 1183ok (mpq(1,2)+mpq(-1,3) == mpq(1,6)); 1184ok (mpq(-1,2)+mpq(1,3) == mpq(-1,6)); 1185ok (mpq(-1,2)+mpq(-1,3) == mpq(-5,6)); 1186 1187#------------------------------------------------------------------------------ 1188# GMP::Mpq::overload_addeq 1189 1190{ my $a = mpq(7); $a += 1; ok ($a == 8); } 1191{ my $a = mpq(7); my $b = $a; $a += 1; ok ($a == 8); ok ($b == 7); } 1192 1193#------------------------------------------------------------------------------ 1194# GMP::Mpq::overload_bool 1195 1196if (mpq(0)) { ok (0); } else { ok (1); } 1197if (mpq(123)) { ok (1); } else { ok (0); } 1198 1199#------------------------------------------------------------------------------ 1200# GMP::Mpq::overload_dec 1201 1202{ my $a = mpq(0); ok ($a-- == 0); ok ($a == -1); } 1203{ my $a = mpq(0); ok (--$a == -1); } 1204 1205{ my $a = mpq(0); my $b = $a; $a--; ok ($a == -1); ok ($b == 0); } 1206 1207#------------------------------------------------------------------------------ 1208# GMP::Mpq::overload_div 1209 1210ok (mpq(6) / 2 == 3); 1211ok (mpq(-6) / 2 == -3); 1212ok (mpq(6) / -2 == -3); 1213ok (mpq(-6) / -2 == 3); 1214 1215#------------------------------------------------------------------------------ 1216# GMP::Mpq::overload_diveq 1217 1218{ my $a = mpq(21); $a /= 3; ok ($a == 7); } 1219{ my $a = mpq(21); my $b = $a; $a /= 3; ok ($a == 7); ok ($b == 21); } 1220 1221#------------------------------------------------------------------------------ 1222# GMP::Mpq::overload_eq 1223 1224{ my $a = mpq(0); 1225 my $b = $a; 1226 $a = mpq(1); 1227 ok ($a == 1); 1228 ok ($b == 0); } 1229 1230#------------------------------------------------------------------------------ 1231# GMP::Mpq::overload_inc 1232 1233{ my $a = mpq(0); ok ($a++ == 0); ok ($a == 1); } 1234{ my $a = mpq(0); ok (++$a == 1); } 1235 1236{ my $a = mpq(0); my $b = $a; $a++; ok ($a == 1); ok ($b == 0); } 1237 1238#------------------------------------------------------------------------------ 1239# GMP::Mpq::overload_lshift 1240 1241{ my $a = mpq(7) << 1; ok ($a == 14); } 1242 1243#------------------------------------------------------------------------------ 1244# GMP::Mpq::overload_lshifteq 1245 1246{ my $a = mpq(7); $a <<= 1; ok ($a == 14); } 1247{ my $a = mpq(7); my $b = $a; $a <<= 1; ok ($a == 14); ok ($b == 7); } 1248 1249#------------------------------------------------------------------------------ 1250# GMP::Mpq::overload_mul 1251 1252ok (mpq(2) * 3 == 6); 1253 1254#------------------------------------------------------------------------------ 1255# GMP::Mpq::overload_muleq 1256 1257{ my $a = mpq(7); $a *= 3; ok ($a == 21); } 1258{ my $a = mpq(7); my $b = $a; $a *= 3; ok ($a == 21); ok ($b == 7); } 1259 1260#------------------------------------------------------------------------------ 1261# GMP::Mpq::overload_neg 1262 1263ok (- mpq(0) == 0); 1264ok (- mpq(123) == -123); 1265ok (- mpq(-123) == 123); 1266 1267#------------------------------------------------------------------------------ 1268# GMP::Mpq::overload_not 1269 1270if (not mpq(0)) { ok (1); } else { ok (0); } 1271if (not mpq(123)) { ok (0); } else { ok (1); } 1272 1273ok ((! mpq(0)) == 1); 1274ok ((! mpq(123)) == 0); 1275 1276#------------------------------------------------------------------------------ 1277# GMP::Mpq::overload_pow 1278 1279ok (mpq(0) ** 1 == 0); 1280ok (mpq(1) ** 1 == 1); 1281ok (mpq(2) ** 0 == 1); 1282ok (mpq(2) ** 1 == 2); 1283ok (mpq(2) ** 2 == 4); 1284ok (mpq(2) ** 3 == 8); 1285ok (mpq(2) ** 4 == 16); 1286 1287ok (mpq(0) ** mpq(1) == 0); 1288ok (mpq(1) ** mpq(1) == 1); 1289ok (mpq(2) ** mpq(0) == 1); 1290ok (mpq(2) ** mpq(1) == 2); 1291ok (mpq(2) ** mpq(2) == 4); 1292ok (mpq(2) ** mpq(3) == 8); 1293ok (mpq(2) ** mpq(4) == 16); 1294 1295#------------------------------------------------------------------------------ 1296# GMP::Mpq::overload_poweq 1297 1298{ my $a = mpq(3); $a **= 4; ok ($a == 81); } 1299{ my $a = mpq(3); my $b = $a; $a **= 4; ok ($a == 81); ok ($b == 3); } 1300 1301#------------------------------------------------------------------------------ 1302# GMP::Mpq::overload_rshift 1303 1304{ my $a = mpq(32) >> 1; ok ($a == 16); } 1305 1306#------------------------------------------------------------------------------ 1307# GMP::Mpq::overload_rshifteq 1308 1309{ my $a = mpq(32); $a >>= 1; ok ($a == 16); } 1310{ my $a = mpq(32); my $b = $a; $a >>= 1; ok ($a == 16); ok ($b == 32); } 1311 1312#------------------------------------------------------------------------------ 1313# GMP::Mpq::overload_spaceship 1314 1315ok (mpq(0) < 1); 1316ok (mpq(0) > -1); 1317 1318ok (mpq(0) != 1); 1319ok (mpq(0) != -1); 1320ok (mpq(1) != 0); 1321ok (mpq(1) != -1); 1322ok (mpq(-1) != 0); 1323ok (mpq(-1) != 1); 1324 1325ok (mpq(3,2) > 1); 1326ok (mpq(3,2) < 2); 1327 1328ok (mpq(0) < 1.0); 1329ok (mpq(0) < '1'); 1330ok (mpq(0) < substr('-1',1,1)); 1331ok (mpq(0) < mpz(1)); 1332ok (mpq(0) < mpq(1)); 1333ok (mpq(0) < mpf(1)); 1334ok (mpq(0) < $uv_max); 1335 1336#------------------------------------------------------------------------------ 1337# GMP::Mpq::overload_string 1338 1339{ my $x = mpq(0); ok("$x" eq "0"); } 1340{ my $x = mpq(123); ok("$x" eq "123"); } 1341{ my $x = mpq(-123); ok("$x" eq "-123"); } 1342 1343{ my $q = mpq(5,7); ok("$q" eq "5/7"); } 1344{ my $q = mpq(-5,7); ok("$q" eq "-5/7"); } 1345 1346#------------------------------------------------------------------------------ 1347# GMP::Mpq::overload_sub 1348 1349ok (mpq(0) - 1 == -1); 1350ok (mpq(1) - 1 == 0); 1351ok (1 - mpq(0) == 1); 1352ok (1 - mpq(1) == 0); 1353 1354ok (mpq(1,2)-mpq(1,3) == mpq(1,6)); 1355ok (mpq(1,2)-mpq(-1,3) == mpq(5,6)); 1356ok (mpq(-1,2)-mpq(1,3) == mpq(-5,6)); 1357ok (mpq(-1,2)-mpq(-1,3) == mpq(-1,6)); 1358 1359#------------------------------------------------------------------------------ 1360# GMP::Mpq::overload_subeq 1361 1362{ my $a = mpq(7); $a -= 1; ok ($a == 6); } 1363{ my $a = mpq(7); my $b = $a; $a -= 1; ok ($a == 6); ok ($b == 7); } 1364 1365#------------------------------------------------------------------------------ 1366# GMP::Mpq::canonicalize 1367 1368{ my $q = mpq(21,15); canonicalize($q); 1369 ok (num($q) == 7); 1370 ok (den($q) == 5); 1371} 1372 1373#------------------------------------------------------------------------------ 1374# GMP::Mpq::den 1375 1376{ my $q = mpq(5,9); ok (den($q) == 9); } 1377 1378#------------------------------------------------------------------------------ 1379# GMP::Mpq::num 1380 1381{ my $q = mpq(5,9); ok (num($q) == 5); } 1382 1383 1384 1385 1386#------------------------------------------------------------------------------ 1387# GMP::Mpf 1388 1389#------------------------------------------------------------------------------ 1390# GMP::Mpf::new 1391 1392ok (mpf(0) == 0); 1393ok (mpf('0') == 0); 1394ok (mpf(substr('101',1,1)) == 0); 1395ok (mpf(0.0) == 0); 1396ok (mpf(mpz(0)) == 0); 1397ok (mpf(mpq(0)) == 0); 1398ok (mpf(mpf(0)) == 0); 1399 1400{ tie my $t, 'Mytie', 0; ok (mpf($t) == 0); } 1401{ tie my $t, 'Mytie', '0'; ok (mpf($t) == 0); } 1402{ tie my $t, 'Mytie', substr('101',1,1); ok (mpf($t) == 0); } 1403{ tie my $t, 'Mytie', 0.0; ok (mpf($t) == 0); } 1404{ tie my $t, 'Mytie', mpz(0); ok (mpf($t) == 0); } 1405{ tie my $t, 'Mytie', mpq(0); ok (mpf($t) == 0); } 1406{ tie my $t, 'Mytie', mpf(0); ok (mpf($t) == 0); } 1407 1408ok (mpf(-123) == -123); 1409ok (mpf('-123') == -123); 1410ok (mpf(substr('1-1231',1,4)) == -123); 1411ok (mpf(-123.0) == -123); 1412ok (mpf(mpz(-123)) == -123); 1413ok (mpf(mpq(-123)) == -123); 1414ok (mpf(mpf(-123)) == -123); 1415 1416{ tie my $t, 'Mytie', -123; ok (mpf($t) == -123); } 1417{ tie my $t, 'Mytie', '-123'; ok (mpf($t) == -123); } 1418{ tie my $t, 'Mytie', substr('1-1231',1,4); ok (mpf($t) == -123); } 1419{ tie my $t, 'Mytie', -123.0; ok (mpf($t) == -123); } 1420{ tie my $t, 'Mytie', mpz(-123); ok (mpf($t) == -123); } 1421{ tie my $t, 'Mytie', mpq(-123); ok (mpf($t) == -123); } 1422{ tie my $t, 'Mytie', mpf(-123); ok (mpf($t) == -123); } 1423 1424ok (mpf($ivnv_2p128) == $str_2p128); 1425{ tie my $t, 'Mytie', $ivnv_2p128; ok (mpf($t) == $str_2p128); } 1426 1427ok (mpf(-1.5) == -1.5); 1428ok (mpf(-1.0) == -1.0); 1429ok (mpf(-0.5) == -0.5); 1430ok (mpf(0) == 0); 1431ok (mpf(0.5) == 0.5); 1432ok (mpf(1.0) == 1.0); 1433ok (mpf(1.5) == 1.5); 1434 1435ok (mpf("-1.5") == -1.5); 1436ok (mpf("-1.0") == -1.0); 1437ok (mpf("-0.5") == -0.5); 1438ok (mpf("0") == 0); 1439ok (mpf("0.5") == 0.5); 1440ok (mpf("1.0") == 1.0); 1441ok (mpf("1.5") == 1.5); 1442 1443ok (mpf($uv_max) > 0); 1444ok (mpf($uv_max) == mpf($uv_max_str)); 1445{ tie my $t, 'Mytie', $uv_max; ok (mpf($t) > 0); } 1446{ tie my $t, 'Mytie', $uv_max; ok (mpf($t) == mpf($uv_max_str)); } 1447 1448{ my $x = 123.5; 1449 kill (0, $x); 1450 ok (mpf($x) == 123.5); 1451 tie my $t, 'Mytie', $x; 1452 ok (mpf($t) == 123.5); 1453} 1454 1455#------------------------------------------------------------------------------ 1456# GMP::Mpf::overload_abs 1457 1458ok (abs(mpf(0)) == 0); 1459ok (abs(mpf(123)) == 123); 1460ok (abs(mpf(-123)) == 123); 1461 1462{ my $x = mpf(-123); $x = abs($x); ok ($x == 123); } 1463{ my $x = mpf(0); $x = abs($x); ok ($x == 0); } 1464{ my $x = mpf(123); $x = abs($x); ok ($x == 123); } 1465 1466{ tie my $t, 'Mytie', mpf(0); ok (abs($t) == 0); } 1467{ tie my $t, 'Mytie', mpf(123); ok (abs($t) == 123); } 1468{ tie my $t, 'Mytie', mpf(-123); ok (abs($t) == 123); } 1469 1470#------------------------------------------------------------------------------ 1471# GMP::Mpf::overload_add 1472 1473ok (mpf(0) + 1 == 1); 1474ok (mpf(-1) + 1 == 0); 1475ok (1 + mpf(0) == 1); 1476ok (1 + mpf(-1) == 0); 1477 1478#------------------------------------------------------------------------------ 1479# GMP::Mpf::overload_addeq 1480 1481{ my $a = mpf(7); $a += 1; ok ($a == 8); } 1482{ my $a = mpf(7); my $b = $a; $a += 1; ok ($a == 8); ok ($b == 7); } 1483 1484#------------------------------------------------------------------------------ 1485# GMP::Mpf::overload_bool 1486 1487if (mpf(0)) { ok (0); } else { ok (1); } 1488if (mpf(123)) { ok (1); } else { ok (0); } 1489 1490#------------------------------------------------------------------------------ 1491# GMP::Mpf::overload_dec 1492 1493{ my $a = mpf(0); ok ($a-- == 0); ok ($a == -1); } 1494{ my $a = mpf(0); ok (--$a == -1); } 1495 1496{ my $a = mpf(0); my $b = $a; $a--; ok ($a == -1); ok ($b == 0); } 1497 1498#------------------------------------------------------------------------------ 1499# GMP::Mpf::overload_div 1500 1501ok (mpf(6) / 2 == 3); 1502ok (mpf(-6) / 2 == -3); 1503ok (mpf(6) / -2 == -3); 1504ok (mpf(-6) / -2 == 3); 1505 1506#------------------------------------------------------------------------------ 1507# GMP::Mpf::overload_diveq 1508 1509{ my $a = mpf(21); $a /= 3; ok ($a == 7); } 1510{ my $a = mpf(21); my $b = $a; $a /= 3; ok ($a == 7); ok ($b == 21); } 1511 1512#------------------------------------------------------------------------------ 1513# GMP::Mpf::overload_eq 1514 1515{ my $a = mpf(0); 1516 my $b = $a; 1517 $a = mpf(1); 1518 ok ($a == 1); 1519 ok ($b == 0); } 1520 1521#------------------------------------------------------------------------------ 1522# GMP::Mpf::overload_inc 1523 1524{ my $a = mpf(0); ok ($a++ == 0); ok ($a == 1); } 1525{ my $a = mpf(0); ok (++$a == 1); } 1526 1527{ my $a = mpf(0); my $b = $a; $a++; ok ($a == 1); ok ($b == 0); } 1528 1529#------------------------------------------------------------------------------ 1530# GMP::Mpf::overload_lshift 1531 1532{ my $a = mpf(7) << 1; ok ($a == 14); } 1533 1534#------------------------------------------------------------------------------ 1535# GMP::Mpf::overload_lshifteq 1536 1537{ my $a = mpf(7); $a <<= 1; ok ($a == 14); } 1538{ my $a = mpf(7); my $b = $a; $a <<= 1; ok ($a == 14); ok ($b == 7); } 1539 1540#------------------------------------------------------------------------------ 1541# GMP::Mpf::overload_mul 1542 1543ok (mpf(2) * 3 == 6); 1544 1545#------------------------------------------------------------------------------ 1546# GMP::Mpf::overload_muleq 1547 1548{ my $a = mpf(7); $a *= 3; ok ($a == 21); } 1549{ my $a = mpf(7); my $b = $a; $a *= 3; ok ($a == 21); ok ($b == 7); } 1550 1551#------------------------------------------------------------------------------ 1552# GMP::Mpf::overload_neg 1553 1554ok (- mpf(0) == 0); 1555ok (- mpf(123) == -123); 1556ok (- mpf(-123) == 123); 1557 1558#------------------------------------------------------------------------------ 1559# GMP::Mpf::overload_not 1560 1561if (not mpf(0)) { ok (1); } else { ok (0); } 1562if (not mpf(123)) { ok (0); } else { ok (1); } 1563 1564ok ((! mpf(0)) == 1); 1565ok ((! mpf(123)) == 0); 1566 1567#------------------------------------------------------------------------------ 1568# GMP::Mpf::overload_pow 1569 1570ok (mpf(0) ** 1 == 0); 1571ok (mpf(1) ** 1 == 1); 1572ok (mpf(2) ** 0 == 1); 1573ok (mpf(2) ** 1 == 2); 1574ok (mpf(2) ** 2 == 4); 1575ok (mpf(2) ** 3 == 8); 1576ok (mpf(2) ** 4 == 16); 1577 1578ok (mpf(0) ** mpf(1) == 0); 1579ok (mpf(1) ** mpf(1) == 1); 1580ok (mpf(2) ** mpf(0) == 1); 1581ok (mpf(2) ** mpf(1) == 2); 1582ok (mpf(2) ** mpf(2) == 4); 1583ok (mpf(2) ** mpf(3) == 8); 1584ok (mpf(2) ** mpf(4) == 16); 1585 1586#------------------------------------------------------------------------------ 1587# GMP::Mpf::overload_poweq 1588 1589{ my $a = mpf(3); $a **= 4; ok ($a == 81); } 1590{ my $a = mpf(3); my $b = $a; $a **= 4; ok ($a == 81); ok ($b == 3); } 1591 1592#------------------------------------------------------------------------------ 1593# GMP::Mpf::overload_rshift 1594 1595{ my $a = mpf(32) >> 1; ok ($a == 16); } 1596 1597#------------------------------------------------------------------------------ 1598# GMP::Mpf::overload_rshifteq 1599 1600{ my $a = mpf(32); $a >>= 1; ok ($a == 16); } 1601{ my $a = mpf(32); my $b = $a; $a >>= 1; ok ($a == 16); ok ($b == 32); } 1602 1603#------------------------------------------------------------------------------ 1604# GMP::Mpf::overload_sqrt 1605 1606ok (sqrt(mpf(0)) == 0); 1607ok (sqrt(mpf(1)) == 1); 1608ok (sqrt(mpf(4)) == 2); 1609ok (sqrt(mpf(81)) == 9); 1610 1611ok (sqrt(mpf(0.25)) == 0.5); 1612 1613#------------------------------------------------------------------------------ 1614# GMP::Mpf::overload_spaceship 1615 1616ok (mpf(0) < 1); 1617ok (mpf(0) > -1); 1618 1619ok (mpf(0) != 1); 1620ok (mpf(0) != -1); 1621ok (mpf(1) != 0); 1622ok (mpf(1) != -1); 1623ok (mpf(-1) != 0); 1624ok (mpf(-1) != 1); 1625 1626ok (mpf(0) < 1.0); 1627ok (mpf(0) < '1'); 1628ok (mpf(0) < substr('-1',1,1)); 1629ok (mpf(0) < mpz(1)); 1630ok (mpf(0) < mpq(1)); 1631ok (mpf(0) < mpf(1)); 1632ok (mpf(0) < $uv_max); 1633 1634#------------------------------------------------------------------------------ 1635# GMP::Mpf::overload_string 1636 1637{ my $x = mpf(0); ok ("$x" eq "0"); } 1638{ my $x = mpf(123); ok ("$x" eq "123"); } 1639{ my $x = mpf(-123); ok ("$x" eq "-123"); } 1640 1641{ my $f = mpf(0.25); ok ("$f" eq "0.25"); } 1642{ my $f = mpf(-0.25); ok ("$f" eq "-0.25"); } 1643{ my $f = mpf(1.25); ok ("$f" eq "1.25"); } 1644{ my $f = mpf(-1.25); ok ("$f" eq "-1.25"); } 1645{ my $f = mpf(1000000); ok ("$f" eq "1000000"); } 1646{ my $f = mpf(-1000000); ok ("$f" eq "-1000000"); } 1647 1648#------------------------------------------------------------------------------ 1649# GMP::Mpf::overload_sub 1650 1651ok (mpf(0) - 1 == -1); 1652ok (mpf(1) - 1 == 0); 1653ok (1 - mpf(0) == 1); 1654ok (1 - mpf(1) == 0); 1655 1656#------------------------------------------------------------------------------ 1657# GMP::Mpf::overload_subeq 1658 1659{ my $a = mpf(7); $a -= 1; ok ($a == 6); } 1660{ my $a = mpf(7); my $b = $a; $a -= 1; ok ($a == 6); ok ($b == 7); } 1661 1662 1663#------------------------------------------------------------------------------ 1664# GMP::Mpf::ceil 1665 1666ok (ceil (mpf(-7.5)) == -7.0); 1667ok (ceil (mpf(7.5)) == 8.0); 1668 1669#------------------------------------------------------------------------------ 1670# GMP::Mpf::floor 1671 1672ok (floor(mpf(-7.5)) == -8.0); 1673ok (floor(mpf(7.5)) == 7.0); 1674 1675#------------------------------------------------------------------------------ 1676# GMP::Mpf::mpf_eq 1677 1678{ my $old_prec = get_default_prec(); 1679 set_default_prec(128); 1680 1681 ok ( mpf_eq (mpz("0x10000000000000001"), mpz("0x10000000000000002"), 1)); 1682 ok (! mpf_eq (mpz("0x11"), mpz("0x12"), 128)); 1683 1684 set_default_prec($old_prec); 1685} 1686 1687#------------------------------------------------------------------------------ 1688# GMP::Mpf::get_default_prec 1689 1690get_default_prec(); 1691 1692#------------------------------------------------------------------------------ 1693# GMP::Mpf::get_prec 1694 1695{ my $x = mpf(1.0, 512); 1696 ok (get_prec ($x) == 512); 1697} 1698 1699#------------------------------------------------------------------------------ 1700# GMP::Mpf::reldiff 1701 1702ok (reldiff (2,4) == 1); 1703ok (reldiff (4,2) == 0.5); 1704 1705#------------------------------------------------------------------------------ 1706# GMP::Mpf::set_default_prec 1707 1708{ my $old_prec = get_default_prec(); 1709 1710 set_default_prec(512); 1711 ok (get_default_prec () == 512); 1712 1713 set_default_prec($old_prec); 1714} 1715 1716#------------------------------------------------------------------------------ 1717# GMP::Mpf::set_prec 1718 1719{ my $x = mpf(1.0, 512); 1720 my $y = $x; 1721 set_prec ($x, 1024); 1722 ok (get_prec ($x) == 1024); 1723 ok (get_prec ($y) == 512); 1724} 1725 1726#------------------------------------------------------------------------------ 1727# GMP::Mpf::trunc 1728 1729ok (trunc(mpf(-7.5)) == -7.0); 1730ok (trunc(mpf(7.5)) == 7.0); 1731 1732 1733 1734#------------------------------------------------------------------------------ 1735# GMP::Rand 1736 1737#------------------------------------------------------------------------------ 1738# GMP::Rand::new 1739 1740{ my $r = randstate(); ok (defined $r); } 1741{ my $r = randstate('lc_2exp', 1, 2, 3); ok (defined $r); } 1742{ my $r = randstate('lc_2exp_size', 64); ok (defined $r); } 1743{ my $r = randstate('lc_2exp_size', 999999999); ok (! defined $r); } 1744{ my $r = randstate('mt'); ok (defined $r); } 1745 1746{ # copying a randstate results in same sequence 1747 my $r1 = randstate('lc_2exp_size', 64); 1748 $r1->seed(123); 1749 my $r2 = randstate($r1); 1750 for (1 .. 20) { 1751 my $z1 = mpz_urandomb($r1, 20); 1752 my $z2 = mpz_urandomb($r2, 20); 1753 ok ($z1 == $z2); 1754 } 1755} 1756 1757#------------------------------------------------------------------------------ 1758# GMP::Rand::seed 1759 1760{ my $r = randstate(); 1761 $r->seed(123); 1762 $r->seed(time()); 1763} 1764 1765#------------------------------------------------------------------------------ 1766# GMP::Rand::mpf_urandomb 1767 1768{ my $r = randstate(); 1769 my $f = mpf_urandomb($r,1024); 1770 ok (UNIVERSAL::isa($f,"GMP::Mpf")); } 1771 1772#------------------------------------------------------------------------------ 1773# GMP::Rand::mpz_urandomb 1774 1775{ my $r = randstate(); 1776 my $z = mpz_urandomb($r, 1024); 1777 ok (UNIVERSAL::isa($z,"GMP::Mpz")); } 1778 1779#------------------------------------------------------------------------------ 1780# GMP::Rand::mpz_rrandomb 1781 1782{ my $r = randstate(); 1783 my $z = mpz_rrandomb($r, 1024); 1784 ok (UNIVERSAL::isa($z,"GMP::Mpz")); } 1785 1786#------------------------------------------------------------------------------ 1787# GMP::Rand::mpz_urandomm 1788 1789{ my $r = randstate(); 1790 my $z = mpz_urandomm($r, mpz(3)**100); 1791 ok (UNIVERSAL::isa($z,"GMP::Mpz")); } 1792 1793#------------------------------------------------------------------------------ 1794# GMP::Rand::mpz_urandomb_ui 1795 1796{ my $r = randstate(); 1797 foreach (1 .. 20) { 1798 my $u = gmp_urandomb_ui($r,8); 1799 ok ($u >= 0); 1800 ok ($u < 256); 1801 } 1802} 1803 1804#------------------------------------------------------------------------------ 1805# GMP::Rand::mpz_urandomm_ui 1806 1807{ my $r = randstate(); 1808 foreach (1 .. 20) { 1809 my $u = gmp_urandomm_ui($r,8); 1810 ok ($u >= 0); 1811 ok ($u < 8); 1812 } 1813} 1814 1815 1816 1817 1818#------------------------------------------------------------------------------ 1819# GMP module 1820 1821#------------------------------------------------------------------------------ 1822# GMP::fits_slong_p 1823 1824ok (GMP::fits_slong_p(0)); 1825 1826# in perl 5.005 uv_max is only 32-bits on a 64-bit system, so won't exceed a 1827# long 1828# ok (! GMP::fits_slong_p($uv_max)); 1829 1830ok (GMP::fits_slong_p(0.0)); 1831 1832ok (GMP::fits_slong_p('0')); 1833 1834ok (GMP::fits_slong_p(substr('999999999999999999999999999999',1,1))); 1835 1836ok (! mpz("-9999999999999999999999999999999999999999999")->fits_slong_p()); 1837ok ( mpz(-123)->fits_slong_p()); 1838ok ( mpz(0)->fits_slong_p()); 1839ok ( mpz(123)->fits_slong_p()); 1840ok (! mpz("9999999999999999999999999999999999999999999")->fits_slong_p()); 1841 1842ok (! mpq("-9999999999999999999999999999999999999999999")->fits_slong_p()); 1843ok ( mpq(-123)->fits_slong_p()); 1844ok ( mpq(0)->fits_slong_p()); 1845ok ( mpq(123)->fits_slong_p()); 1846ok (! mpq("9999999999999999999999999999999999999999999")->fits_slong_p()); 1847 1848ok (! mpf("-9999999999999999999999999999999999999999999")->fits_slong_p()); 1849ok ( mpf(-123)->fits_slong_p()); 1850ok ( mpf(0)->fits_slong_p()); 1851ok ( mpf(123)->fits_slong_p()); 1852ok (! mpf("9999999999999999999999999999999999999999999")->fits_slong_p()); 1853 1854#------------------------------------------------------------------------------ 1855# GMP::get_d 1856 1857ok (GMP::get_d(123) == 123.0); 1858 1859ok (GMP::get_d($uv_max) > 0); 1860 1861ok (GMP::get_d(123.0) == 123.0); 1862 1863ok (GMP::get_d('123') == 123.0); 1864 1865ok (GMP::get_d(mpz(123)) == 123.0); 1866 1867ok (GMP::get_d(mpq(123)) == 123.0); 1868 1869ok (GMP::get_d(mpf(123)) == 123.0); 1870 1871#------------------------------------------------------------------------------ 1872# GMP::get_d_2exp 1873 1874{ my ($dbl, $exp) = get_d_2exp (0); 1875 ok ($dbl == 0); ok ($exp == 0); } 1876{ my ($dbl, $exp) = get_d_2exp (1); 1877 ok ($dbl == 0.5); ok ($exp == 1); } 1878 1879{ my ($dbl, $exp) = get_d_2exp ($uv_max); 1880 ok ($dbl > 0.0); ok ($exp > 0); } 1881 1882{ my ($dbl, $exp) = get_d_2exp (0.5); 1883 ok ($dbl == 0.5); ok ($exp == 0); } 1884{ my ($dbl, $exp) = get_d_2exp (0.25); 1885 ok ($dbl == 0.5); ok ($exp == -1); } 1886 1887{ my ($dbl, $exp) = get_d_2exp ("1.0"); 1888 ok ($dbl == 0.5); ok ($exp == 1); } 1889 1890{ my ($dbl, $exp) = get_d_2exp (mpz ("256")); 1891 ok ($dbl == 0.5); ok ($exp == 9); } 1892 1893{ my ($dbl, $exp) = get_d_2exp (mpq ("1/16")); 1894 ok ($dbl == 0.5); ok ($exp == -3); } 1895 1896{ my ($dbl, $exp) = get_d_2exp (mpf ("1.5")); 1897 ok ($dbl == 0.75); ok ($exp == 1); } 1898{ my ($dbl, $exp) = get_d_2exp (mpf ("3.0")); 1899 ok ($dbl == 0.75); ok ($exp == 2); } 1900 1901#------------------------------------------------------------------------------ 1902# GMP::get_str 1903 1904ok (get_str(-123) eq '-123'); 1905ok (get_str('-123') eq '-123'); 1906ok (get_str(substr('x-123x',1,4)) eq '-123'); 1907ok (get_str(mpz(-123)) eq '-123'); 1908ok (get_str(mpq(-123)) eq '-123'); 1909 1910ok (get_str(-123,10) eq '-123'); 1911ok (get_str('-123',10) eq '-123'); 1912ok (get_str(substr('x-123x',1,4),10) eq '-123'); 1913ok (get_str(mpz(-123),10) eq '-123'); 1914ok (get_str(mpq(-123),10) eq '-123'); 1915 1916ok (get_str(-123,16) eq '-7b'); 1917ok (get_str('-123',16) eq '-7b'); 1918ok (get_str(substr('x-123x',1,4),16) eq '-7b'); 1919ok (get_str(mpz(-123),16) eq '-7b'); 1920ok (get_str(mpq(-123),16) eq '-7b'); 1921 1922ok (get_str(-123,-16) eq '-7B'); 1923ok (get_str('-123',-16) eq '-7B'); 1924ok (get_str(substr('x-123x',1,4),-16) eq '-7B'); 1925ok (get_str(mpz(-123),-16) eq '-7B'); 1926ok (get_str(mpq(-123),-16) eq '-7B'); 1927 1928# is a float in past versions of perl without UV type 1929{ my ($str, $exp) = get_str($uv_max); 1930 ok ($str eq $uv_max_str); } 1931 1932ok (get_str(mpq(5/8)) eq "5/8"); 1933ok (get_str(mpq(-5/8)) eq "-5/8"); 1934ok (get_str(mpq(255/256),16) eq "ff/100"); 1935ok (get_str(mpq(255/256),-16) eq "FF/100"); 1936ok (get_str(mpq(-255/256),16) eq "-ff/100"); 1937ok (get_str(mpq(-255/256),-16) eq "-FF/100"); 1938 1939{ my ($s,$e) = get_str(1.5, 10); ok ($s eq '15'); ok ($e == 1); } 1940{ my ($s,$e) = get_str(mpf(1.5), 10); ok ($s eq '15'); ok ($e == 1); } 1941 1942{ my ($s,$e) = get_str(-1.5, 10); ok ($s eq '-15'); ok ($e == 1); } 1943{ my ($s,$e) = get_str(mpf(-1.5), 10); ok ($s eq '-15'); ok ($e == 1); } 1944 1945{ my ($s,$e) = get_str(1.5, 16); ok ($s eq '18'); ok ($e == 1); } 1946{ my ($s,$e) = get_str(mpf(1.5), 16); ok ($s eq '18'); ok ($e == 1); } 1947 1948{ my ($s,$e) = get_str(-1.5, 16); ok ($s eq '-18'); ok ($e == 1); } 1949{ my ($s,$e) = get_str(mpf(-1.5), 16); ok ($s eq '-18'); ok ($e == 1); } 1950 1951{ my ($s,$e) = get_str(65536.0, 16); ok ($s eq '1'); ok ($e == 5); } 1952{ my ($s,$e) = get_str(mpf(65536.0), 16); ok ($s eq '1'); ok ($e == 5); } 1953 1954{ my ($s,$e) = get_str(1.625, 16); ok ($s eq '1a'); ok ($e == 1); } 1955{ my ($s,$e) = get_str(mpf(1.625), 16); ok ($s eq '1a'); ok ($e == 1); } 1956 1957{ my ($s,$e) = get_str(1.625, -16); ok ($s eq '1A'); ok ($e == 1); } 1958{ my ($s,$e) = get_str(mpf(1.625), -16); ok ($s eq '1A'); ok ($e == 1); } 1959 1960{ my ($s, $e) = get_str(255.0,16,0); ok ($s eq "ff"); ok ($e == 2); } 1961{ my ($s, $e) = get_str(mpf(255.0),16,0); ok ($s eq "ff"); ok ($e == 2); } 1962 1963{ my ($s, $e) = get_str(255.0,-16,0); ok ($s eq "FF"); ok ($e == 2); } 1964{ my ($s, $e) = get_str(mpf(255.0),-16,0); ok ($s eq "FF"); ok ($e == 2); } 1965 1966#------------------------------------------------------------------------------ 1967# GMP::get_si 1968 1969ok (GMP::get_si(123) == 123.0); 1970 1971# better not assume anything about the relatives sizes of long and UV 1972ok (GMP::get_si($uv_max) != 0); 1973 1974ok (GMP::get_si(123.0) == 123.0); 1975 1976ok (GMP::get_si('123') == 123.0); 1977 1978ok (GMP::get_si(mpz(123)) == 123.0); 1979 1980ok (GMP::get_si(mpq(123)) == 123.0); 1981 1982ok (GMP::get_si(mpf(123)) == 123.0); 1983 1984#------------------------------------------------------------------------------ 1985# GMP::integer_p 1986 1987ok ( GMP::integer_p (0)); 1988ok ( GMP::integer_p (123)); 1989ok ( GMP::integer_p (-123)); 1990 1991ok ( GMP::integer_p ($uv_max)); 1992 1993ok ( GMP::integer_p (0.0)); 1994ok ( GMP::integer_p (123.0)); 1995ok ( GMP::integer_p (-123.0)); 1996ok (! GMP::integer_p (0.5)); 1997ok (! GMP::integer_p (123.5)); 1998ok (! GMP::integer_p (-123.5)); 1999 2000ok ( GMP::integer_p ('0')); 2001ok ( GMP::integer_p ('123')); 2002ok ( GMP::integer_p ('-123')); 2003ok (! GMP::integer_p ('0.5')); 2004ok (! GMP::integer_p ('123.5')); 2005ok (! GMP::integer_p ('-123.5')); 2006ok (! GMP::integer_p ('5/8')); 2007 2008ok ( GMP::integer_p (mpz(1))); 2009 2010ok ( GMP::integer_p (mpq(1))); 2011ok (! GMP::integer_p (mpq(1,2))); 2012 2013ok ( GMP::integer_p (mpf(1.0))); 2014ok (! GMP::integer_p (mpf(1.5))); 2015 2016#------------------------------------------------------------------------------ 2017# GMP::odd_p 2018 2019ok (! odd_p(0)); 2020ok ( odd_p(1)); 2021ok (! odd_p(2)); 2022 2023ok ( odd_p($uv_max)); 2024 2025ok ( odd_p(mpz(-3))); 2026ok (! odd_p(mpz(-2))); 2027ok ( odd_p(mpz(-1))); 2028ok (! odd_p(mpz(0))); 2029ok ( odd_p(mpz(1))); 2030ok (! odd_p(mpz(2))); 2031ok ( odd_p(mpz(3))); 2032 2033#------------------------------------------------------------------------------ 2034# GMP::printf 2035 2036GMP::printf ("hello world\n"); 2037 2038sub via_printf { 2039 my $s; 2040 open TEMP, ">test.tmp" or die; 2041 GMP::printf TEMP @_; 2042 close TEMP or die; 2043 open TEMP, "<test.tmp" or die; 2044 read (TEMP, $s, 1024); 2045 close TEMP or die; 2046 unlink 'test.tmp'; 2047 return $s; 2048} 2049 2050ok (sprintf ("%d", mpz(123)) eq '123'); 2051ok (sprintf ("%d %d %d", 456, mpz(123), 789) eq '456 123 789'); 2052ok (sprintf ("%d", mpq(15,16)) eq '15/16'); 2053ok (sprintf ("%f", mpf(1.5)) eq '1.500000'); 2054ok (sprintf ("%.2f", mpf(1.5)) eq '1.50'); 2055 2056ok (sprintf ("%*d", 6, 123) eq ' 123'); 2057ok (sprintf ("%*d", 6, mpz(123)) eq ' 123'); 2058ok (sprintf ("%*d", 6, mpq(15,16)) eq ' 15/16'); 2059 2060ok (sprintf ("%x", 123) eq '7b'); 2061ok (sprintf ("%x", mpz(123)) eq '7b'); 2062ok (sprintf ("%X", 123) eq '7B'); 2063ok (sprintf ("%X", mpz(123)) eq '7B'); 2064ok (sprintf ("%#x", 123) eq '0x7b'); 2065ok (sprintf ("%#x", mpz(123)) eq '0x7b'); 2066ok (sprintf ("%#X", 123) eq '0X7B'); 2067ok (sprintf ("%#X", mpz(123)) eq '0X7B'); 2068 2069ok (sprintf ("%x", mpq(15,16)) eq 'f/10'); 2070ok (sprintf ("%X", mpq(15,16)) eq 'F/10'); 2071ok (sprintf ("%#x", mpq(15,16)) eq '0xf/0x10'); 2072ok (sprintf ("%#X", mpq(15,16)) eq '0XF/0X10'); 2073 2074ok (sprintf ("%*.*f", 10, 3, 1.25) eq ' 1.250'); 2075ok (sprintf ("%*.*f", 10, 3, mpf(1.5)) eq ' 1.500'); 2076 2077ok (via_printf ("%d", mpz(123)) eq '123'); 2078ok (via_printf ("%d %d %d", 456, mpz(123), 789) eq '456 123 789'); 2079ok (via_printf ("%d", mpq(15,16)) eq '15/16'); 2080ok (via_printf ("%f", mpf(1.5)) eq '1.500000'); 2081ok (via_printf ("%.2f", mpf(1.5)) eq '1.50'); 2082 2083ok (via_printf ("%*d", 6, 123) eq ' 123'); 2084ok (via_printf ("%*d", 6, mpz(123)) eq ' 123'); 2085ok (via_printf ("%*d", 6, mpq(15,16)) eq ' 15/16'); 2086 2087ok (via_printf ("%x", 123) eq '7b'); 2088ok (via_printf ("%x", mpz(123)) eq '7b'); 2089ok (via_printf ("%X", 123) eq '7B'); 2090ok (via_printf ("%X", mpz(123)) eq '7B'); 2091ok (via_printf ("%#x", 123) eq '0x7b'); 2092ok (via_printf ("%#x", mpz(123)) eq '0x7b'); 2093ok (via_printf ("%#X", 123) eq '0X7B'); 2094ok (via_printf ("%#X", mpz(123)) eq '0X7B'); 2095 2096ok (via_printf ("%x", mpq(15,16)) eq 'f/10'); 2097ok (via_printf ("%X", mpq(15,16)) eq 'F/10'); 2098ok (via_printf ("%#x", mpq(15,16)) eq '0xf/0x10'); 2099ok (via_printf ("%#X", mpq(15,16)) eq '0XF/0X10'); 2100 2101ok (via_printf ("%*.*f", 10, 3, 1.25) eq ' 1.250'); 2102ok (via_printf ("%*.*f", 10, 3, mpf(1.5)) eq ' 1.500'); 2103 2104#------------------------------------------------------------------------------ 2105# GMP::sgn 2106 2107ok (sgn(-123) == -1); 2108ok (sgn(0) == 0); 2109ok (sgn(123) == 1); 2110 2111ok (sgn($uv_max) == 1); 2112 2113ok (sgn(-123.0) == -1); 2114ok (sgn(0.0) == 0); 2115ok (sgn(123.0) == 1); 2116 2117ok (sgn('-123') == -1); 2118ok (sgn('0') == 0); 2119ok (sgn('123') == 1); 2120ok (sgn('-123.0') == -1); 2121ok (sgn('0.0') == 0); 2122ok (sgn('123.0') == 1); 2123 2124ok (sgn(substr('x-123x',1,4)) == -1); 2125ok (sgn(substr('x0x',1,1)) == 0); 2126ok (sgn(substr('x123x',1,3)) == 1); 2127 2128ok (mpz(-123)->sgn() == -1); 2129ok (mpz(0) ->sgn() == 0); 2130ok (mpz(123) ->sgn() == 1); 2131 2132ok (mpq(-123)->sgn() == -1); 2133ok (mpq(0) ->sgn() == 0); 2134ok (mpq(123) ->sgn() == 1); 2135 2136ok (mpf(-123)->sgn() == -1); 2137ok (mpf(0) ->sgn() == 0); 2138ok (mpf(123) ->sgn() == 1); 2139 2140 2141 2142#------------------------------------------------------------------------------ 2143# overloaded constants 2144 2145if ($] > 5.00503) { 2146 if (! do 'test2.pl') { 2147 die "Cannot run test2.pl\n"; 2148 } 2149} 2150 2151 2152 2153 2154#------------------------------------------------------------------------------ 2155# $# stuff 2156# 2157# For some reason "local $#" doesn't leave $# back at its default undefined 2158# state when exiting the block. 2159 2160{ local $# = 'hi %.0f there'; 2161 my $f = mpf(123); 2162 ok ("$f" eq 'hi 123 there'); } 2163 2164 2165 2166# Local variables: 2167# perl-indent-level: 2 2168# End: 2169