123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- <?php
- namespace FG\Utility;
- abstract class BigInteger
- {
-
- private static $_prefer;
- public static function setPrefer($prefer = null)
- {
- self::$_prefer = $prefer;
- }
-
- public static function create($val)
- {
- if (self::$_prefer) {
- switch (self::$_prefer) {
- case 'gmp':
- $ret = new BigIntegerGmp();
- break;
- case 'bcmath':
- $ret = new BigIntegerBcmath();
- break;
- default:
- throw new \UnexpectedValueException('Unknown number implementation: ' . self::$_prefer);
- }
- }
- else {
-
- if (function_exists('gmp_add')) {
- $ret = new BigIntegerGmp();
- }
- elseif (function_exists('bcadd')) {
- $ret = new BigIntegerBcmath();
- } else {
- throw new \RuntimeException('Requires GMP or bcmath extension.');
- }
- }
- if (is_int($val)) {
- $ret->_fromInteger($val);
- }
- else {
-
- $val = (string)$val;
-
- if (!preg_match('/^-?[0-9]+$/', $val)) {
- throw new \InvalidArgumentException('Expects a string representation of an integer.');
- }
- $ret->_fromString($val);
- }
- return $ret;
- }
-
- protected function __construct()
- {
- }
-
- abstract public function __clone();
-
- abstract protected function _fromString($str);
-
- abstract protected function _fromInteger($integer);
-
- abstract public function __toString();
-
-
- abstract public function toInteger();
-
- abstract public function isNegative();
-
- abstract public function compare($number);
-
-
- abstract public function add($b);
-
- abstract public function subtract($b);
-
- abstract public function multiply($b);
-
- abstract public function modulus($b);
-
- abstract public function toPower($b);
-
- abstract public function shiftRight($bits = 8);
-
- abstract public function shiftLeft($bits = 8);
-
- abstract public function absoluteValue();
- }
|