xref: /netbsd-src/external/lgpl3/gmp/dist/demos/perl/test.pl (revision 2b3d1ee8a773e028429b331332895d44f445d720)
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