[BACK]Return to GMP.pm CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gmp / demos / perl

Annotation of OpenXM_contrib/gmp/demos/perl/GMP.pm, Revision 1.1.1.1

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>