| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 | <?php/* * This file is part of the PHPASN1 library. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace FG\Utility;/** * Class BigIntegerGmp * Integer representation of big numbers using the GMP extension to perform operations. * @package FG\Utility * @internal */class BigIntegerGmp extends BigInteger{    /**     * Resource handle.     * @var \GMP     */    protected $_rh;    public function __clone()    {        $this->_rh = gmp_add($this->_rh, 0);    }    protected function _fromString($str)    {        $this->_rh = gmp_init($str, 10);    }    protected function _fromInteger($integer)    {        $this->_rh = gmp_init($integer, 10);    }    public function __toString()    {        return gmp_strval($this->_rh, 10);    }    public function toInteger()    {        if ($this->compare(PHP_INT_MAX) > 0 || $this->compare(PHP_INT_MIN) < 0) {            throw new \OverflowException(sprintf('Can not represent %s as integer.', $this));        }        return gmp_intval($this->_rh);    }    public function isNegative()    {        return gmp_sign($this->_rh) === -1;    }    protected function _unwrap($number)    {        if ($number instanceof self) {            return $number->_rh;        }        return $number;    }    public function compare($number)    {        return gmp_cmp($this->_rh, $this->_unwrap($number));    }    public function add($b)    {        $ret = new self();        $ret->_rh = gmp_add($this->_rh, $this->_unwrap($b));        return $ret;    }    public function subtract($b)    {        $ret = new self();        $ret->_rh = gmp_sub($this->_rh, $this->_unwrap($b));        return $ret;    }    public function multiply($b)    {        $ret = new self();        $ret->_rh = gmp_mul($this->_rh, $this->_unwrap($b));        return $ret;    }    public function modulus($b)    {        $ret = new self();        $ret->_rh = gmp_mod($this->_rh, $this->_unwrap($b));        return $ret;    }    public function toPower($b)    {        if ($b instanceof self) {            // gmp_pow accepts just an integer            if ($b->compare(PHP_INT_MAX) > 0) {                throw new \UnexpectedValueException('Unable to raise to power greater than PHP_INT_MAX.');            }            $b = gmp_intval($b->_rh);        }        $ret = new self();        $ret->_rh = gmp_pow($this->_rh, $b);        return $ret;    }    public function shiftRight($bits=8)    {        $ret = new self();        $ret->_rh = gmp_div($this->_rh, gmp_pow(2, $bits));        return $ret;    }    public function shiftLeft($bits=8)    {        $ret = new self();        $ret->_rh = gmp_mul($this->_rh, gmp_pow(2, $bits));        return $ret;    }    public function absoluteValue()    {        $ret = new self();        $ret->_rh = gmp_abs($this->_rh);        return $ret;    }}
 |