Perhaps some one can find useful this function to compute the modular inverse of a integer (extended euclidean algorithm):
function invmod($a,$b) {
$n=$b;
$x=0; $lx=1; $y=1; $ly=0;
while ($b) {
$t=$b;
$q=bcdiv($a,$b,0);
$b=bcmod($a,$b);
$a=$t;
$t=$x; $x=bcsub($lx,bcmod(bcmul($q,$x),$n)); $lx=$t;
$t=$y; $y=bcsub($ly,bcmod(bcmul($q,$y),$n)); $ly=$t;
}
if (bccomp($lx,0) == -1)
$lx=bcadd($lx,$n);
return $lx;
}
// verify
$n="2447995268898324993537772139997802321";
$t="64941057316178801556773346239351236811";
$m="123456789";
$i=invmod($t,$n);
// (t*m)*inv(t) is m
echo bcmod(bcmul(bcmod(bcmul($t,$m),$n),$i),$n) == $m;bcdiv
(PHP 4, PHP 5, PHP 7, PHP 8)
bcdiv — Divide two arbitrary precision numbers
Description
Divides num1 by num2.
Parameters
num1-
The dividend, as a string.
num2-
The divisor, as a string.
scale-
This parameter is used to set the number of digits after the decimal place in the result.
If
null, it will default to the default scale set with bcscale(), or fallback to the value of thebcmath.scaleINI directive.
Return Values
Returns the result of the division as a string.
Errors/Exceptions
This function throws a ValueError in the following cases:
-
num1ornum2is not a well-formed BCMath numeric string. -
scaleis outside the valid range.
This function throws a DivisionByZeroError
exception if num2 is 0.
Changelog
| Version | Description |
|---|---|
| 8.0.0 |
scale is now nullable.
|
| 8.0.0 |
Dividing by 0 now throws a
DivisionByZeroError exception
instead of returning null.
|
Examples
Example #1 bcdiv() example
<?php
echo bcdiv('105', '6.55957', 3); // 16.007
?>See Also
- bcdivmod() - Get the quotient and modulus of an arbitrary precision number
- bcmod() - Get modulus of an arbitrary precision number
- bcmul() - Multiply two arbitrary precision numbers
- BcMath\Number::div() - Divides by an arbitrary precision number
+add a note
User Contributed Notes 1 note
MM ¶
18 years ago