blob: 46bc707cfe6711739c28f4fe8f1d5bc1d5a97aa8 [file] [log] [blame]
Austin Schuhdace2a62020-08-18 10:56:48 -07001# GMP perl module
2
3# Copyright 2001-2004 Free Software Foundation, Inc.
4#
5# This file is part of the GNU MP Library.
6#
7# The GNU MP Library is free software; you can redistribute it and/or modify
8# it under the terms of either:
9#
10# * the GNU Lesser General Public License as published by the Free
11# Software Foundation; either version 3 of the License, or (at your
12# option) any later version.
13#
14# or
15#
16# * the GNU General Public License as published by the Free Software
17# Foundation; either version 2 of the License, or (at your option) any
18# later version.
19#
20# or both in parallel, as here.
21#
22# The GNU MP Library is distributed in the hope that it will be useful, but
23# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
24# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25# for more details.
26#
27# You should have received copies of the GNU General Public License and the
28# GNU Lesser General Public License along with the GNU MP Library. If not,
29# see https://www.gnu.org/licenses/.
30
31# [Note: The above copyright notice is repeated in the documentation section
32# below, in order to get it into man pages etc generated by the various pod
33# conversions. When changing, be sure to update below too.]
34
35
36# This code is designed to work with perl 5.005, so it and the sub-packages
37# aren't as modern as they could be.
38
39package GMP;
40
41require Symbol;
42require Exporter;
43require DynaLoader;
44@ISA = qw(Exporter DynaLoader);
45
46@EXPORT = qw();
47@EXPORT_OK = qw(version);
48%EXPORT_TAGS = ('all' => [qw(
49 get_d get_d_2exp get_si get_str integer_p
50 printf sgn sprintf)],
51 'constants' => [()]);
52Exporter::export_ok_tags('all');
53
54$VERSION = '2.00';
55bootstrap GMP $VERSION;
56
57
58# The format string is cut up into "%" specifiers so GMP types can be
59# passed to GMP::sprintf_internal. Any "*"s are interpolated before
60# calling sprintf_internal, which saves worrying about variable
61# argument lists there.
62#
63# Because sprintf_internal is only called after the conversion and
64# operand have been checked there won't be any crashes from a bad
65# format string.
66#
67sub sprintf {
68 my $fmt = shift;
69 my $out = '';
70 my ($pre, $dummy, $pat, $rest);
71
72 while (($pre, $dummy, $pat, $rest) = ($fmt =~ /^((%%|[^%])*)(%[- +#.*hlLqv\d]*[bcdfeEgGinopsuxX])(.*)$/s)) {
73
74 $out .= $pre;
75
76 my $pat2 = $pat; # $pat with "*"s expanded
77 my @params = (); # arguments per "*"s
78 while ($pat2 =~ /[*]/) {
79 my $arg = shift;
80 $pat2 =~ s/[*]/$arg/;
81 push @params, $arg;
82 }
83
84 if (UNIVERSAL::isa($_[0],"GMP::Mpz")) {
85 if ($pat2 !~ /[dioxX]$/) {
86 die "GMP::sprintf: unsupported output format for mpz: $pat2\n";
87 }
88 $pat2 =~ s/(.)$/Z$1/;
89 $out .= sprintf_internal ($pat2, shift);
90
91 } elsif (UNIVERSAL::isa($_[0],"GMP::Mpq")) {
92 if ($pat2 !~ /[dioxX]$/) {
93 die "GMP::sprintf: unsupported output format for mpq: $pat2\n";
94 }
95 $pat2 =~ s/(.)$/Q$1/;
96 $out .= sprintf_internal ($pat2, shift);
97
98 } elsif (UNIVERSAL::isa($_[0],"GMP::Mpf")) {
99 if ($pat2 !~ /[eEfgG]$/) {
100 die "GMP::sprintf: unsupported output format for mpf: $pat2\n";
101 }
102 $pat2 =~ s/(.)$/F$1/;
103 $out .= sprintf_internal ($pat2, shift);
104
105 } elsif ($pat =~ /n$/) {
106 # do it this way so h, l or V type modifiers are respected, and use a
107 # dummy variable to avoid a warning about discarding the value
108 my $dummy = sprintf "%s$pat", $out, $_[0];
109 shift;
110
111 } else {
112 $out .= sprintf $pat, @params, shift;
113 }
114
115 $fmt = $rest;
116 }
117 $out .= $fmt;
118 return $out;
119}
120
121sub printf {
122 if (ref($_[0]) eq 'GLOB') {
123 my $h = Symbol::qualify_to_ref(shift, caller);
124 print $h GMP::sprintf(@_);
125 } else {
126 print STDOUT GMP::sprintf(@_);
127 }
128}
129
1301;
131__END__
132
133
134
135=head1 NAME
136
137GMP - Perl interface to the GNU Multiple Precision Arithmetic Library
138
139=head1 SYNOPSIS
140
141 use GMP;
142 use GMP::Mpz;
143 use GMP::Mpq;
144 use GMP::Mpf;
145 use GMP::Rand;
146
147=head1 DESCRIPTION
148
149This module provides access to GNU MP arbitrary precision integers,
150rationals and floating point.
151
152No functions are exported from these packages by default, but can be
153selected in the usual way, or the tag :all for everything.
154
155 use GMP::Mpz qw(gcd, lcm); # just these functions
156 use GMP::Mpq qw(:all); # everything in mpq
157
158=head2 GMP::Mpz
159
160This class provides arbitrary precision integers. A new mpz can be
161constructed with C<mpz>. The initial value can be an integer, float,
162string, mpz, mpq or mpf. Floats, mpq and mpf will be automatically
163truncated to an integer.
164
165 use GMP::Mpz qw(:all);
166 my $a = mpz(123);
167 my $b = mpz("0xFFFF");
168 my $c = mpz(1.5); # truncated
169
170The following overloaded operators are available, and corresponding
171assignment forms like C<+=>,
172
173=over 4
174
175=item
176
177+ - * / % E<lt>E<lt> E<gt>E<gt> ** & | ^ ! E<lt> E<lt>= == != E<gt> E<gt>=
178E<lt>=E<gt> abs not sqrt
179
180=back
181
182C</> and C<%> round towards zero (as per the C<tdiv> functions in GMP).
183
184The following functions are available, behaving the same as the
185corresponding GMP mpz functions,
186
187=over 4
188
189=item
190
191bin, cdiv, cdiv_2exp, clrbit, combit, congruent_p, congruent_2exp_p,
192divexact, divisible_p, divisible_2exp_p, even_p, fac, fdiv, fdiv_2exp, fib,
193fib2, gcd, gcdext, hamdist, invert, jacobi, kronecker, lcm, lucnum, lucnum2,
194mod, mpz_export, mpz_import, nextprime, odd_p, perfect_power_p,
195perfect_square_p, popcount, powm, probab_prime_p, realloc, remove, root,
196roote, scan0, scan1, setbit, sizeinbase, sqrtrem, tdiv, tdiv_2exp, tstbit
197
198=back
199
200C<cdiv>, C<fdiv> and C<tdiv> and their C<2exp> variants return a
201quotient/remainder pair. C<fib2> returns a pair F[n] and F[n-1], similarly
202C<lucnum2>. C<gcd> and C<lcm> accept a variable number of arguments (one or
203more). C<gcdext> returns a triplet of gcd and two cofactors, for example
204
205 use GMP::Mpz qw(:all);
206 $a = 7257;
207 $b = 10701;
208 ($g, $x, $y) = gcdext ($a, $b);
209 print "gcd($a,$b) is $g, and $g == $a*$x + $b*$y\n";
210
211C<mpz_import> and C<mpz_export> are so named to avoid the C<import> keyword.
212Their parameters are as follows,
213
214 $z = mpz_import ($order, $size, $endian, $nails, $string);
215 $string = mpz_export ($order, $size, $endian, $nails, $z);
216
217The order, size, endian and nails parameters are as per the corresponding C
218functions. The string input for C<mpz_import> is interpreted as byte data
219and must be a multiple of $size bytes. C<mpz_export> conversely returns a
220string of byte data, which will be a multiple of $size bytes.
221
222C<invert> returns the inverse, or undef if it doesn't exist. C<remove>
223returns a remainder/multiplicity pair. C<root> returns the nth root, and
224C<roote> returns a root/bool pair, the bool indicating whether the root is
225exact. C<sqrtrem> and C<rootrem> return a root/remainder pair.
226
227C<clrbit>, C<combit> and C<setbit> expect a variable which they can modify,
228it doesn't make sense to pass a literal constant. Only the given variable
229is modified, if other variables are referencing the same mpz object then a
230new copy is made of it. If the variable isn't an mpz it will be coerced to
231one. For instance,
232
233 use GMP::Mpz qw(setbit);
234 setbit (123, 0); # wrong, don't pass a constant
235 $a = mpz(6);
236 $b = $a;
237 setbit ($a, 0); # $a becomes 7, $b stays at 6
238
239C<scan0> and C<scan1> return ~0 if no 0 or 1 bit respectively is found.
240
241=head2 GMP::Mpq
242
243This class provides rationals with arbitrary precision numerators and
244denominators. A new mpq can be constructed with C<mpq>. The initial value
245can be an integer, float, string, mpz, mpq or mpf, or a pair of integers or
246mpz's. No precision is lost when converting a float or mpf, the exact value
247is retained.
248
249 use GMP::Mpq qw(:all);
250 $a = mpq(); # zero
251 $b = mpq(0.5); # gives 1/2
252 $b = mpq(14); # integer 14
253 $b = mpq(3,4); # fraction 3/4
254 $b = mpq("7/12"); # fraction 7/12
255 $b = mpq("0xFF/0x100"); # fraction 255/256
256
257When a fraction is given, it should be in the canonical form specified in
258the GMP manual, which is denominator positive, no common factors, and zero
259always represented as 0/1. If not then C<canonicalize> can be called to put
260it in that form. For example,
261
262 use GMP::Mpq qw(:all);
263 $q = mpq(21,15); # eek! common factor 3
264 canonicalize($q); # get rid of it
265
266The following overloaded operators are available, and corresponding
267assignment forms like C<+=>,
268
269=over 4
270
271=item
272
273+ - * / E<lt>E<lt> E<gt>E<gt> ** ! E<lt> E<lt>= == != E<gt> E<gt>=
274E<lt>=E<gt> abs not
275
276=back
277
278The following functions are available,
279
280=over 4
281
282=item
283
284den, inv, num
285
286=back
287
288C<inv> calculates 1/q, as per the corresponding GMP function. C<num> and
289C<den> return an mpz copy of the numerator or denominator respectively. In
290the future C<num> and C<den> might give lvalues so the original mpq can be
291modified through them, but this is not done currently.
292
293=head2 GMP::Mpf
294
295This class provides arbitrary precision floating point numbers. The
296mantissa is an arbitrary user-selected precision and the exponent is a fixed
297size (one machine word).
298
299A new mpf can be constructed with C<mpf>. The initial value can be an
300integer, float, string, mpz, mpq or mpf. The second argument specifies the
301desired precision in bits, or if omitted then the default precision is used.
302
303 use GMP::Mpf qw(:all);
304 $a = mpf(); # zero
305 $b = mpf(-7.5); # default precision
306 $c = mpf(1.5, 500); # 500 bits precision
307 $d = mpf("1.0000000000000001");
308
309The following overloaded operators are available, with the corresponding
310assignment forms like C<+=>,
311
312=over 4
313
314=item
315
316+ - * / E<lt>E<lt> E<gt>E<gt> ** ! E<lt> E<lt>= == != E<gt> E<gt>=
317E<lt>=E<gt> abs not sqrt
318
319=back
320
321The following functions are available, behaving the same as the
322corresponding GMP mpf functions,
323
324=over 4
325
326=item
327
328ceil, floor, get_default_prec, get_prec, mpf_eq, set_default_prec, set_prec,
329trunc
330
331=back
332
333C<mpf_eq> is so named to avoid clashing with the perl C<eq> operator.
334
335C<set_prec> expects a variable which it can modify, it doesn't make sense to
336pass a literal constant. Only the given variable is modified, if other
337variables are referencing the same mpf object then a new copy is made of it.
338If the variable isn't an mpf it will be coerced to one.
339
340Results are the same precision as inputs, or if two mpf's are given to a
341binary operator then the precision of the first is used. For example,
342
343 use GMP::Mpf qw(mpf);
344 $a = mpf(2.0, 100);
345 $b = mpf(2.0, 500);
346 $c = $a + $b; # gives 100 bits precision
347
348Mpf to string conversion via "" or the usual string contexts uses C<$#> the
349same as normal float to string conversions, or defaults to C<%.g> if C<$#>
350is not defined. C<%.g> means all significant digits in the selected
351precision.
352
353=head2 GMP class
354
355The following functions are available in the GMP class,
356
357=over 4
358
359=item
360
361fits_slong_p, get_d, get_d_2exp, get_si, get_str, integer_p, printf, sgn,
362sprintf, version
363
364=back
365
366C<get_d_2exp> accepts any integer, string, float, mpz, mpq or mpf operands
367and returns a float and an integer exponent,
368
369 ($dbl, $exp) = get_d_2exp (mpf ("3.0"));
370 # dbl is 0.75, exp is 2
371
372C<get_str> takes an optional second argument which is the base, defaulting
373to decimal. A negative base means upper case, as per the C functions. For
374integer, integer string, mpz or mpq operands a string is returned.
375
376 use GMP qw(:all);
377 use GMP::Mpq qw(:all);
378 print get_str(mpq(-5,8)),"\n"; # -5/8
379 print get_str(255,16),"\n"; # ff
380
381For float, float strings or mpf operands, C<get_str> accepts an optional
382third parameter being how many digits to produce, defaulting to 0 which
383means all digits. (Only as many digits as can be accurately represented by
384the float precision are ever produced though.) A string/exponent pair is
385returned, as per the C mpf_get_str function. For example,
386
387 use GMP qw(:all);
388 use GMP::Mpf qw(:all);
389 ($s, $e) = get_str(111.111111111, 10, 4);
390 printf ".$se$e\n"; # .1111e3
391 ($s, $e) = get_str(1.625, 10);
392 print "0.$s*10^$e\n"; # 0.1625*10^1
393 ($s, $e) = get_str(mpf(2)**20, 16);
394 printf ".%s@%x\n", $s, $e; # .1@14
395
396C<printf> and C<sprintf> allow formatted output of GMP types. mpz and mpq
397values can be used with integer conversions (d, o, x, X) and mpf with float
398conversions (f, e, E, g, G). All the standard perl printf features are
399available too. For example,
400
401 use GMP::Mpz qw(mpz);
402 use GMP::Mpf qw(mpf);
403 GMP::printf ("%d %d %s", 123, mpz(2)**128, 'foo');
404 GMP::printf STDERR "%.40f", mpf(1.234);
405
406In perl 5.6.1 it doesn't seem to work to export C<printf>, the plain builtin
407C<printf> is reached unless calls are C<&printf()> style. Explicit use of
408C<GMP::printf> is suggested. C<sprintf> doesn't suffer this problem.
409
410 use GMP qw(sprintf);
411 use GMP::Mpq qw(mpq);
412 $s = sprintf "%x", mpq(15,16);
413
414C<version> is not exported by default or by tag :all, calling it as
415C<GMP::version()> is recommended. It returns the GMP library version
416string, which is not to be confused with the module version number.
417
418The other GMP module functions behave as per the corresponding GMP routines,
419and accept any integer, string, float, mpz, mpq or mpf. For example,
420
421 use GMP qw(:all);
422 use GMP::Mpz qw(mpz);
423 $z = mpz(123);
424 print sgn($z); # gives 1
425
426Because each of GMP::Mpz, GMP::Mpq and GMP::Mpf is a sub-class of GMP,
427C<-E<gt>> style calls work too.
428
429 use GMP qw(:all);
430 use GMP::Mpq qw(mpf);
431 $q = mpq(-5,7);
432 if ($q->integer_p()) # false
433 ...
434
435=head2 GMP::Rand
436
437This class provides objects holding an algorithm and state for random number
438generation. C<randstate> creates a new object, for example,
439
440 use GMP::Rand qw(randstate);
441 $r = randstate();
442 $r = randstate('lc_2exp_size', 64);
443 $r = randstate('lc_2exp', 43840821, 1, 32);
444 $r = randstate('mt');
445 $r = randstate($another_r);
446
447With no parameters this corresponds to the C function
448C<gmp_randinit_default>, and is a compromise between speed and randomness.
449'lc_2exp_size' corresponds to C<gmp_randinit_lc_2exp_size>, 'lc_2exp'
450corresponds to C<gmp_randinit_lc_2exp>, and 'mt' corresponds to
451C<gmp_randinit_mt>. Or when passed another randstate object, a copy of that
452object is made.
453
454'lc_2exp_size' can fail if the requested size is bigger than the internal
455table provides for, in which case undef is returned. The maximum size
456currently supported is 128. The other forms always succeed.
457
458A randstate can be seeded with an integer or mpz, using the C<seed> method.
459/dev/random might be a good source of randomness, or time() or
460Time::HiRes::time() might be adequate, depending on the application.
461
462 $r->seed(time()));
463
464Random numbers can be generated with the following functions,
465
466=over 4
467
468=item
469
470mpf_urandomb, mpz_rrandomb, mpz_urandomb, mpz_urandomm,
471gmp_urandomb_ui, gmp_urandomm_ui
472
473=back
474
475Each constructs a new mpz or mpf and with a distribution per the
476corresponding GMP function. For example,
477
478 use GMP::Rand (:all);
479 $r = randstate();
480 $a = mpz_urandomb($r,256); # uniform mpz, 256 bits
481 $b = mpz_urandomm($r,mpz(3)**100); # uniform mpz, 0 to 3**100-1
482 $c = mpz_rrandomb($r,1024); # special mpz, 1024 bits
483 $f = mpf_urandomb($r,128); # uniform mpf, 128 bits, 0<=$f<1
484 $f = gmp_urandomm_ui($r,56); # uniform int, 0 to 55
485
486=head2 Coercion
487
488Arguments to operators and functions are converted as necessary to the
489appropriate type. For instance C<**> requires an unsigned integer exponent,
490and an mpq argument will be converted, so long as it's an integer in the
491appropriate range.
492
493 use GMP::Mpz (mpz);
494 use GMP::Mpq (mpq);
495 $p = mpz(3) ** mpq(45); # allowed, 45 is an integer
496
497It's an error if a conversion to an integer or mpz would cause any
498truncation. For example,
499
500 use GMP::Mpz (mpz);
501 $p = mpz(3) + 1.25; # not allowed
502 $p = mpz(3) + mpz(1.25); # allowed, explicit truncation
503
504Comparisons, however, accept any combination of operands and are always done
505exactly. For example,
506
507 use GMP::Mpz (mpz);
508 print mpz(3) < 3.1; # true
509
510Variables used on the left of an assignment operator like C<+=> are subject
511to coercion too. An integer, float or string will change type when an mpz,
512mpq or mpf is applied to it. For example,
513
514 use GMP::Mpz (mpz);
515 $a = 1;
516 $a += mpz(1234); # $a becomes an mpz
517
518=head2 Overloading
519
520The rule for binary operators in the C<overload> mechanism is that if both
521operands are class objects then the method from the first is used. This
522determines the result type when mixing GMP classes. For example,
523
524 use GMP::Mpz (mpz);
525 use GMP::Mpq (mpq);
526 use GMP::Mpf (mpf);
527 $z = mpz(123);
528 $q = mpq(3,2);
529 $f = mpf(1.375)
530 print $q+$f; # gives an mpq
531 print $f+$z; # gives an mpf
532 print $z+$f; # not allowed, would lose precision
533
534=head2 Constants
535
536A special tag C<:constants> is recognised in the module exports list. It
537doesn't select any functions, but indicates that perl constants should be
538GMP objects. This can only be used on one of GMP::Mpz, GMP::Mpq or GMP::Mpf
539at any one time, since they apply different rules.
540
541GMP::Mpz will treat constants as mpz's if they're integers, or ordinary
542floats if not. For example,
543
544 use GMP::Mpz qw(:constants);
545 print 764861287634126387126378128,"\n"; # an mpz
546 print 1.25,"\n"; # a float
547
548GMP::Mpq is similar, treating integers as mpq's and leaving floats to the
549normal perl handling. Something like 3/4 is read as two integer mpq's and a
550division, but that's fine since it gives the intended fraction.
551
552 use GMP::Mpq qw(:constants);
553 print 3/4,"\n"; # an mpq
554 print 1.25,"\n"; # a float
555
556GMP::Mpf will treat all constants as mpf's using the default precision.
557BEGIN blocks can be used to set that precision while the code is parsed.
558For example,
559
560 use GMP::Mpf qw(:constants);
561 BEGIN { GMP::Mpf::set_default_prec(256); }
562 print 1/3;
563 BEGIN { GMP::Mpf::set_default_prec(64); }
564 print 5/7;
565
566A similar special tag :noconstants is recognised to turn off the constants
567feature. For example,
568
569 use GMP::Mpz qw(:constants);
570 print 438249738748174928193,"\n"; # an mpz
571 use GMP::Mpz qw(:noconstants);
572 print 438249738748174928193,"\n"; # now a float
573
574All three 'integer', 'binary' and 'float' constant methods are captured.
575'float' is captured even for GMP::Mpz and GMP::Mpq since perl by default
576treats integer strings as floats if they don't fit a plain integer.
577
578=head1 SEE ALSO
579
580GMP manual, L<perl>, L<overload>.
581
582=head1 BUGS
583
584In perl 5.005_03 on i386 FreeBSD, the overloaded constants sometimes provoke
585seg faults. Don't know if that's a perl bug or a GMP module bug, though it
586does seem to go bad before reaching anything in GMP.xs.
587
588There's no way to specify an arbitrary base when converting a string to an
589mpz (or mpq or mpf), only hex or octal with 0x or 0 (for mpz and mpq, but
590not for mpf).
591
592These modules are not reentrant or thread safe, due to the implementation of
593the XSUBs.
594
595Returning a new object from the various functions is convenient, but
596assignment versions could avoid creating new objects. Perhaps they could be
597named after the C language functions, eg. mpq_inv($q,$q);
598
599It'd be good if C<num> and C<den> gave lvalues so the underlying mpq could
600be manipulated.
601
602C<printf> could usefully accept %b for mpz, mpq and mpf, and perhaps %x for
603mpf too.
604
605C<get_str> returning different style values for integer versus float is a
606bit unfortunate. With mpz, mpq and mpf objects there's no doubt what it
607will do, but on a plain scalar its action depends on whether the scalar was
608promoted to a float at any stage, and then on the GMP module rules about
609using the integer or float part.
610
611=head1 INTERNALS
612
613In usual perl object style, an mpz is a reference to an object blessed into
614class C<GMP::Mpz>. The object holds a pointer to the C language C<mpz_t>
615structure. Similarly for mpq, mpf and randstate.
616
617A free list of mpz and mpq values is kept to avoid repeated initializing and
618clearing when objects are created and destroyed. This aims to help speed,
619but it's not clear whether it's really needed.
620
621mpf doesn't use a free list because the precision of new objects can be
622different each time.
623
624No interface to C<mpf_set_prec_raw> is provided. It wouldn't be very useful
625since there's no way to make an operation store its result in a particular
626object. The plain C<set_prec> is useful though, for truncating to a lower
627precision, or as a sort of directive that subsequent calculations involving
628that variable should use a higher precision.
629
630The overheads of perl dynamic typing (operator dispatch, operand type
631checking or coercion) will mean this interface is slower than using C
632directly.
633
634Some assertion checking is available as a compile-time option.
635
636=head1 COPYRIGHT
637
638Copyright 2001-2004 Free Software Foundation, Inc.
639
640This file is part of the GNU MP Library.
641
642The GNU MP Library is free software; you can redistribute it and/or modify
643it under the terms of either:
644
645 * the GNU Lesser General Public License as published by the Free
646 Software Foundation; either version 3 of the License, or (at your
647 option) any later version.
648
649or
650
651 * the GNU General Public License as published by the Free Software
652 Foundation; either version 2 of the License, or (at your option) any
653 later version.
654
655or both in parallel, as here.
656
657The GNU MP Library is distributed in the hope that it will be useful, but
658WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
659or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
660for more details.
661
662You should have received copies of the GNU General Public License and the
663GNU Lesser General Public License along with the GNU MP Library. If not,
664see https://www.gnu.org/licenses/.
665
666=cut
667
668# Local variables:
669# perl-indent-level: 2
670# fill-column: 76
671# End: