Math::BigRat - Arbitrary big rational numbers
Math::BigRat complements Math::BigInt and Math::BigFloat by providing support for arbitrary big rational numbers.
You can change the underlying module that does the low-level math operations by using:
- use Math::BigRat try => 'GMP';
Note: This needs Math::BigInt::GMP installed.
The following would first try to find Math::BigInt::Foo, then Math::BigInt::Bar, and when this also fails, revert to Math::BigInt::Calc:
- use Math::BigRat try => 'Foo,Math::BigInt::Bar';
If you want to get warned when the fallback occurs, replace "try" with "lib":
- use Math::BigRat lib => 'Foo,Math::BigInt::Bar';
If you want the code to die instead, replace "try" with "only":
- use Math::BigRat only => 'Foo,Math::BigInt::Bar';
Any methods not listed here are derived from Math::BigFloat (or Math::BigInt), so make sure you check these two modules for further information.
- $x = Math::BigRat->new('1/3');
Create a new Math::BigRat object. Input can come in various forms:
- $x = Math::BigRat->new(123); # scalars
- $x = Math::BigRat->new('inf'); # infinity
- $x = Math::BigRat->new('123.3'); # float
- $x = Math::BigRat->new('1/3'); # simple string
- $x = Math::BigRat->new('1 / 3'); # spaced
- $x = Math::BigRat->new('1 / 0.1'); # w/ floats
- $x = Math::BigRat->new(Math::BigInt->new(3)); # BigInt
- $x = Math::BigRat->new(Math::BigFloat->new('3.1')); # BigFloat
- $x = Math::BigRat->new(Math::BigInt::Lite->new('2')); # BigLite
- # You can also give D and N as different objects:
- $x = Math::BigRat->new(
- Math::BigInt->new(-123),
- Math::BigInt->new(7),
- ); # => -123/7
- $n = $x->numerator();
Returns a copy of the numerator (the part above the line) as signed BigInt.
- $d = $x->denominator();
Returns a copy of the denominator (the part under the line) as positive BigInt.
- ($n, $d) = $x->parts();
Return a list consisting of (signed) numerator and (unsigned) denominator as BigInts.
- my $y = $x->numify();
Returns the object as a scalar. This will lose some data if the object cannot be represented by a normal Perl scalar (integer or float), so use as_int() or as_float() instead.
This routine is automatically used whenever a scalar is required:
- my $x = Math::BigRat->new('3/1');
- @array = (0, 1, 2, 3);
- $y = $array[$x]; # set $y to 3
- $x = Math::BigRat->new('13/7');
- print $x->as_int(), "\n"; # '1'
Returns a copy of the object as BigInt, truncated to an integer.
as_number()
is an alias for as_int()
.
Returns a copy of the object as BigFloat, preserving the accuracy as wanted, or the default of 40 digits.
This method was added in v0.22 of Math::BigRat (April 2008).
- $x = Math::BigRat->new('13');
- print $x->as_hex(), "\n"; # '0xd'
Returns the BigRat as hexadecimal string. Works only for integers.
- $x = Math::BigRat->new('13');
- print $x->as_bin(), "\n"; # '0x1101'
Returns the BigRat as binary string. Works only for integers.
- $x = Math::BigRat->new('13');
- print $x->as_oct(), "\n"; # '015'
Returns the BigRat as octal string. Works only for integers.
- my $h = Math::BigRat->from_hex('0x10');
Create a BigRat from a hexadecimal number in string form.
- my $o = Math::BigRat->from_oct('020');
Create a BigRat from an octal number in string form.
- my $b = Math::BigRat->from_bin('0b10000000');
Create a BigRat from an binary number in string form.
- $x = Math::BigRat->bnan();
Creates a new BigRat object representing NaN (Not A Number). If used on an object, it will set it to NaN:
- $x->bnan();
- $x = Math::BigRat->bzero();
Creates a new BigRat object representing zero. If used on an object, it will set it to zero:
- $x->bzero();
- $x = Math::BigRat->binf($sign);
Creates a new BigRat object representing infinity. The optional argument is either '-' or '+', indicating whether you want infinity or minus infinity. If used on an object, it will set it to infinity:
- $x->binf();
- $x->binf('-');
- $x = Math::BigRat->bone($sign);
Creates a new BigRat object representing one. The optional argument is either '-' or '+', indicating whether you want one or minus one. If used on an object, it will set it to one:
- $x->bone(); # +1
- $x->bone('-'); # -1
- $len = $x->length();
Return the length of $x in digits for integer values.
Return the N'ths digit from X when X is an integer value.
- $x->bnorm();
Reduce the number to the shortest form. This routine is called automatically whenever it is needed.
- $x->bfac();
Calculates the factorial of $x. For instance:
Works currently only for integers.
Are not yet implemented.
- $x->bmod($y);
Returns $x modulo $y. When $x is finite, and $y is finite and non-zero, the result is identical to the remainder after floored division (F-division). If, in addition, both $x and $y are integers, the result is identical to the result from Perl's % operator.
- $x->bmodinv($mod); # modular multiplicative inverse
Returns the multiplicative inverse of $x
modulo $mod
. If
- $y = $x -> copy() -> bmodinv($mod)
then $y
is the number closest to zero, and with the same sign as $mod
,
satisfying
- ($x * $y) % $mod = 1 % $mod
If $x
and $y
are non-zero, they must be relative primes, i.e.,
bgcd($y, $mod)==1
. 'NaN
' is returned when no modular multiplicative
inverse exists.
- $num->bmodpow($exp,$mod); # modular exponentiation
- # ($num**$exp % $mod)
Returns the value of $num
taken to the power $exp
in the modulus
$mod
using binary exponentiation. bmodpow
is far superior to
writing
- $num ** $exp % $mod
because it is much faster - it reduces internal variables into the modulus whenever possible, so it operates on smaller numbers.
bmodpow
also supports negative exponents.
- bmodpow($num, -1, $mod)
is exactly equivalent to
- bmodinv($num, $mod)
- $x->bneg();
Used to negate the object in-place.
Return true if $x is exactly one, otherwise false.
Return true if $x is exactly zero, otherwise false.
Return true if $x is positive (greater than or equal to zero), otherwise false. Please note that '+inf' is also positive, while 'NaN' and '-inf' aren't.
is_positive()
is an alias for is_pos()
.
Return true if $x is negative (smaller than zero), otherwise false. Please note that '-inf' is also negative, while 'NaN' and '+inf' aren't.
is_negative()
is an alias for is_neg()
.
Return true if $x has a denominator of 1 (e.g. no fraction parts), otherwise false. Please note that '-inf', 'inf' and 'NaN' aren't integer.
Return true if $x is odd, otherwise false.
Return true if $x is even, otherwise false.
- $x->bceil();
Set $x to the next bigger integer value (e.g. truncate the number to integer and then increment it by one).
- $x->bfloor();
Truncate $x to an integer value.
- $x->bint();
Round $x towards zero.
- $x->bsqrt();
Calculate the square root of $x.
- $x->broot($n);
Calculate the N'th root of $x.
- $x->badd($y);
Adds $y to $x and returns the result.
- $x->bmul($y);
Multiplies $y to $x and returns the result.
- $x->bsub($y);
Subtracts $y from $x and returns the result.
- $q = $x->bdiv($y);
- ($q, $r) = $x->bdiv($y);
In scalar context, divides $x by $y and returns the result. In list context,
does floored division (F-division), returning an integer $q and a remainder $r
so that $x = $q * $y + $r. The remainer (modulo) is equal to what is returned
by $x-
bmod($y)>.
- $x->bdec();
Decrements $x by 1 and returns the result.
- $x->binc();
Increments $x by 1 and returns the result.
- my $z = $x->copy();
Makes a deep copy of the object.
Please see the documentation in Math::BigInt for further details.
Return a string representing this object.
- $x->bcmp($y);
Compares $x with $y and takes the sign into account. Returns -1, 0, 1 or undef.
- $x->bacmp($y);
Compares $x with $y while ignoring their sign. Returns -1, 0, 1 or undef.
- $x -> beq($y);
Returns true if and only if $x is equal to $y, and false otherwise.
- $x -> bne($y);
Returns true if and only if $x is not equal to $y, and false otherwise.
- $x -> blt($y);
Returns true if and only if $x is equal to $y, and false otherwise.
- $x -> ble($y);
Returns true if and only if $x is less than or equal to $y, and false otherwise.
- $x -> bgt($y);
Returns true if and only if $x is greater than $y, and false otherwise.
- $x -> bge($y);
Returns true if and only if $x is greater than or equal to $y, and false otherwise.
Used to shift numbers left/right.
Please see the documentation in Math::BigInt for further details.
- $x->band($y); # bitwise and
- $x->bior($y); # bitwise inclusive or
- $x->bxor($y); # bitwise exclusive or
- $x->bnot(); # bitwise not (two's complement)
- $x->bpow($y);
Compute $x ** $y.
Please see the documentation in Math::BigInt for further details.
- $x->blog($base, $accuracy); # logarithm of x to the base $base
If $base
is not defined, Euler's number (e) is used:
- $x->bexp($accuracy); # calculate e ** X
Calculates two integers A and B so that A/B is equal to e ** $x
, where e
is
Euler's number.
This method was added in v0.20 of Math::BigRat (May 2007).
See also blog()
.
- $x->bnok($y); # x over y (binomial coefficient n over k)
Calculates the binomial coefficient n over k, also called the "choose" function. The result is equivalent to:
- ( n ) n!
- | - | = -------
- ( k ) k!(n-k)!
This method was added in v0.20 of Math::BigRat (May 2007).
Returns a hash containing the configuration, e.g. the version number, lib loaded etc. The following hash keys are currently filled in with the appropriate information.
- key RO/RW Description
- Example
- ============================================================
- lib RO Name of the Math library
- Math::BigInt::Calc
- lib_version RO Version of 'lib'
- 0.30
- class RO The class of config you just called
- Math::BigRat
- version RO version number of the class you used
- 0.10
- upgrade RW To which class numbers are upgraded
- undef
- downgrade RW To which class numbers are downgraded
- undef
- precision RW Global precision
- undef
- accuracy RW Global accuracy
- undef
- round_mode RW Global round mode
- even
- div_scale RW Fallback accuracy for div
- 40
- trap_nan RW Trap creation of NaN (undef = no)
- undef
- trap_inf RW Trap creation of +inf/-inf (undef = no)
- undef
By passing a reference to a hash you may set the configuration values. This
works only for values that a marked with a RW
above, anything else is
read-only.
Please report any bugs or feature requests to
bug-math-bigrat at rt.cpan.org
, or through the web interface at
https://rt.cpan.org/Ticket/Create.html?Queue=Math-BigRat
(requires login).
We will be notified, and then you'll automatically be notified of progress on
your bug as I make changes.
You can find documentation for this module with the perldoc command.
- perldoc Math::BigRat
You can also look for information at:
https://rt.cpan.org/Public/Dist/Display.html?Name=Math-BigRat
This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself.
bigrat, Math::BigFloat and Math::BigInt as well as the backends Math::BigInt::FastCalc, Math::BigInt::GMP, and Math::BigInt::Pari.
Tels http://bloodgate.com/ 2001-2009.
Maintained by Peter John Acklam <pjacklam@online.no> 2011-