diff options
author | Kevin Ryde <user42@zip.com.au> | 2003-12-08 01:18:11 +0100 |
---|---|---|
committer | Kevin Ryde <user42@zip.com.au> | 2003-12-08 01:18:11 +0100 |
commit | 02c86a8bb110e4a8230803d0c11f31893594c2ec (patch) | |
tree | 0b360a9631dc5423a434cd0f4654cef12421b65c /demos/perl | |
parent | 3c2f9d176366222d558f67420ab56dfcb075e12e (diff) | |
download | gmp-02c86a8bb110e4a8230803d0c11f31893594c2ec.tar.gz |
* demos/perl/test.pl: Exercise magic, rearrange to make it clearer
what's being tested.
Diffstat (limited to 'demos/perl')
-rw-r--r-- | demos/perl/test.pl | 2075 |
1 files changed, 1598 insertions, 477 deletions
diff --git a/demos/perl/test.pl b/demos/perl/test.pl index 007bdc3f4..9d93d0939 100644 --- a/demos/perl/test.pl +++ b/demos/perl/test.pl @@ -54,286 +54,287 @@ use GMP::Mpq qw(:noconstants); use GMP::Mpf qw(:constants); use GMP::Mpf qw(:noconstants); -use GMP qw(version); -print '$GMP::VERSION ',$GMP::VERSION,' GMP::version() ',version(),"\n"; +package Mytie; +use Exporter; +use vars qw($val $fetched $stored); +$val = 0; +$fetched = 0; +$stored = 0; +sub TIESCALAR { + my ($class, $newval) = @_; + my $var = 'mytie dummy refed var'; + $val = $newval; + $fetched = 0; + $stored = 0; + return bless \$var, $class; +} +sub FETCH { + my ($self) = @_; + $fetched++; + return $val; +} +sub STORE { + my ($self, $newval) = @_; + $val = $newval; + $stored++; +} +package main; + +# check Mytie does what it should +{ tie my $t, 'Mytie', 123; + ok ($Mytie::val == 123); + $Mytie::val = 456; + ok ($t == 456); + $t = 789; + ok ($Mytie::val == 789); +} -# force to a string, not a PVIV + +# Usage: str(x) +# Return x forced to a string, not a PVIV. +# sub str { my $s = "@_[0]" . ""; return $s; } -foreach my $name ('mpz', 'mpq', 'mpf') { - print "$name\n"; - my $mpx = eval("\\&$name"); +my $ivnv_2p128 = 65536.0 * 65536.0 * 65536.0 * 65536.0 + * 65536.0 * 65536.0 * 65536.0 * 65536.0; +kill (0, $ivnv_2p128); +my $str_2p128 = '340282366920938463463374607431768211456'; - ok (&$mpx() == 0); +my $ulong_max = ~ 0; - foreach my $x (0, 1, -1, 123, -123) { - foreach my $y ($x, ""."$x", substr("$x",0), 0.0+$x, - mpz($x), mpq($x), mpf($x)) { - ok (&$mpx($x) == $x); - } - } - - ok (&$mpx(substr("11",0,1)) == 1); - - ok (&$mpx(0) < 1); - ok (&$mpx(0) > -1); - - ok (&$mpx(0) != 1); - ok (&$mpx(0) != -1); - ok (&$mpx(1) != 0); - ok (&$mpx(1) != -1); - ok (&$mpx(-1) != 0); - ok (&$mpx(-1) != 1); - - ok (&$mpx(0) + 1 == 1); - ok (&$mpx(-1) + 1 == 0); - ok (1 + &$mpx(0) == 1); - ok (1 + &$mpx(-1) == 0); - - ok (&$mpx(0) - 1 == -1); - ok (&$mpx(1) - 1 == 0); - ok (1 - &$mpx(0) == 1); - ok (1 - &$mpx(1) == 0); - - ok (&$mpx(2) * 3 == 6); - - ok (&$mpx(6) / 2 == 3); - ok (&$mpx(-6) / 2 == -3); - ok (&$mpx(6) / -2 == -3); - ok (&$mpx(-6) / -2 == 3); - - ok (abs(&$mpx(0)) == 0); - ok (abs(&$mpx(1)) == 1); - ok (abs(&$mpx(-1)) == 1); - { my $x = &$mpx(-123); $x = abs($x); ok ($x == 123); } - { my $x = &$mpx(-1); $x = abs($x); ok ($x == 1); } - { my $x = &$mpx(0); $x = abs($x); ok ($x == 0); } - { my $x = &$mpx(1); $x = abs($x); ok ($x == 1); } - { my $x = &$mpx(123); $x = abs($x); ok ($x == 123); } - - - foreach my $x (-123, -1, 0, 1, 123) { - foreach my $xv ($x, "$x", substr("$x",0), $x+0.0, - mpz($x), mpq($x), mpf($x)) { - my $xm = &$mpx($xv); - if ($xm) { - ok ($x); - } else { - ok (not $x); - } - if (not $xm) { - ok (not $x); - } else { - ok ($x); - } - if (! $xm) { - ok (not $x); - } else { - ok ($x); - } - } - } +my $uv_max = ~ 0; +my $uv_max_str = ~ 0; +$uv_max_str = "$uv_max_str"; +$uv_max_str = "" . "$uv_max_str"; - ok (- &$mpx(0) == 0); - ok (- &$mpx(1) == -1); - ok (- &$mpx(-1) == 1); - { - my $a = &$mpx(0); my $b = $a; - $a = &$mpx(1); - ok ($a == 1); - ok ($b == 0); - } - { - my $a = &$mpx(0); my $b = $a; - $a++; - ok ($a == 1); - ok ($b == 0); - } - { - my $a = &$mpx(0); my $b = $a; - $a--; - ok ($a == -1); - ok ($b == 0); - } - { - my $a = &$mpx(0); my $b = $a; - $a++; - ok ($a == 1); - ok ($b == 0); - } +#------------------------------------------------------------------------------ +# GMP::version - { my $a = &$mpx(0); ok ($a++ == 0); } - { my $a = &$mpx(0); ok ($a-- == 0); } - { my $a = &$mpx(0); ok (++$a == 1); } - { my $a = &$mpx(0); ok (--$a == -1); } - - { my $x = &$mpx(0); ok("$x" eq "0"); } - { my $x = &$mpx(123); ok("$x" eq "123"); } - { my $x = &$mpx(-123); ok("$x" eq "-123"); } - - ok (&$mpx(0) ** 1 == 0); - ok (&$mpx(1) ** 1 == 1); - ok (&$mpx(2) ** 0 == 1); - ok (&$mpx(2) ** 1 == 2); - ok (&$mpx(2) ** 2 == 4); - ok (&$mpx(2) ** 3 == 8); - ok (&$mpx(2) ** 4 == 16); - - ok (&$mpx(0) ** &$mpx(1) == 0); - ok (&$mpx(1) ** &$mpx(1) == 1); - ok (&$mpx(2) ** &$mpx(0) == 1); - ok (&$mpx(2) ** &$mpx(1) == 2); - ok (&$mpx(2) ** &$mpx(2) == 4); - ok (&$mpx(2) ** &$mpx(3) == 8); - ok (&$mpx(2) ** &$mpx(4) == 16); - - { my $a = &$mpx(7); $a += 1; ok ($a == 8); } - { my $a = &$mpx(7); $a -= 1; ok ($a == 6); } - { my $a = &$mpx(7); $a *= 3; ok ($a == 21); } - { my $a = &$mpx(21); $a /= 3; ok ($a == 7); } - { my $a = &$mpx(7); $a <<= 1; ok ($a == 14); } - { my $a = &$mpx(32); $a >>= 1; ok ($a == 16); } - { my $a = &$mpx(3); $a **= 4; ok ($a == 81); } - - ok (! &$mpx("-9999999999999999999999999999999999999999999")->fits_slong_p()); - ok ( &$mpx(-123)->fits_slong_p()); - ok ( &$mpx(0)->fits_slong_p()); - ok ( &$mpx(123)->fits_slong_p()); - ok (! &$mpx("9999999999999999999999999999999999999999999")->fits_slong_p()); - - ok (&$mpx(-123)->sgn() == -1); - ok (&$mpx(-1) ->sgn() == -1); - ok (&$mpx(0) ->sgn() == 0); - ok (&$mpx(1) ->sgn() == 1); - ok (&$mpx(123) ->sgn() == 1); -} - -foreach my $x (-123, -1, 0, 1, 123) { - foreach my $xv ($x, "$x", substr("$x",0), $x+0.0, - mpz($x), mpq($x), mpf($x)) { - - ok (GMP::get_d($xv) == $x); - ok (GMP::get_si($xv) == $x); - ok (GMP::integer_p($xv) == 1); - ok (GMP::sgn($xv) == ($x <=> 0)); - - foreach my $y (-123, -1, 0, 1, 123) { - foreach my $yv ($y, "$y", 0.0+$y, mpz($y), mpq($y), mpf($y)) { - - ok (($xv <=> $yv) == ($x <=> $y)); - } - } - } +use GMP qw(version); +print '$GMP::VERSION ',$GMP::VERSION,' GMP::version() ',version(),"\n"; + + +#------------------------------------------------------------------------------ +# GMP::Mpz::new + +ok (mpz(0) == 0); +ok (mpz('0') == 0); +ok (mpz(substr('101',1,1)) == 0); +ok (mpz(0.0) == 0); +ok (mpz(mpz(0)) == 0); +ok (mpz(mpq(0)) == 0); +ok (mpz(mpf(0)) == 0); + +{ tie my $t, 'Mytie', 0; + ok (mpz($t) == 0); + ok ($Mytie::fetched > 0); +} +{ tie my $t, 'Mytie', '0'; + ok (mpz($t) == 0); + ok ($Mytie::fetched > 0); } +{ tie my $t, 'Mytie', substr('101',1,1); ok (mpz($t) == 0); } +{ tie my $t, 'Mytie', 0.0; ok (mpz($t) == 0); } +{ tie my $t, 'Mytie', mpz(0); ok (mpz($t) == 0); } +{ tie my $t, 'Mytie', mpq(0); ok (mpz($t) == 0); } +{ tie my $t, 'Mytie', mpf(0); ok (mpz($t) == 0); } + +ok (mpz(-123) == -123); +ok (mpz('-123') == -123); +ok (mpz(substr('1-1231',1,4)) == -123); +ok (mpz(-123.0) == -123); +ok (mpz(mpz(-123)) == -123); +ok (mpz(mpq(-123)) == -123); +ok (mpz(mpf(-123)) == -123); + +{ tie my $t, 'Mytie', -123; ok (mpz($t) == -123); } +{ tie my $t, 'Mytie', '-123'; ok (mpz($t) == -123); } +{ tie my $t, 'Mytie', substr('1-1231',1,4); ok (mpz($t) == -123); } +{ tie my $t, 'Mytie', -123.0; ok (mpz($t) == -123); } +{ tie my $t, 'Mytie', mpz(-123); ok (mpz($t) == -123); } +{ tie my $t, 'Mytie', mpq(-123); ok (mpz($t) == -123); } +{ tie my $t, 'Mytie', mpf(-123); ok (mpz($t) == -123); } + +ok (mpz($ivnv_2p128) == $str_2p128); +{ tie my $t, 'Mytie', $ivnv_2p128; ok (mpz($t) == $str_2p128); } + +ok (mpz($uv_max) > 0); +ok (mpz($uv_max) == mpz($uv_max_str)); +{ tie my $t, 'Mytie', $uv_max; ok (mpz($t) > 0); } +{ tie my $t, 'Mytie', $uv_max; ok (mpz($t) == mpz($uv_max_str)); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_abs + +ok (abs(mpz(0)) == 0); +ok (abs(mpz(123)) == 123); +ok (abs(mpz(-123)) == 123); + +{ my $x = mpz(-123); $x = abs($x); ok ($x == 123); } +{ my $x = mpz(0); $x = abs($x); ok ($x == 0); } +{ my $x = mpz(123); $x = abs($x); ok ($x == 123); } + +{ tie my $t, 'Mytie', mpz(0); ok (abs($t) == 0); } +{ tie my $t, 'Mytie', mpz(123); ok (abs($t) == 123); } +{ tie my $t, 'Mytie', mpz(-123); ok (abs($t) == 123); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_add + +ok (mpz(0) + 1 == 1); +ok (mpz(-1) + 1 == 0); +ok (1 + mpz(0) == 1); +ok (1 + mpz(-1) == 0); + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_addeq + +{ my $a = mpz(7); $a += 1; ok ($a == 8); } +{ my $a = mpz(7); my $b = $a; $a += 1; ok ($a == 8); ok ($b == 7); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_and -{ my ($dbl, $exp) = get_d_2exp (0); - ok ($dbl == 0); ok ($exp == 0); } -{ my ($dbl, $exp) = get_d_2exp (1); - ok ($dbl == 0.5); ok ($exp == 1); } -{ my ($dbl, $exp) = get_d_2exp (0.5); - ok ($dbl == 0.5); ok ($exp == 0); } -{ my ($dbl, $exp) = get_d_2exp (0.25); - ok ($dbl == 0.5); ok ($exp == -1); } -{ my ($dbl, $exp) = get_d_2exp ("1.0"); - ok ($dbl == 0.5); ok ($exp == 1); } -{ my ($dbl, $exp) = get_d_2exp (mpz ("256")); - ok ($dbl == 0.5); ok ($exp == 9); } -{ my ($dbl, $exp) = get_d_2exp (mpq ("1/16")); - ok ($dbl == 0.5); ok ($exp == -3); } -{ my ($dbl, $exp) = get_d_2exp (mpf ("1.5")); - ok ($dbl == 0.75); ok ($exp == 1); } -{ my ($dbl, $exp) = get_d_2exp (mpf ("3.0")); - ok ($dbl == 0.75); ok ($exp == 2); } +ok ((mpz(3) & 1) == 1); +ok ((mpz(3) & 4) == 0); -foreach my $xpair ([-123,"-7b"], [-1,"-1"], [0,"0"], [1,"1"], [123,"7b"]) { - my $x = $$xpair[0]; - my $xhex = $$xpair[1]; +{ my $a = mpz(3); $a &= 1; ok ($a == 1); } +{ my $a = mpz(3); $a &= 4; ok ($a == 0); } - foreach my $xv ($x, "$x", substr("$x",0), - mpz($x), mpq($x)) { +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_bool - ok (get_str($xv) eq "$x"); - ok (get_str($xv,10) eq "$x"); +if (mpz(0)) { ok (0); } else { ok (1); } +if (mpz(123)) { ok (1); } else { ok (0); } - ok (get_str($xv,16) == $xhex); - $xhex =~ tr [a-z] [A-Z]; - ok (get_str($xv,-16) == $xhex); - } -} +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_com -ok (GMP::get_str(mpq(5/8)) eq "5/8"); -ok (GMP::get_str(mpq(-5/8)) eq "-5/8"); -ok (GMP::get_str(mpq(255/256),16) eq "ff/100"); -ok (GMP::get_str(mpq(255/256),-16) eq "FF/100"); -ok (GMP::get_str(mpq(-255/256),16) eq "-ff/100"); -ok (GMP::get_str(mpq(-255/256),-16) eq "-FF/100"); +ok (~ mpz(0) == -1); +ok (~ mpz(1) == -2); +ok (~ mpz(-2) == 1); +ok (~ mpz(0xFF) == -0x100); +ok (~ mpz(-0x100) == 0xFF); -foreach my $x (1.5, mpf(1.5)) { - { my ($s,$e) = get_str($x, 10); - ok ($s eq '15'); - ok ($e == 1); } -} -foreach my $x (-1.5, mpf(-1.5)) { - { my ($s,$e) = get_str($x, 10); - ok ($s eq '-15'); - ok ($e == 1); } -} -foreach my $x (1.5, mpf(1.5)) { - { my ($s,$e) = get_str($x, 16); - ok ($s eq '18'); - ok ($e == 1); } -} -foreach my $x (-1.5, mpf(-1.5)) { - { my ($s,$e) = get_str($x, 16); - ok ($s eq '-18'); - ok ($e == 1); } -} -foreach my $x (65536.0, mpf(65536.0)) { - { my ($s,$e) = get_str($x, 16); - ok ($s eq '1'); - ok ($e == 5); } -} -foreach my $x (1.625, mpf(1.625)) { - { my ($s,$e) = get_str($x, 16); - ok ($s eq '1a'); - ok ($e == 1); } -} -foreach my $x (1.625, mpf(1.625)) { - { my ($s,$e) = get_str($x, -16); - ok ($s eq '1A'); - ok ($e == 1); } -} -foreach my $f (255.0, mpf(255)) { - my ($s, $e) = get_str(255.0,16,0); - ok ($s eq "ff"); - ok ($e == 2); -} -foreach my $f (255.0, mpf(255)) { - my ($s, $e) = get_str(255.0,-16,0); - ok ($s eq "FF"); - ok ($e == 2); -} -foreach my $f (-255.0, mpf(-255)) { - my ($s, $e) = get_str(-255.0,16,0); - ok ($s eq "-ff"); - ok ($e == 2); -} -foreach my $f (-255.0, mpf(-255)) { - my ($s, $e) = get_str(-255.0,-16,0); - ok ($s eq "-FF"); - ok ($e == 2); -} +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_dec +{ my $a = mpz(0); ok ($a-- == 0); ok ($a == -1); } +{ my $a = mpz(0); ok (--$a == -1); } -ok ( GMP::integer_p (mpq(1))); -ok (! GMP::integer_p (mpq(1,2))); -ok ( GMP::integer_p (mpf(1.0))); -ok (! GMP::integer_p (mpf(1.5))); +{ my $a = mpz(0); my $b = $a; $a--; ok ($a == -1); ok ($b == 0); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_div + +ok (mpz(6) / 2 == 3); +ok (mpz(-6) / 2 == -3); +ok (mpz(6) / -2 == -3); +ok (mpz(-6) / -2 == 3); + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_diveq + +{ my $a = mpz(21); $a /= 3; ok ($a == 7); } +{ my $a = mpz(21); my $b = $a; $a /= 3; ok ($a == 7); ok ($b == 21); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_eq + +{ my $a = mpz(0); + my $b = $a; + $a = mpz(1); + ok ($a == 1); + ok ($b == 0); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_inc + +{ my $a = mpz(0); ok ($a++ == 0); ok ($a == 1); } +{ my $a = mpz(0); ok (++$a == 1); } + +{ my $a = mpz(0); my $b = $a; $a++; ok ($a == 1); ok ($b == 0); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_ior + +ok ((mpz(3) | 1) == 3); +ok ((mpz(3) | 4) == 7); + +{ my $a = mpz(3); $a |= 1; ok ($a == 3); } +{ my $a = mpz(3); $a |= 4; ok ($a == 7); } + +ok ((mpz("0xAA") | mpz("0x55")) == mpz("0xFF")); + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_lshift + +{ my $a = mpz(7) << 1; ok ($a == 14); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_lshifteq + +{ my $a = mpz(7); $a <<= 1; ok ($a == 14); } +{ my $a = mpz(7); my $b = $a; $a <<= 1; ok ($a == 14); ok ($b == 7); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_mul + +ok (mpz(2) * 3 == 6); + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_muleq + +{ my $a = mpz(7); $a *= 3; ok ($a == 21); } +{ my $a = mpz(7); my $b = $a; $a *= 3; ok ($a == 21); ok ($b == 7); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_neg + +ok (- mpz(0) == 0); +ok (- mpz(123) == -123); +ok (- mpz(-123) == 123); + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_not + +if (not mpz(0)) { ok (1); } else { ok (0); } +if (not mpz(123)) { ok (0); } else { ok (1); } + +ok ((! mpz(0)) == 1); +ok ((! mpz(123)) == 0); + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_pow + +ok (mpz(0) ** 1 == 0); +ok (mpz(1) ** 1 == 1); +ok (mpz(2) ** 0 == 1); +ok (mpz(2) ** 1 == 2); +ok (mpz(2) ** 2 == 4); +ok (mpz(2) ** 3 == 8); +ok (mpz(2) ** 4 == 16); +ok (mpz(0) ** mpz(1) == 0); +ok (mpz(1) ** mpz(1) == 1); +ok (mpz(2) ** mpz(0) == 1); +ok (mpz(2) ** mpz(1) == 2); +ok (mpz(2) ** mpz(2) == 4); +ok (mpz(2) ** mpz(3) == 8); +ok (mpz(2) ** mpz(4) == 16); + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_poweq + +{ my $a = mpz(3); $a **= 4; ok ($a == 81); } +{ my $a = mpz(3); my $b = $a; $a **= 4; ok ($a == 81); ok ($b == 3); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_rem ok (mpz(-8) % 3 == -2); ok (mpz(-7) % 3 == -1); @@ -344,29 +345,79 @@ ok (mpz(8) % 3 == 2); { my $a = mpz(24); $a %= 7; ok ($a == 3); } -ok ((mpz(3) & 1) == 1); -ok ((mpz(3) & 4) == 0); -ok ((mpz(3) | 1) == 3); -ok ((mpz(3) | 4) == 7); +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_rshift + +{ my $a = mpz(32) >> 1; ok ($a == 16); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_rshifteq + +{ my $a = mpz(32); $a >>= 1; ok ($a == 16); } +{ my $a = mpz(32); my $b = $a; $a >>= 1; ok ($a == 16); ok ($b == 32); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_spaceship + +ok (mpz(0) < 1); +ok (mpz(0) > -1); + +ok (mpz(0) != 1); +ok (mpz(0) != -1); +ok (mpz(1) != 0); +ok (mpz(1) != -1); +ok (mpz(-1) != 0); +ok (mpz(-1) != 1); + +ok (mpz(0) < 1.0); +ok (mpz(0) < '1'); +ok (mpz(0) < substr('-1',1,1)); +ok (mpz(0) < mpz(1)); +ok (mpz(0) < mpq(1)); +ok (mpz(0) < mpf(1)); +ok (mpz(0) < $uv_max); + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_sqrt + +ok (sqrt(mpz(0)) == 0); +ok (sqrt(mpz(1)) == 1); +ok (sqrt(mpz(4)) == 2); +ok (sqrt(mpz(81)) == 9); + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_string + +{ my $x = mpz(0); ok("$x" eq "0"); } +{ my $x = mpz(123); ok("$x" eq "123"); } +{ my $x = mpz(-123); ok("$x" eq "-123"); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_sub + +ok (mpz(0) - 1 == -1); +ok (mpz(1) - 1 == 0); +ok (1 - mpz(0) == 1); +ok (1 - mpz(1) == 0); + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_subeq + +{ my $a = mpz(7); $a -= 1; ok ($a == 6); } +{ my $a = mpz(7); my $b = $a; $a -= 1; ok ($a == 6); ok ($b == 7); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::overload_xor + ok ((mpz(3) ^ 1) == 2); ok ((mpz(3) ^ 4) == 7); -ok ((mpz("0xAA") | mpz("0x55")) == mpz("0xFF")); -{ my $a = mpz(3); $a &= 1; ok ($a == 1); } -{ my $a = mpz(3); $a &= 4; ok ($a == 0); } -{ my $a = mpz(3); $a |= 1; ok ($a == 3); } -{ my $a = mpz(3); $a |= 4; ok ($a == 7); } { my $a = mpz(3); $a ^= 1; ok ($a == 2); } { my $a = mpz(3); $a ^= 4; ok ($a == 7); } -ok (~ mpz(0) == -1); -ok (~ mpz(1) == -2); -ok (~ mpz(-2) == 1); -ok (~ mpz(0xFF) == -0x100); -ok (~ mpz(-0x100) == 0xFF); - -# mpz functions +#------------------------------------------------------------------------------ +# GMP::Mpz::bin ok (bin(2,0) == 1); ok (bin(2,1) == 2); @@ -377,6 +428,10 @@ ok (bin(3,1) == 3); ok (bin(3,2) == 3); ok (bin(3,3) == 1); + +#------------------------------------------------------------------------------ +# GMP::Mpz::cdiv + { my ($q, $r); ($q, $r) = cdiv (16, 3); ok ($q == 6); @@ -391,35 +446,10 @@ ok (bin(3,3) == 1); ok ($q == 6); ok ($r == 2); } -{ my ($q, $r); - ($q, $r) = fdiv (16, 3); - ok ($q == 5); - ok ($r == 1); - ($q, $r) = fdiv (16, -3); - ok ($q == -6); - ok ($r == -2); - ($q, $r) = fdiv (-16, 3); - ok ($q == -6); - ok ($r == 2); - ($q, $r) = fdiv (-16, -3); - ok ($q == 5); - ok ($r == -1); -} -{ my ($q, $r); - ($q, $r) = tdiv (16, 3); - ok ($q == 5); - ok ($r == 1); - ($q, $r) = tdiv (16, -3); - ok ($q == -5); - ok ($r == 1); - ($q, $r) = tdiv (-16, 3); - ok ($q == -5); - ok ($r == -1); - ($q, $r) = tdiv (-16, -3); - ok ($q == 5); - ok ($r == -1); -} + +#------------------------------------------------------------------------------ +# GMP::Mpz::cdiv_2exp { my ($q, $r); ($q, $r) = cdiv_2exp (23, 2); @@ -429,83 +459,165 @@ ok (bin(3,3) == 1); ok ($q == -5); ok ($r == -3); } -{ my ($q, $r); - ($q, $r) = fdiv_2exp (23, 2); - ok ($q == 5); - ok ($r == 3); - ($q, $r) = fdiv_2exp (-23, 2); - ok ($q == -6); - ok ($r == 1); + + +#------------------------------------------------------------------------------ +# GMP::Mpz::clrbit + +{ my $a = mpz(3); clrbit ($a, 1); ok ($a == 1); + ok (UNIVERSAL::isa($a,"GMP::Mpz")); } +{ my $a = mpz(3); clrbit ($a, 2); ok ($a == 3); + ok (UNIVERSAL::isa($a,"GMP::Mpz")); } + +{ my $a = 3; clrbit ($a, 1); ok ($a == 1); + ok (UNIVERSAL::isa($a,"GMP::Mpz")); } +{ my $a = 3; clrbit ($a, 2); ok ($a == 3); + ok (UNIVERSAL::isa($a,"GMP::Mpz")); } + +# mutate only given variable +{ my $a = mpz(3); + my $b = $a; + clrbit ($a, 0); + ok ($a == 2); + ok ($b == 3); +} +{ my $a = 3; + my $b = $a; + clrbit ($a, 0); + ok ($a == 2); + ok ($b == 3); } -{ my ($q, $r); - ($q, $r) = tdiv_2exp (23, 2); - ok ($q == 5); - ok ($r == 3); - ($q, $r) = tdiv_2exp (-23, 2); - ok ($q == -5); - ok ($r == -3); +{ tie my $a, 'Mytie', mpz(3); + clrbit ($a, 1); + ok ($Mytie::fetched > 0); # used fetch + ok ($Mytie::stored > 0); # used store + ok ($a == 1); # expected result + ok (UNIVERSAL::isa($a,"GMP::Mpz")); + ok (tied($a)); # still tied +} +{ tie my $a, 'Mytie', 3; + clrbit ($a, 1); + ok ($Mytie::fetched > 0); # used fetch + ok ($Mytie::stored > 0); # used store + ok ($a == 1); # expected result + ok (UNIVERSAL::isa($a,"GMP::Mpz")); + ok (tied($a)); # still tied } -{ my $a = 3; clrbit ($a, 1); ok ($a == 1); } -{ my $a = 3; clrbit ($a, 2); ok ($a == 3); } -{ # mutate only given variable - my $a = 3; - my $b = $a; +{ my $b = mpz(3); + tie my $a, 'Mytie', $b; + clrbit ($a, 0); + ok ($a == 2); ok ($b == 3); + ok (tied($a)); +} +{ my $b = 3; + tie my $a, 'Mytie', $b; clrbit ($a, 0); ok ($a == 2); ok ($b == 3); - $b = $a; - ok ($b == 2); + ok (tied($a)); } -{ my $a = 3; combit ($a, 1); ok ($a == 1); } -{ my $a = 3; combit ($a, 2); ok ($a == 7); } -{ # mutate only given variable - my $a = 3; +#------------------------------------------------------------------------------ +# GMP::Mpz::combit + +{ my $a = mpz(3); combit ($a, 1); ok ($a == 1); + ok (UNIVERSAL::isa($a,"GMP::Mpz")); } +{ my $a = mpz(3); combit ($a, 2); ok ($a == 7); + ok (UNIVERSAL::isa($a,"GMP::Mpz")); } + +{ my $a = 3; combit ($a, 1); ok ($a == 1); + ok (UNIVERSAL::isa($a,"GMP::Mpz")); } +{ my $a = 3; combit ($a, 2); ok ($a == 7); + ok (UNIVERSAL::isa($a,"GMP::Mpz")); } + +# mutate only given variable +{ my $a = mpz(3); my $b = $a; + combit ($a, 0); + ok ($a == 2); ok ($b == 3); +} +{ my $a = 3; + my $b = $a; combit ($a, 0); ok ($a == 2); ok ($b == 3); - $b = $a; - ok ($b == 2); } -{ my $a = 3; setbit ($a, 1); ok ($a == 3); } -{ my $a = 3; setbit ($a, 2); ok ($a == 7); } -{ # mutate only given variable - my $a = 0; - my $b = $a; - ok ($b == 0); - setbit ($a, 0); - ok ($a == 1); - ok ($b == 0); - $b = $a; - ok ($b == 1); +{ tie my $a, 'Mytie', mpz(3); + combit ($a, 2); + ok ($Mytie::fetched > 0); # used fetch + ok ($Mytie::stored > 0); # used store + ok ($a == 7); # expected result + ok (UNIVERSAL::isa($a,"GMP::Mpz")); + ok (tied($a)); # still tied +} +{ tie my $a, 'Mytie', 3; + combit ($a, 2); + ok ($Mytie::fetched > 0); # used fetch + ok ($Mytie::stored > 0); # used store + ok ($a == 7); # expected result + ok (UNIVERSAL::isa($a,"GMP::Mpz")); + ok (tied($a)); # still tied +} + +{ my $b = mpz(3); + tie my $a, 'Mytie', $b; + combit ($a, 0); + ok ($a == 2); + ok ($b == 3); + ok (tied($a)); } +{ my $b = 3; + tie my $a, 'Mytie', $b; + combit ($a, 0); + ok ($a == 2); + ok ($b == 3); + ok (tied($a)); +} + +#------------------------------------------------------------------------------ +# GMP::Mpz::congruent_p ok ( congruent_p (21, 0, 7)); ok (! congruent_p (21, 1, 7)); ok ( congruent_p (21, 5, 8)); ok (! congruent_p (21, 6, 8)); + +#------------------------------------------------------------------------------ +# GMP::Mpz::congruent_2exp_p + ok ( congruent_2exp_p (20, 0, 2)); ok (! congruent_2exp_p (21, 0, 2)); ok (! congruent_2exp_p (20, 1, 2)); +#------------------------------------------------------------------------------ +# GMP::Mpz::divexact + ok (divexact(27,3) == 9); ok (divexact(27,-3) == -9); ok (divexact(-27,3) == -9); ok (divexact(-27,-3) == 9); +#------------------------------------------------------------------------------ +# GMP::Mpz::divisible_p + ok ( divisible_p (21, 7)); ok (! divisible_p (21, 8)); +#------------------------------------------------------------------------------ +# GMP::Mpz::divisible_2exp_p + ok ( divisible_2exp_p (20, 2)); ok (! divisible_2exp_p (21, 2)); +#------------------------------------------------------------------------------ +# GMP::Mpz::even_p + ok (! even_p(mpz(-3))); ok ( even_p(mpz(-2))); ok (! even_p(mpz(-1))); @@ -514,6 +626,9 @@ ok (! even_p(mpz(1))); ok ( even_p(mpz(2))); ok (! even_p(mpz(3))); +#------------------------------------------------------------------------------ +# GMP::Mpz::export + { my $s = mpz_export (1, 2, 1, 0, "0x61626364"); ok ($s eq 'abcd'); } { my $s = mpz_export (-1, 2, 1, 0, "0x61626364"); @@ -523,6 +638,9 @@ ok (! even_p(mpz(3))); { my $s = mpz_export (-1, 2, -1, 0, "0x61626364"); ok ($s eq 'dcba'); } +#------------------------------------------------------------------------------ +# GMP::Mpz::fac + ok (fac(0) == 1); ok (fac(1) == 1); ok (fac(2) == 2); @@ -530,6 +648,39 @@ ok (fac(3) == 6); ok (fac(4) == 24); ok (fac(5) == 120); +#------------------------------------------------------------------------------ +# GMP::Mpz::fdiv + +{ my ($q, $r); + ($q, $r) = fdiv (16, 3); + ok ($q == 5); + ok ($r == 1); + ($q, $r) = fdiv (16, -3); + ok ($q == -6); + ok ($r == -2); + ($q, $r) = fdiv (-16, 3); + ok ($q == -6); + ok ($r == 2); + ($q, $r) = fdiv (-16, -3); + ok ($q == 5); + ok ($r == -1); +} + +#------------------------------------------------------------------------------ +# GMP::Mpz::fdiv_2exp + +{ my ($q, $r); + ($q, $r) = fdiv_2exp (23, 2); + ok ($q == 5); + ok ($r == 3); + ($q, $r) = fdiv_2exp (-23, 2); + ok ($q == -6); + ok ($r == 1); +} + +#------------------------------------------------------------------------------ +# GMP::Mpz::fib + ok (fib(0) == 0); ok (fib(1) == 1); ok (fib(2) == 1); @@ -538,6 +689,9 @@ ok (fib(4) == 3); ok (fib(5) == 5); ok (fib(6) == 8); +#------------------------------------------------------------------------------ +# GMP::Mpz::fib2 + { my ($a, $b) = fib2(0); ok($a==0); ok($b==1); } { my ($a, $b) = fib2(1); ok($a==1); ok($b==0); } { my ($a, $b) = fib2(2); ok($a==1); ok($b==1); } @@ -546,6 +700,9 @@ ok (fib(6) == 8); { my ($a, $b) = fib2(5); ok($a==5); ok($b==3); } { my ($a, $b) = fib2(6); ok($a==8); ok($b==5); } +#------------------------------------------------------------------------------ +# GMP::Mpz::gcd + ok (gcd (21) == 21); ok (gcd (21,15) == 3); ok (gcd (21,15,30,57) == 3); @@ -553,6 +710,9 @@ ok (gcd (21,-15) == 3); ok (gcd (-21,15) == 3); ok (gcd (-21,-15) == 3); +#------------------------------------------------------------------------------ +# GMP::Mpz::gcdext + { my ($g, $x, $y) = gcdext (3,5); ok ($g == 1); @@ -560,8 +720,14 @@ ok (gcd (-21,-15) == 3); ok ($y == -1); } +#------------------------------------------------------------------------------ +# GMP::Mpz::hamdist + ok (hamdist(5,7) == 1); +#------------------------------------------------------------------------------ +# GMP::Mpz::import + { my $z = mpz_import (1, 2, 1, 0, 'abcd'); ok ($z == 0x61626364); } { my $z = mpz_import (-1, 2, 1, 0, 'abcd'); @@ -571,10 +737,16 @@ ok (hamdist(5,7) == 1); { my $z = mpz_import (-1, 2, -1, 0, 'abcd'); ok ($z == 0x64636261); } +#------------------------------------------------------------------------------ +# GMP::Mpz::invert + ok (invert(1,123) == 1); ok (invert(6,7) == 6); ok (! defined invert(2,8)); +#------------------------------------------------------------------------------ +# GMP::Mpz::jacobi, GMP::Mpz::kronecker + foreach my $i ([ 1, 19, 1 ], [ 4, 19, 1 ], [ 5, 19, 1 ], @@ -606,6 +778,9 @@ foreach my $i ([ 1, 19, 1 ], } } +#------------------------------------------------------------------------------ +# GMP::Mpz::lcm + ok (lcm (2) == 2); ok (lcm (0) == 0); ok (lcm (0,0) == 0); @@ -627,6 +802,9 @@ ok (lcm (mpz(2)**512,-mpz(2)**512) == mpz(2)**512); ok (lcm (-mpz(2)**512,mpz(2)**512) == mpz(2)**512); ok (lcm (-mpz(2)**512,-mpz(2)**512) == mpz(2)**512); +#------------------------------------------------------------------------------ +# GMP::Mpz::lucnum + ok (lucnum(0) == 2); ok (lucnum(1) == 1); ok (lucnum(2) == 3); @@ -635,6 +813,9 @@ ok (lucnum(4) == 7); ok (lucnum(5) == 11); ok (lucnum(6) == 18); +#------------------------------------------------------------------------------ +# GMP::Mpz::lucnum2 + { my ($a, $b) = lucnum2(0); ok($a==2); ok($b==-1); } { my ($a, $b) = lucnum2(1); ok($a==1); ok($b==2); } { my ($a, $b) = lucnum2(2); ok($a==3); ok($b==1); } @@ -643,19 +824,17 @@ ok (lucnum(6) == 18); { my ($a, $b) = lucnum2(5); ok($a==11); ok($b==7); } { my ($a, $b) = lucnum2(6); ok($a==18); ok($b==11); } +#------------------------------------------------------------------------------ +# GMP::Mpz::nextprime + ok (nextprime(2) == 3); ok (nextprime(3) == 5); ok (nextprime(5) == 7); ok (nextprime(7) == 11); ok (nextprime(11) == 13); -ok ( odd_p(mpz(-3))); -ok (! odd_p(mpz(-2))); -ok ( odd_p(mpz(-1))); -ok (! odd_p(mpz(0))); -ok ( odd_p(mpz(1))); -ok (! odd_p(mpz(2))); -ok ( odd_p(mpz(3))); +#------------------------------------------------------------------------------ +# GMP::Mpz::perfect_power_p # ok ( perfect_power_p(mpz(-27))); # ok (! perfect_power_p(mpz(-9))); @@ -669,6 +848,9 @@ ok ( perfect_power_p(mpz(9))); ok ( perfect_power_p(mpz(27))); ok ( perfect_power_p(mpz(81))); +#------------------------------------------------------------------------------ +# GMP::Mpz::perfect_square_p + ok (! perfect_square_p(mpz(-9))); ok (! perfect_square_p(mpz(-1))); ok ( perfect_square_p(mpz(0))); @@ -680,17 +862,30 @@ ok ( perfect_square_p(mpz(9))); ok (! perfect_square_p(mpz(27))); ok ( perfect_square_p(mpz(81))); +#------------------------------------------------------------------------------ +# GMP::Mpz::popcount + ok (popcount(7) == 3); +#------------------------------------------------------------------------------ +# GMP::Mpz::powm + ok (powm (3,2,8) == 1); +#------------------------------------------------------------------------------ +# GMP::Mpz::probab_prime_p + ok ( probab_prime_p(89,1)); ok (! probab_prime_p(81,1)); -{ - my $z = mpz(123); - realloc ($z, 512); -} +#------------------------------------------------------------------------------ +# GMP::Mpz::realloc + +{ my $z = mpz(123); + realloc ($z, 512); } + +#------------------------------------------------------------------------------ +# GMP::Mpz::remove { my ($rem, $mult); @@ -702,12 +897,18 @@ ok (! probab_prime_p(81,1)); ok ($mult == 2); } +#------------------------------------------------------------------------------ +# GMP::Mpz::root + ok (root(0,2) == 0); ok (root(8,3) == 2); ok (root(-8,3) == -2); ok (root(81,4) == 3); ok (root(243,5) == 3); +#------------------------------------------------------------------------------ +# GMP::Mpz::roote + { my ($r,$e); ($r, $e) = roote(0,2); ok ($r == 0); @@ -720,6 +921,9 @@ ok (root(243,5) == 3); ok (! $e); } +#------------------------------------------------------------------------------ +# GMP::Mpz::rootrem + { my ($root, $rem) = rootrem (mpz(0), 1); ok ($root == 0); ok ($rem == 0); } { my ($root, $rem) = rootrem (mpz(0), 2); @@ -731,33 +935,88 @@ ok (root(243,5) == 3); { my ($root, $rem) = rootrem (mpz(65), 3); ok ($root == 4); ok ($rem == 1); } -{ - my $ulong_max = ~ 0; - ok (scan0 (0, 0) == 0); - ok (scan0 (1, 0) == 1); - ok (scan0 (3, 0) == 2); - ok (scan0 (-1, 0) == $ulong_max); - ok (scan0 (-2, 1) == $ulong_max); +#------------------------------------------------------------------------------ +# GMP::Mpz::scan0 + +ok (scan0 (0, 0) == 0); +ok (scan0 (1, 0) == 1); +ok (scan0 (3, 0) == 2); +ok (scan0 (-1, 0) == $ulong_max); +ok (scan0 (-2, 1) == $ulong_max); + +#------------------------------------------------------------------------------ +# GMP::Mpz::scan1 + +ok (scan1 (1, 0) == 0); +ok (scan1 (2, 0) == 1); +ok (scan1 (4, 0) == 2); +ok (scan1 (0, 0) == $ulong_max); +ok (scan1 (3, 2) == $ulong_max); + +#------------------------------------------------------------------------------ +# GMP::Mpz::setbit + +{ my $a = mpz(3); setbit ($a, 1); ok ($a == 3); } +{ my $a = mpz(3); setbit ($a, 2); ok ($a == 7); } + +{ my $a = 3; setbit ($a, 1); ok ($a == 3); } +{ my $a = 3; setbit ($a, 2); ok ($a == 7); } + +# mutate only given variable +{ my $a = mpz(0); + my $b = $a; + setbit ($a, 0); + ok ($a == 1); + ok ($b == 0); +} +{ my $a = 0; + my $b = $a; + setbit ($a, 0); + ok ($a == 1); + ok ($b == 0); +} + +{ tie my $a, 'Mytie', mpz(3); + setbit ($a, 2); + ok ($Mytie::fetched > 0); # used fetch + ok ($Mytie::stored > 0); # used store + ok ($a == 7); # expected result + ok (UNIVERSAL::isa($a,"GMP::Mpz")); + ok (tied($a)); # still tied +} +{ tie my $a, 'Mytie', 3; + setbit ($a, 2); + ok ($Mytie::fetched > 0); # used fetch + ok ($Mytie::stored > 0); # used store + ok ($a == 7); # expected result + ok (UNIVERSAL::isa($a,"GMP::Mpz")); + ok (tied($a)); # still tied +} - ok (scan1 (1, 0) == 0); - ok (scan1 (2, 0) == 1); - ok (scan1 (4, 0) == 2); - ok (scan1 (0, 0) == $ulong_max); - ok (scan1 (3, 2) == $ulong_max); +{ my $b = mpz(2); + tie my $a, 'Mytie', $b; + setbit ($a, 0); + ok ($a == 3); + ok ($b == 2); + ok (tied($a)); +} +{ my $b = 2; + tie my $a, 'Mytie', $b; + setbit ($a, 0); + ok ($a == 3); + ok ($b == 2); + ok (tied($a)); } +#------------------------------------------------------------------------------ +# GMP::Mpz::sizeinbase + ok (sizeinbase(1,10) == 1); ok (sizeinbase(100,10) == 3); ok (sizeinbase(9999,10) == 5); -foreach my $name ('mpz', 'mpf') { - print "$name\n"; - my $mpx = eval("\\&$name"); - ok (sqrt(&$mpx(0)) == 0); - ok (sqrt(&$mpx(1)) == 1); - ok (sqrt(&$mpx(4)) == 2); - ok (sqrt(&$mpx(81)) == 9); -} +#------------------------------------------------------------------------------ +# GMP::Mpz::sqrtrem { my ($root, $rem) = sqrtrem(mpz(0)); @@ -790,13 +1049,87 @@ foreach my $name ('mpz', 'mpf') { ok ($rem == 0); } +#------------------------------------------------------------------------------ +# GMP::Mpz::tdiv + +{ my ($q, $r); + ($q, $r) = tdiv (16, 3); + ok ($q == 5); + ok ($r == 1); + ($q, $r) = tdiv (16, -3); + ok ($q == -5); + ok ($r == 1); + ($q, $r) = tdiv (-16, 3); + ok ($q == -5); + ok ($r == -1); + ($q, $r) = tdiv (-16, -3); + ok ($q == 5); + ok ($r == -1); +} + +#------------------------------------------------------------------------------ +# GMP::Mpz::tdiv_2exp + +{ my ($q, $r); + ($q, $r) = tdiv_2exp (23, 2); + ok ($q == 5); + ok ($r == 3); + ($q, $r) = tdiv_2exp (-23, 2); + ok ($q == -5); + ok ($r == -3); +} + +#------------------------------------------------------------------------------ +# GMP::Mpz::tstbit + ok (tstbit (6, 0) == 0); ok (tstbit (6, 1) == 1); ok (tstbit (6, 2) == 1); ok (tstbit (6, 3) == 0); -# mpq functions + + +#------------------------------------------------------------------------------ +# GMP::Mpq + +#------------------------------------------------------------------------------ +# GMP::Mpq::new + +ok (mpq(0) == 0); +ok (mpq('0') == 0); +ok (mpq(substr('101',1,1)) == 0); +ok (mpq(0.0) == 0); +ok (mpq(mpz(0)) == 0); +ok (mpq(mpq(0)) == 0); +ok (mpq(mpf(0)) == 0); + +{ tie my $t, 'Mytie', 0; ok (mpq($t) == 0); } +{ tie my $t, 'Mytie', '0'; ok (mpq($t) == 0); } +{ tie my $t, 'Mytie', substr('101',1,1); ok (mpq($t) == 0); } +{ tie my $t, 'Mytie', 0.0; ok (mpq($t) == 0); } +{ tie my $t, 'Mytie', mpz(0); ok (mpq($t) == 0); } +{ tie my $t, 'Mytie', mpq(0); ok (mpq($t) == 0); } +{ tie my $t, 'Mytie', mpf(0); ok (mpq($t) == 0); } + +ok (mpq(-123) == -123); +ok (mpq('-123') == -123); +ok (mpq(substr('1-1231',1,4)) == -123); +ok (mpq(-123.0) == -123); +ok (mpq(mpz(-123)) == -123); +ok (mpq(mpq(-123)) == -123); +ok (mpq(mpf(-123)) == -123); + +{ tie my $t, 'Mytie', -123; ok (mpq($t) == -123); } +{ tie my $t, 'Mytie', '-123'; ok (mpq($t) == -123); } +{ tie my $t, 'Mytie', substr('1-1231',1,4); ok (mpq($t) == -123); } +{ tie my $t, 'Mytie', -123.0; ok (mpq($t) == -123); } +{ tie my $t, 'Mytie', mpz(-123); ok (mpq($t) == -123); } +{ tie my $t, 'Mytie', mpq(-123); ok (mpq($t) == -123); } +{ tie my $t, 'Mytie', mpf(-123); ok (mpq($t) == -123); } + +ok (mpq($ivnv_2p128) == $str_2p128); +{ tie my $t, 'Mytie', $ivnv_2p128; ok (mpq($t) == $str_2p128); } ok (mpq('3/2') == mpq(3,2)); ok (mpq('3/1') == mpq(3,1)); @@ -806,30 +1139,278 @@ ok (mpq('0x3') == mpq(3,1)); ok (mpq('0b111') == mpq(7,1)); ok (mpq('0b0') == mpq(0,1)); -ok (mpq(3,2) > 1); -ok (mpq(3,2) < 2); +ok (mpq($uv_max) > 0); +ok (mpq($uv_max) == mpq($uv_max_str)); +{ tie my $t, 'Mytie', $uv_max; ok (mpq($t) > 0); } +{ tie my $t, 'Mytie', $uv_max; ok (mpq($t) == mpq($uv_max_str)); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_abs + +ok (abs(mpq(0)) == 0); +ok (abs(mpq(123)) == 123); +ok (abs(mpq(-123)) == 123); + +{ my $x = mpq(-123); $x = abs($x); ok ($x == 123); } +{ my $x = mpq(0); $x = abs($x); ok ($x == 0); } +{ my $x = mpq(123); $x = abs($x); ok ($x == 123); } + +{ tie my $t, 'Mytie', mpq(0); ok (abs($t) == 0); } +{ tie my $t, 'Mytie', mpq(123); ok (abs($t) == 123); } +{ tie my $t, 'Mytie', mpq(-123); ok (abs($t) == 123); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_add + +ok (mpq(0) + 1 == 1); +ok (mpq(-1) + 1 == 0); +ok (1 + mpq(0) == 1); +ok (1 + mpq(-1) == 0); ok (mpq(1,2)+mpq(1,3) == mpq(5,6)); ok (mpq(1,2)+mpq(-1,3) == mpq(1,6)); ok (mpq(-1,2)+mpq(1,3) == mpq(-1,6)); ok (mpq(-1,2)+mpq(-1,3) == mpq(-5,6)); +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_addeq + +{ my $a = mpq(7); $a += 1; ok ($a == 8); } +{ my $a = mpq(7); my $b = $a; $a += 1; ok ($a == 8); ok ($b == 7); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_bool + +if (mpq(0)) { ok (0); } else { ok (1); } +if (mpq(123)) { ok (1); } else { ok (0); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_dec + +{ my $a = mpq(0); ok ($a-- == 0); ok ($a == -1); } +{ my $a = mpq(0); ok (--$a == -1); } + +{ my $a = mpq(0); my $b = $a; $a--; ok ($a == -1); ok ($b == 0); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_div + +ok (mpq(6) / 2 == 3); +ok (mpq(-6) / 2 == -3); +ok (mpq(6) / -2 == -3); +ok (mpq(-6) / -2 == 3); + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_diveq + +{ my $a = mpq(21); $a /= 3; ok ($a == 7); } +{ my $a = mpq(21); my $b = $a; $a /= 3; ok ($a == 7); ok ($b == 21); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_eq + +{ my $a = mpq(0); + my $b = $a; + $a = mpq(1); + ok ($a == 1); + ok ($b == 0); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_inc + +{ my $a = mpq(0); ok ($a++ == 0); ok ($a == 1); } +{ my $a = mpq(0); ok (++$a == 1); } + +{ my $a = mpq(0); my $b = $a; $a++; ok ($a == 1); ok ($b == 0); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_lshift + +{ my $a = mpq(7) << 1; ok ($a == 14); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_lshifteq + +{ my $a = mpq(7); $a <<= 1; ok ($a == 14); } +{ my $a = mpq(7); my $b = $a; $a <<= 1; ok ($a == 14); ok ($b == 7); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_mul + +ok (mpq(2) * 3 == 6); + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_muleq + +{ my $a = mpq(7); $a *= 3; ok ($a == 21); } +{ my $a = mpq(7); my $b = $a; $a *= 3; ok ($a == 21); ok ($b == 7); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_neg + +ok (- mpq(0) == 0); +ok (- mpq(123) == -123); +ok (- mpq(-123) == 123); + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_not + +if (not mpq(0)) { ok (1); } else { ok (0); } +if (not mpq(123)) { ok (0); } else { ok (1); } + +ok ((! mpq(0)) == 1); +ok ((! mpq(123)) == 0); + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_pow + +ok (mpq(0) ** 1 == 0); +ok (mpq(1) ** 1 == 1); +ok (mpq(2) ** 0 == 1); +ok (mpq(2) ** 1 == 2); +ok (mpq(2) ** 2 == 4); +ok (mpq(2) ** 3 == 8); +ok (mpq(2) ** 4 == 16); + +ok (mpq(0) ** mpq(1) == 0); +ok (mpq(1) ** mpq(1) == 1); +ok (mpq(2) ** mpq(0) == 1); +ok (mpq(2) ** mpq(1) == 2); +ok (mpq(2) ** mpq(2) == 4); +ok (mpq(2) ** mpq(3) == 8); +ok (mpq(2) ** mpq(4) == 16); + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_poweq + +{ my $a = mpq(3); $a **= 4; ok ($a == 81); } +{ my $a = mpq(3); my $b = $a; $a **= 4; ok ($a == 81); ok ($b == 3); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_rshift + +{ my $a = mpq(32) >> 1; ok ($a == 16); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_rshifteq + +{ my $a = mpq(32); $a >>= 1; ok ($a == 16); } +{ my $a = mpq(32); my $b = $a; $a >>= 1; ok ($a == 16); ok ($b == 32); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_spaceship + +ok (mpq(0) < 1); +ok (mpq(0) > -1); + +ok (mpq(0) != 1); +ok (mpq(0) != -1); +ok (mpq(1) != 0); +ok (mpq(1) != -1); +ok (mpq(-1) != 0); +ok (mpq(-1) != 1); + +ok (mpq(3,2) > 1); +ok (mpq(3,2) < 2); + +ok (mpq(0) < 1.0); +ok (mpq(0) < '1'); +ok (mpq(0) < substr('-1',1,1)); +ok (mpq(0) < mpz(1)); +ok (mpq(0) < mpq(1)); +ok (mpq(0) < mpf(1)); +ok (mpq(0) < $uv_max); + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_string + +{ my $x = mpq(0); ok("$x" eq "0"); } +{ my $x = mpq(123); ok("$x" eq "123"); } +{ my $x = mpq(-123); ok("$x" eq "-123"); } + +{ my $q = mpq(5,7); ok("$q" eq "5/7"); } +{ my $q = mpq(-5,7); ok("$q" eq "-5/7"); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_sub + +ok (mpq(0) - 1 == -1); +ok (mpq(1) - 1 == 0); +ok (1 - mpq(0) == 1); +ok (1 - mpq(1) == 0); + ok (mpq(1,2)-mpq(1,3) == mpq(1,6)); ok (mpq(1,2)-mpq(-1,3) == mpq(5,6)); ok (mpq(-1,2)-mpq(1,3) == mpq(-5,6)); ok (mpq(-1,2)-mpq(-1,3) == mpq(-1,6)); -{ - my $q = mpq(21,15); canonicalize($q); +#------------------------------------------------------------------------------ +# GMP::Mpq::overload_subeq + +{ my $a = mpq(7); $a -= 1; ok ($a == 6); } +{ my $a = mpq(7); my $b = $a; $a -= 1; ok ($a == 6); ok ($b == 7); } + +#------------------------------------------------------------------------------ +# GMP::Mpq::canonicalize + +{ my $q = mpq(21,15); canonicalize($q); ok (num($q) == 7); ok (den($q) == 5); } -{ my $q = mpq(5,7); ok("$q" eq "5/7"); } -{ my $q = mpq(-5,7); ok("$q" eq "-5/7"); } +#------------------------------------------------------------------------------ +# GMP::Mpq::den +{ my $q = mpq(5,9); ok (den($q) == 9); } -# mpf functions +#------------------------------------------------------------------------------ +# GMP::Mpq::num + +{ my $q = mpq(5,9); ok (num($q) == 5); } + + + + +#------------------------------------------------------------------------------ +# GMP::Mpf + +#------------------------------------------------------------------------------ +# GMP::Mpf::new + +ok (mpf(0) == 0); +ok (mpf('0') == 0); +ok (mpf(substr('101',1,1)) == 0); +ok (mpf(0.0) == 0); +ok (mpf(mpz(0)) == 0); +ok (mpf(mpq(0)) == 0); +ok (mpf(mpf(0)) == 0); + +{ tie my $t, 'Mytie', 0; ok (mpf($t) == 0); } +{ tie my $t, 'Mytie', '0'; ok (mpf($t) == 0); } +{ tie my $t, 'Mytie', substr('101',1,1); ok (mpf($t) == 0); } +{ tie my $t, 'Mytie', 0.0; ok (mpf($t) == 0); } +{ tie my $t, 'Mytie', mpz(0); ok (mpf($t) == 0); } +{ tie my $t, 'Mytie', mpq(0); ok (mpf($t) == 0); } +{ tie my $t, 'Mytie', mpf(0); ok (mpf($t) == 0); } + +ok (mpf(-123) == -123); +ok (mpf('-123') == -123); +ok (mpf(substr('1-1231',1,4)) == -123); +ok (mpf(-123.0) == -123); +ok (mpf(mpz(-123)) == -123); +ok (mpf(mpq(-123)) == -123); +ok (mpf(mpf(-123)) == -123); + +{ tie my $t, 'Mytie', -123; ok (mpf($t) == -123); } +{ tie my $t, 'Mytie', '-123'; ok (mpf($t) == -123); } +{ tie my $t, 'Mytie', substr('1-1231',1,4); ok (mpf($t) == -123); } +{ tie my $t, 'Mytie', -123.0; ok (mpf($t) == -123); } +{ tie my $t, 'Mytie', mpz(-123); ok (mpf($t) == -123); } +{ tie my $t, 'Mytie', mpq(-123); ok (mpf($t) == -123); } +{ tie my $t, 'Mytie', mpf(-123); ok (mpf($t) == -123); } + +ok (mpf($ivnv_2p128) == $str_2p128); +{ tie my $t, 'Mytie', $ivnv_2p128; ok (mpf($t) == $str_2p128); } ok (mpf(-1.5) == -1.5); ok (mpf(-1.0) == -1.0); @@ -847,48 +1428,295 @@ ok (mpf("0.5") == 0.5); ok (mpf("1.0") == 1.0); ok (mpf("1.5") == 1.5); -{ my $f = mpf(0.25); ok("$f" eq "0.25"); } -{ my $f = mpf(-0.25); ok("$f" eq "-0.25"); } -{ my $f = mpf(1.25); ok("$f" eq "1.25"); } -{ my $f = mpf(-1.25); ok("$f" eq "-1.25"); } -{ my $f = mpf(1000000); ok("$f" eq "1000000"); } -{ my $f = mpf(-1000000); ok("$f" eq "-1000000"); } +ok (mpf($uv_max) > 0); +ok (mpf($uv_max) == mpf($uv_max_str)); +{ tie my $t, 'Mytie', $uv_max; ok (mpf($t) > 0); } +{ tie my $t, 'Mytie', $uv_max; ok (mpf($t) == mpf($uv_max_str)); } + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_abs + +ok (abs(mpf(0)) == 0); +ok (abs(mpf(123)) == 123); +ok (abs(mpf(-123)) == 123); + +{ my $x = mpf(-123); $x = abs($x); ok ($x == 123); } +{ my $x = mpf(0); $x = abs($x); ok ($x == 0); } +{ my $x = mpf(123); $x = abs($x); ok ($x == 123); } + +{ tie my $t, 'Mytie', mpf(0); ok (abs($t) == 0); } +{ tie my $t, 'Mytie', mpf(123); ok (abs($t) == 123); } +{ tie my $t, 'Mytie', mpf(-123); ok (abs($t) == 123); } + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_add + +ok (mpf(0) + 1 == 1); +ok (mpf(-1) + 1 == 0); +ok (1 + mpf(0) == 1); +ok (1 + mpf(-1) == 0); + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_addeq + +{ my $a = mpf(7); $a += 1; ok ($a == 8); } +{ my $a = mpf(7); my $b = $a; $a += 1; ok ($a == 8); ok ($b == 7); } + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_bool + +if (mpf(0)) { ok (0); } else { ok (1); } +if (mpf(123)) { ok (1); } else { ok (0); } + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_dec + +{ my $a = mpf(0); ok ($a-- == 0); ok ($a == -1); } +{ my $a = mpf(0); ok (--$a == -1); } + +{ my $a = mpf(0); my $b = $a; $a--; ok ($a == -1); ok ($b == 0); } + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_div + +ok (mpf(6) / 2 == 3); +ok (mpf(-6) / 2 == -3); +ok (mpf(6) / -2 == -3); +ok (mpf(-6) / -2 == 3); + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_diveq + +{ my $a = mpf(21); $a /= 3; ok ($a == 7); } +{ my $a = mpf(21); my $b = $a; $a /= 3; ok ($a == 7); ok ($b == 21); } + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_eq + +{ my $a = mpf(0); + my $b = $a; + $a = mpf(1); + ok ($a == 1); + ok ($b == 0); } + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_inc + +{ my $a = mpf(0); ok ($a++ == 0); ok ($a == 1); } +{ my $a = mpf(0); ok (++$a == 1); } + +{ my $a = mpf(0); my $b = $a; $a++; ok ($a == 1); ok ($b == 0); } + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_lshift + +{ my $a = mpf(7) << 1; ok ($a == 14); } + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_lshifteq + +{ my $a = mpf(7); $a <<= 1; ok ($a == 14); } +{ my $a = mpf(7); my $b = $a; $a <<= 1; ok ($a == 14); ok ($b == 7); } + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_mul + +ok (mpf(2) * 3 == 6); + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_muleq + +{ my $a = mpf(7); $a *= 3; ok ($a == 21); } +{ my $a = mpf(7); my $b = $a; $a *= 3; ok ($a == 21); ok ($b == 7); } + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_neg + +ok (- mpf(0) == 0); +ok (- mpf(123) == -123); +ok (- mpf(-123) == 123); + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_not + +if (not mpf(0)) { ok (1); } else { ok (0); } +if (not mpf(123)) { ok (0); } else { ok (1); } + +ok ((! mpf(0)) == 1); +ok ((! mpf(123)) == 0); + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_pow + +ok (mpf(0) ** 1 == 0); +ok (mpf(1) ** 1 == 1); +ok (mpf(2) ** 0 == 1); +ok (mpf(2) ** 1 == 2); +ok (mpf(2) ** 2 == 4); +ok (mpf(2) ** 3 == 8); +ok (mpf(2) ** 4 == 16); + +ok (mpf(0) ** mpf(1) == 0); +ok (mpf(1) ** mpf(1) == 1); +ok (mpf(2) ** mpf(0) == 1); +ok (mpf(2) ** mpf(1) == 2); +ok (mpf(2) ** mpf(2) == 4); +ok (mpf(2) ** mpf(3) == 8); +ok (mpf(2) ** mpf(4) == 16); + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_poweq + +{ my $a = mpf(3); $a **= 4; ok ($a == 81); } +{ my $a = mpf(3); my $b = $a; $a **= 4; ok ($a == 81); ok ($b == 3); } + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_rshift + +{ my $a = mpf(32) >> 1; ok ($a == 16); } + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_rshifteq + +{ my $a = mpf(32); $a >>= 1; ok ($a == 16); } +{ my $a = mpf(32); my $b = $a; $a >>= 1; ok ($a == 16); ok ($b == 32); } + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_sqrt + +ok (sqrt(mpf(0)) == 0); +ok (sqrt(mpf(1)) == 1); +ok (sqrt(mpf(4)) == 2); +ok (sqrt(mpf(81)) == 9); + +ok (sqrt(mpf(0.25)) == 0.5); + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_spaceship + +ok (mpf(0) < 1); +ok (mpf(0) > -1); + +ok (mpf(0) != 1); +ok (mpf(0) != -1); +ok (mpf(1) != 0); +ok (mpf(1) != -1); +ok (mpf(-1) != 0); +ok (mpf(-1) != 1); + +ok (mpf(0) < 1.0); +ok (mpf(0) < '1'); +ok (mpf(0) < substr('-1',1,1)); +ok (mpf(0) < mpz(1)); +ok (mpf(0) < mpq(1)); +ok (mpf(0) < mpf(1)); +ok (mpf(0) < $uv_max); + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_string + +{ my $x = mpf(0); ok ("$x" eq "0"); } +{ my $x = mpf(123); ok ("$x" eq "123"); } +{ my $x = mpf(-123); ok ("$x" eq "-123"); } + +{ my $f = mpf(0.25); ok ("$f" eq "0.25"); } +{ my $f = mpf(-0.25); ok ("$f" eq "-0.25"); } +{ my $f = mpf(1.25); ok ("$f" eq "1.25"); } +{ my $f = mpf(-1.25); ok ("$f" eq "-1.25"); } +{ my $f = mpf(1000000); ok ("$f" eq "1000000"); } +{ my $f = mpf(-1000000); ok ("$f" eq "-1000000"); } + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_sub + +ok (mpf(0) - 1 == -1); +ok (mpf(1) - 1 == 0); +ok (1 - mpf(0) == 1); +ok (1 - mpf(1) == 0); + +#------------------------------------------------------------------------------ +# GMP::Mpf::overload_subeq + +{ my $a = mpf(7); $a -= 1; ok ($a == 6); } +{ my $a = mpf(7); my $b = $a; $a -= 1; ok ($a == 6); ok ($b == 7); } + + +#------------------------------------------------------------------------------ +# GMP::Mpf::ceil -ok (floor(mpf(-7.5)) == -8.0); ok (ceil (mpf(-7.5)) == -7.0); -ok (trunc(mpf(-7.5)) == -7.0); -ok (floor(mpf(7.5)) == 7.0); ok (ceil (mpf(7.5)) == 8.0); -ok (trunc(mpf(7.5)) == 7.0); -set_default_prec(128); -ok ( mpf_eq (mpz("0x10000000000000001"), mpz("0x10000000000000002"), 1)); -ok (! mpf_eq (mpz("0x11"), mpz("0x12"), 128)); +#------------------------------------------------------------------------------ +# GMP::Mpf::floor -{ +ok (floor(mpf(-7.5)) == -8.0); +ok (floor(mpf(7.5)) == 7.0); + +#------------------------------------------------------------------------------ +# GMP::Mpf::mpf_eq + +{ my $old_prec = get_default_prec(); set_default_prec(128); - my $p = get_default_prec(); - set_default_prec($p); - ok (get_default_prec() == $p); + + ok ( mpf_eq (mpz("0x10000000000000001"), mpz("0x10000000000000002"), 1)); + ok (! mpf_eq (mpz("0x11"), mpz("0x12"), 128)); + + set_default_prec($old_prec); } +#------------------------------------------------------------------------------ +# GMP::Mpf::get_default_prec + +get_default_prec(); + +#------------------------------------------------------------------------------ +# GMP::Mpf::get_prec + +{ my $x = mpf(1.0, 512); + ok (get_prec ($x) == 512); +} + +#------------------------------------------------------------------------------ +# GMP::Mpf::reldiff + ok (reldiff (2,4) == 1); ok (reldiff (4,2) == 0.5); -{ - my $x = mpf(1.0, 512); +#------------------------------------------------------------------------------ +# GMP::Mpf::set_default_prec + +{ my $old_prec = get_default_prec(); + + set_default_prec(512); + ok (get_default_prec () == 512); + + set_default_prec($old_prec); +} + +#------------------------------------------------------------------------------ +# GMP::Mpf::set_prec + +{ my $x = mpf(1.0, 512); my $y = $x; - my $yprec = get_prec ($y); set_prec ($x, 1024); - ok (get_prec ($y) == $yprec); - - my $xprec = get_prec ($x); - set_prec ($x, $xprec); - ok (get_prec ($x) == $xprec); + ok (get_prec ($x) == 1024); + ok (get_prec ($y) == 512); } +#------------------------------------------------------------------------------ +# GMP::Mpf::trunc + +ok (trunc(mpf(-7.5)) == -7.0); +ok (trunc(mpf(7.5)) == 7.0); + + -# random functions +#------------------------------------------------------------------------------ +# GMP::Rand + +#------------------------------------------------------------------------------ +# GMP::Rand::new { my $r = randstate(); ok (defined $r); } { my $r = randstate('lc_2exp', 1, 2, 3); ok (defined $r); } @@ -907,35 +1735,57 @@ ok (reldiff (4,2) == 0.5); } } +#------------------------------------------------------------------------------ +# GMP::Rand::seed -{ - my $r = randstate(); +{ my $r = randstate(); $r->seed(123); $r->seed(time()); +} - { - my $f = mpf_urandomb($r,1024); - ok (UNIVERSAL::isa($f,"GMP::Mpf")); - } +#------------------------------------------------------------------------------ +# GMP::Rand::mpf_urandomb - { - my $z = mpz_urandomb($r, 1024); - ok (UNIVERSAL::isa($z,"GMP::Mpz")); - } - { - my $z = mpz_rrandomb($r, 1024); - ok (UNIVERSAL::isa($z,"GMP::Mpz")); - } - { - my $z = mpz_urandomm($r, mpz(3)**100); - ok (UNIVERSAL::isa($z,"GMP::Mpz")); - } +{ my $r = randstate(); + my $f = mpf_urandomb($r,1024); + ok (UNIVERSAL::isa($f,"GMP::Mpf")); } + +#------------------------------------------------------------------------------ +# GMP::Rand::mpz_urandomb + +{ my $r = randstate(); + my $z = mpz_urandomb($r, 1024); + ok (UNIVERSAL::isa($z,"GMP::Mpz")); } + +#------------------------------------------------------------------------------ +# GMP::Rand::mpz_rrandomb + +{ my $r = randstate(); + my $z = mpz_rrandomb($r, 1024); + ok (UNIVERSAL::isa($z,"GMP::Mpz")); } + +#------------------------------------------------------------------------------ +# GMP::Rand::mpz_urandomm + +{ my $r = randstate(); + my $z = mpz_urandomm($r, mpz(3)**100); + ok (UNIVERSAL::isa($z,"GMP::Mpz")); } +#------------------------------------------------------------------------------ +# GMP::Rand::mpz_urandomb_ui + +{ my $r = randstate(); foreach (1 .. 20) { my $u = gmp_urandomb_ui($r,8); ok ($u >= 0); ok ($u < 256); } +} + +#------------------------------------------------------------------------------ +# GMP::Rand::mpz_urandomm_ui + +{ my $r = randstate(); foreach (1 .. 20) { my $u = gmp_urandomm_ui($r,8); ok ($u >= 0); @@ -944,6 +1794,331 @@ ok (reldiff (4,2) == 0.5); } + + +#------------------------------------------------------------------------------ +# GMP module + +#------------------------------------------------------------------------------ +# GMP::fits_slong_p + +ok (GMP::fits_slong_p(0)); + +ok (! GMP::fits_slong_p($uv_max)); + +ok (GMP::fits_slong_p(0.0)); + +ok (GMP::fits_slong_p('0')); + +ok (GMP::fits_slong_p(substr('999999999999999999999999999999',1,1))); + +ok (! mpz("-9999999999999999999999999999999999999999999")->fits_slong_p()); +ok ( mpz(-123)->fits_slong_p()); +ok ( mpz(0)->fits_slong_p()); +ok ( mpz(123)->fits_slong_p()); +ok (! mpz("9999999999999999999999999999999999999999999")->fits_slong_p()); + +ok (! mpq("-9999999999999999999999999999999999999999999")->fits_slong_p()); +ok ( mpq(-123)->fits_slong_p()); +ok ( mpq(0)->fits_slong_p()); +ok ( mpq(123)->fits_slong_p()); +ok (! mpq("9999999999999999999999999999999999999999999")->fits_slong_p()); + +ok (! mpf("-9999999999999999999999999999999999999999999")->fits_slong_p()); +ok ( mpf(-123)->fits_slong_p()); +ok ( mpf(0)->fits_slong_p()); +ok ( mpf(123)->fits_slong_p()); +ok (! mpf("9999999999999999999999999999999999999999999")->fits_slong_p()); + +#------------------------------------------------------------------------------ +# GMP::get_d + +ok (GMP::get_d(123) == 123.0); + +ok (GMP::get_d($uv_max) > 0); + +ok (GMP::get_d(123.0) == 123.0); + +ok (GMP::get_d('123') == 123.0); + +ok (GMP::get_d(mpz(123)) == 123.0); + +ok (GMP::get_d(mpq(123)) == 123.0); + +ok (GMP::get_d(mpf(123)) == 123.0); + +#------------------------------------------------------------------------------ +# GMP::get_d_2exp + +{ my ($dbl, $exp) = get_d_2exp (0); + ok ($dbl == 0); ok ($exp == 0); } +{ my ($dbl, $exp) = get_d_2exp (1); + ok ($dbl == 0.5); ok ($exp == 1); } + +{ my ($dbl, $exp) = get_d_2exp ($uv_max); + ok ($dbl > 0.0); ok ($exp > 0); } + +{ my ($dbl, $exp) = get_d_2exp (0.5); + ok ($dbl == 0.5); ok ($exp == 0); } +{ my ($dbl, $exp) = get_d_2exp (0.25); + ok ($dbl == 0.5); ok ($exp == -1); } + +{ my ($dbl, $exp) = get_d_2exp ("1.0"); + ok ($dbl == 0.5); ok ($exp == 1); } + +{ my ($dbl, $exp) = get_d_2exp (mpz ("256")); + ok ($dbl == 0.5); ok ($exp == 9); } + +{ my ($dbl, $exp) = get_d_2exp (mpq ("1/16")); + ok ($dbl == 0.5); ok ($exp == -3); } + +{ my ($dbl, $exp) = get_d_2exp (mpf ("1.5")); + ok ($dbl == 0.75); ok ($exp == 1); } +{ my ($dbl, $exp) = get_d_2exp (mpf ("3.0")); + ok ($dbl == 0.75); ok ($exp == 2); } + +#------------------------------------------------------------------------------ +# GMP::get_str + +ok (get_str(-123) eq '-123'); +ok (get_str('-123') eq '-123'); +ok (get_str(substr('x-123x',1,4)) eq '-123'); +ok (get_str(mpz(-123)) eq '-123'); +ok (get_str(mpq(-123)) eq '-123'); + +ok (get_str(-123,10) eq '-123'); +ok (get_str('-123',10) eq '-123'); +ok (get_str(substr('x-123x',1,4),10) eq '-123'); +ok (get_str(mpz(-123),10) eq '-123'); +ok (get_str(mpq(-123),10) eq '-123'); + +ok (get_str(-123,16) eq '-7b'); +ok (get_str('-123',16) eq '-7b'); +ok (get_str(substr('x-123x',1,4),16) eq '-7b'); +ok (get_str(mpz(-123),16) eq '-7b'); +ok (get_str(mpq(-123),16) eq '-7b'); + +ok (get_str(-123,-16) eq '-7B'); +ok (get_str('-123',-16) eq '-7B'); +ok (get_str(substr('x-123x',1,4),-16) eq '-7B'); +ok (get_str(mpz(-123),-16) eq '-7B'); +ok (get_str(mpq(-123),-16) eq '-7B'); + +# is a float in past versions of perl without UV type +{ my ($str, $exp) = get_str($uv_max); + ok ($str eq $uv_max_str); } + +ok (get_str(mpq(5/8)) eq "5/8"); +ok (get_str(mpq(-5/8)) eq "-5/8"); +ok (get_str(mpq(255/256),16) eq "ff/100"); +ok (get_str(mpq(255/256),-16) eq "FF/100"); +ok (get_str(mpq(-255/256),16) eq "-ff/100"); +ok (get_str(mpq(-255/256),-16) eq "-FF/100"); + +{ my ($s,$e) = get_str(1.5, 10); ok ($s eq '15'); ok ($e == 1); } +{ my ($s,$e) = get_str(mpf(1.5), 10); ok ($s eq '15'); ok ($e == 1); } + +{ my ($s,$e) = get_str(-1.5, 10); ok ($s eq '-15'); ok ($e == 1); } +{ my ($s,$e) = get_str(mpf(-1.5), 10); ok ($s eq '-15'); ok ($e == 1); } + +{ my ($s,$e) = get_str(1.5, 16); ok ($s eq '18'); ok ($e == 1); } +{ my ($s,$e) = get_str(mpf(1.5), 16); ok ($s eq '18'); ok ($e == 1); } + +{ my ($s,$e) = get_str(-1.5, 16); ok ($s eq '-18'); ok ($e == 1); } +{ my ($s,$e) = get_str(mpf(-1.5), 16); ok ($s eq '-18'); ok ($e == 1); } + +{ my ($s,$e) = get_str(65536.0, 16); ok ($s eq '1'); ok ($e == 5); } +{ my ($s,$e) = get_str(mpf(65536.0), 16); ok ($s eq '1'); ok ($e == 5); } + +{ my ($s,$e) = get_str(1.625, 16); ok ($s eq '1a'); ok ($e == 1); } +{ my ($s,$e) = get_str(mpf(1.625), 16); ok ($s eq '1a'); ok ($e == 1); } + +{ my ($s,$e) = get_str(1.625, -16); ok ($s eq '1A'); ok ($e == 1); } +{ my ($s,$e) = get_str(mpf(1.625), -16); ok ($s eq '1A'); ok ($e == 1); } + +{ my ($s, $e) = get_str(255.0,16,0); ok ($s eq "ff"); ok ($e == 2); } +{ my ($s, $e) = get_str(mpf(255.0),16,0); ok ($s eq "ff"); ok ($e == 2); } + +{ my ($s, $e) = get_str(255.0,-16,0); ok ($s eq "FF"); ok ($e == 2); } +{ my ($s, $e) = get_str(mpf(255.0),-16,0); ok ($s eq "FF"); ok ($e == 2); } + +#------------------------------------------------------------------------------ +# GMP::get_si + +ok (GMP::get_si(123) == 123.0); + +# better not assume anything about the relatives sizes of long and UV +ok (GMP::get_si($uv_max) != 0); + +ok (GMP::get_si(123.0) == 123.0); + +ok (GMP::get_si('123') == 123.0); + +ok (GMP::get_si(mpz(123)) == 123.0); + +ok (GMP::get_si(mpq(123)) == 123.0); + +ok (GMP::get_si(mpf(123)) == 123.0); + +#------------------------------------------------------------------------------ +# GMP::integer_p + +ok ( GMP::integer_p (0)); +ok ( GMP::integer_p (123)); +ok ( GMP::integer_p (-123)); + +ok ( GMP::integer_p ($uv_max)); + +ok ( GMP::integer_p (0.0)); +ok ( GMP::integer_p (123.0)); +ok ( GMP::integer_p (-123.0)); +ok (! GMP::integer_p (0.5)); +ok (! GMP::integer_p (123.5)); +ok (! GMP::integer_p (-123.5)); + +ok ( GMP::integer_p ('0')); +ok ( GMP::integer_p ('123')); +ok ( GMP::integer_p ('-123')); +ok (! GMP::integer_p ('0.5')); +ok (! GMP::integer_p ('123.5')); +ok (! GMP::integer_p ('-123.5')); +ok (! GMP::integer_p ('5/8')); + +ok ( GMP::integer_p (mpz(1))); + +ok ( GMP::integer_p (mpq(1))); +ok (! GMP::integer_p (mpq(1,2))); + +ok ( GMP::integer_p (mpf(1.0))); +ok (! GMP::integer_p (mpf(1.5))); + +#------------------------------------------------------------------------------ +# GMP::odd_p + +ok (! odd_p(0)); +ok ( odd_p(1)); +ok (! odd_p(2)); + +ok ( odd_p($uv_max)); + +ok ( odd_p(mpz(-3))); +ok (! odd_p(mpz(-2))); +ok ( odd_p(mpz(-1))); +ok (! odd_p(mpz(0))); +ok ( odd_p(mpz(1))); +ok (! odd_p(mpz(2))); +ok ( odd_p(mpz(3))); + +#------------------------------------------------------------------------------ +# GMP::printf + +GMP::printf ("hello world\n"); + +sub via_printf { + my $s; + open TEMP, ">test.tmp" or die; + GMP::printf TEMP @_; + close TEMP or die; + open TEMP, "<test.tmp" or die; + read (TEMP, $s, 1024); + close TEMP or die; + unlink 'test.tmp'; + return $s; +} + +ok (sprintf ("%d", mpz(123)) eq '123'); +ok (sprintf ("%d %d %d", 456, mpz(123), 789) eq '456 123 789'); +ok (sprintf ("%d", mpq(15,16)) eq '15/16'); +ok (sprintf ("%f", mpf(1.5)) eq '1.500000'); +ok (sprintf ("%.2f", mpf(1.5)) eq '1.50'); + +ok (sprintf ("%*d", 6, 123) eq ' 123'); +ok (sprintf ("%*d", 6, mpz(123)) eq ' 123'); +ok (sprintf ("%*d", 6, mpq(15,16)) eq ' 15/16'); + +ok (sprintf ("%x", 123) eq '7b'); +ok (sprintf ("%x", mpz(123)) eq '7b'); +ok (sprintf ("%X", 123) eq '7B'); +ok (sprintf ("%X", mpz(123)) eq '7B'); +ok (sprintf ("%#x", 123) eq '0x7b'); +ok (sprintf ("%#x", mpz(123)) eq '0x7b'); +ok (sprintf ("%#X", 123) eq '0X7B'); +ok (sprintf ("%#X", mpz(123)) eq '0X7B'); + +ok (sprintf ("%x", mpq(15,16)) eq 'f/10'); +ok (sprintf ("%X", mpq(15,16)) eq 'F/10'); +ok (sprintf ("%#x", mpq(15,16)) eq '0xf/0x10'); +ok (sprintf ("%#X", mpq(15,16)) eq '0XF/0X10'); + +ok (sprintf ("%*.*f", 10, 3, 1.25) eq ' 1.250'); +ok (sprintf ("%*.*f", 10, 3, mpf(1.5)) eq ' 1.500'); + +ok (via_printf ("%d", mpz(123)) eq '123'); +ok (via_printf ("%d %d %d", 456, mpz(123), 789) eq '456 123 789'); +ok (via_printf ("%d", mpq(15,16)) eq '15/16'); +ok (via_printf ("%f", mpf(1.5)) eq '1.500000'); +ok (via_printf ("%.2f", mpf(1.5)) eq '1.50'); + +ok (via_printf ("%*d", 6, 123) eq ' 123'); +ok (via_printf ("%*d", 6, mpz(123)) eq ' 123'); +ok (via_printf ("%*d", 6, mpq(15,16)) eq ' 15/16'); + +ok (via_printf ("%x", 123) eq '7b'); +ok (via_printf ("%x", mpz(123)) eq '7b'); +ok (via_printf ("%X", 123) eq '7B'); +ok (via_printf ("%X", mpz(123)) eq '7B'); +ok (via_printf ("%#x", 123) eq '0x7b'); +ok (via_printf ("%#x", mpz(123)) eq '0x7b'); +ok (via_printf ("%#X", 123) eq '0X7B'); +ok (via_printf ("%#X", mpz(123)) eq '0X7B'); + +ok (via_printf ("%x", mpq(15,16)) eq 'f/10'); +ok (via_printf ("%X", mpq(15,16)) eq 'F/10'); +ok (via_printf ("%#x", mpq(15,16)) eq '0xf/0x10'); +ok (via_printf ("%#X", mpq(15,16)) eq '0XF/0X10'); + +ok (via_printf ("%*.*f", 10, 3, 1.25) eq ' 1.250'); +ok (via_printf ("%*.*f", 10, 3, mpf(1.5)) eq ' 1.500'); + +#------------------------------------------------------------------------------ +# GMP::sgn + +ok (sgn(-123) == -1); +ok (sgn(0) == 0); +ok (sgn(123) == 1); + +ok (sgn($uv_max) == 1); + +ok (sgn(-123.0) == -1); +ok (sgn(0.0) == 0); +ok (sgn(123.0) == 1); + +ok (sgn('-123') == -1); +ok (sgn('0') == 0); +ok (sgn('123') == 1); +ok (sgn('-123.0') == -1); +ok (sgn('0.0') == 0); +ok (sgn('123.0') == 1); + +ok (sgn(substr('x-123x',1,4)) == -1); +ok (sgn(substr('x0x',1,1)) == 0); +ok (sgn(substr('x123x',1,3)) == 1); + +ok (mpz(-123)->sgn() == -1); +ok (mpz(0) ->sgn() == 0); +ok (mpz(123) ->sgn() == 1); + +ok (mpq(-123)->sgn() == -1); +ok (mpq(0) ->sgn() == 0); +ok (mpq(123) ->sgn() == 1); + +ok (mpf(-123)->sgn() == -1); +ok (mpf(0) ->sgn() == 0); +ok (mpf(123) ->sgn() == 1); + + + +#------------------------------------------------------------------------------ # overloaded constants if ($^V > 5.00503) { @@ -953,60 +2128,6 @@ if ($^V > 5.00503) { } -# printf functions - -{ - GMP::printf ("hello world\n"); - - sub via_printf { - my $s; - open TEMP, ">test.tmp" or die; - GMP::printf TEMP @_; - close TEMP or die; - open TEMP, "<test.tmp" or die; - read (TEMP, $s, 1024); - close TEMP or die; - unlink 'test.tmp'; - return $s; - } - - my $z = mpz(123); - my $q = mpq(15,16); - my $f = mpf(1.5); - - foreach my $name ('via_printf', 'sprintf') { - print "$name\n"; - my $mpx = eval("\\&$name"); - - ok (&$mpx ("%d", $z) eq '123'); - ok (&$mpx ("%d %d %d", 456, $z, 789) eq '456 123 789'); - ok (&$mpx ("%d", $q) eq '15/16'); - ok (&$mpx ("%f", $f) eq '1.500000'); - ok (&$mpx ("%.2f", $f) eq '1.50'); - - ok (&$mpx ("%*d", 6, 123) eq ' 123'); - ok (&$mpx ("%*d", 6, $z) eq ' 123'); - ok (&$mpx ("%*d", 6, $q) eq ' 15/16'); - - ok (&$mpx ("%x", 123) eq '7b'); - ok (&$mpx ("%x", $z) eq '7b'); - ok (&$mpx ("%X", 123) eq '7B'); - ok (&$mpx ("%X", $z) eq '7B'); - ok (&$mpx ("%#x", 123) eq '0x7b'); - ok (&$mpx ("%#x", $z) eq '0x7b'); - ok (&$mpx ("%#X", 123) eq '0X7B'); - ok (&$mpx ("%#X", $z) eq '0X7B'); - - ok (&$mpx ("%x", $q) eq 'f/10'); - ok (&$mpx ("%X", $q) eq 'F/10'); - ok (&$mpx ("%#x", $q) eq '0xf/0x10'); - ok (&$mpx ("%#X", $q) eq '0XF/0X10'); - - ok (&$mpx ("%*.*f", 10, 3, 1.25) eq ' 1.250'); - ok (&$mpx ("%*.*f", 10, 3, $f) eq ' 1.500'); - } -} - # Local variables: # perl-indent-level: 2 # End: |