Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it

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