Содержание


Math (Математические функции)


Math, Rand, Random, Big Integer, BigInteger, ЗФ2, Zend Framework 2, ZF2, ру, ru





Пространство имен Zend\Math предоставляет базовый математический функционал. На данный момент поддерживаются следующие функции:

- Zend\Math\Rand - генератор случайных чисел;

- Zend\Math\BigInteger - библиотека для управления большими числами.

 

В будущем планируется расширить этот компонент.

 

Генератор случайных чисел



 

Zend\Math\Rand реализует генератор случайных чисел, который может генерировать случайные числа для общего пользования, а так же для  криптографических целей. Для генерации действительно случайных чисел используются расширения PHP OpenSSL и Mcrypt. Если же эти расширения у Вас не установлены, то для генерации случайны чисел будет использоваться PHP функция «mt_rand». Однако эта функция не может генерировать случайные числа, который потом можно применить в криптографии и соответствующий класс выбросит исключение.

 

В частности, алгоритм, который генерирует случайные байты в Zend\Math\Rand  пытается вызвать функцию расширения OpenSSL «openssl_random_pseudo_bytes».  Если же не получается, то пытается вызвать функцию расширения Mcrypt (с параметром MCRYPT_DEV_URANDOM) «mcrypt_create_iv function». И только если оба эти расширения не установлены используется уже «mt_rand».

 

Zend\Math\Rand  предоставляет следующие методы для генерации случайных чисел:

 

- getBytes($length, $strong = false)

Генерация случайного числа длиной «$length» байт.

 

- getBoolean($strong = false)

Генерировать случайное булевое значение (true или false)

 

- getInteger($min, $max, $strong = false)

Генерирует случайное число в пределах от «$min» до «$max».

 

- getFloat($strong = false)

Генерирует случайное дробное число в пределах от 0 до 1.

 

- getString($length, $charlist = null, $strong = false)

Генерирует случайную строку длиной «$length» символов, используя алфавит «$charlist». По умолчанию используется алфавит «Base64».

 

Во всех этих методах параметр «$strong» указывает на использование сильного (защищенного) генератора случайных чисел. Рекомендуем включать этот параметр (указывать «true»), если вы генерируете числа для криптографии или других безопасных решений.

 

Важно: Если вы включите $strong в «true», но не будут установлены расширения PHP «OpenSSL» или «Mcrypt» то выдаст исключение (Exception).

 

Пример: как генерировать случайные числа, используя Zend\Math\Rand.

use Zend\Math\Rand;
 
$bytes = Rand::getBytes(32, true);
printf("Random bytes (in Base64): %s\n", base64_encode($bytes));
 
$boolean = Rand::getBoolean();
printf("Random boolean: %s\n", $boolean ? 'true' : 'false');
 
$integer = Rand::getInteger(0,1000);
printf("Random integer in [0-1000]: %d\n", $integer);
 
$float = Rand::getFloat();
printf("Random float in [0-1): %f\n", $float);
 
$string = Rand::getString(32, 'abcdefghijklmnopqrstuvwxyz', true);
printf("Random string in latin alphabet: %s\n", $string);

Большие целые числа



 

Zend\Math\BigInteger\BigIntegerкласс для управления большими целыми числами. PHP поддерживает  цеые числа, которые не превышают значения PHP_INT_MAX.  Если же Вам необходимо использовать числа больше, то нужно пользоваться внешними библиотеками или установить PHP расширение «GMP» или «BC Math».

 

Zend\Math\BigInteger\BigInteger работает со сверх большими числами используя выши названые расширения как адаптеры.

 

Список математических функций, реализованных в Zend\Math\BigInteger\BigInteger:

 

- add($leftOperand, $rightOperand)

Сложить два больших целых числа

- sub($leftOperand, $rightOperand)

Вычесть два больших целых числа

- mul($leftOperand, $rightOperand)

Умножить два больших целых числа

- div($leftOperand, $rightOperand)

Разделить два больших целых числа. Возвращает только целую часть результата.

- pow($operand, $exp)

Возвести одно число в степень другого

- sqrt($operand)

Квадратный корень

- abs($operand)

Получить абсолютное значение большого целого числа

- mod($leftOperand, $modulus)

Вычислить модуль

- powmod($leftOperand, $rightOperand, $modulus)

Возвести одно число в степень другого, уменьшенного на указанный «$modulus»

- comp($leftOperand, $rightOperand)

Сравнение. Возвращает значение меньше нуля, если $leftOperand <  $rightOperandb значение больше нуля если $leftOperand> $rightOperand. Ноль если равны.

- intToBin($int, $twoc = false)

Конвертирует большое число в его двоичное представление

- binToInt($bytes, $twoc = false)

Преобразовывает двоичное число в большое целое

- baseConvert($operand, $fromBase, $toBase = 10)

Конвертирует число в разные основания.

 

Пример использования расширения «BC Math» как адаптер для вычисления сумы двух больших чисел, каждое по 100 знаков.

use Zend\Math\BigInteger\BigInteger;
use Zend\Math\Rand;
 
$bigInt = BigInteger::factory('bcmath');
 
$x = Rand::getString(100,'0123456789');
$y = Rand::getString(100,'0123456789');
 
$sum = $bigInt->add($x, $y);
$len = strlen($sum);
 
printf("%{$len}s +\n%{$len}s =\n%s\n%s\n", $x, $y, str_repeat('-', $len), $sum);

Как Вы заметили, сверх большие числа представляются как строки. Даже результат представлен строкой.

 

В следующем примере показано, как получить бинарное представление большого отрицательного целого числа, длиной 100 знаков.

use Zend\Math\BigInteger\BigInteger;
use Zend\Math\Rand;
 
$bigInt = BigInteger::factory('bcmath');
 
$digit = 100;
$x = '-' . Rand::getString($digit,'0123456789');
 
$byte = $bigInt->intToBin($x);
 
printf("The binary representation of the big integer with $digit digit:\n%s\nis (in Base64 format): %s\n",
       $x, base64_encode($byte));
printf("Length in bytes: %d\n", strlen($byte));
 
$byte = $bigInt->intToBin($x, true);
 
printf("The two's complement binary representation of the big integer with $digit digit:\n%s\nis (in Base64 format): %s\n",
       $x, base64_encode($byte));
printf("Length in bytes: %d\n", strlen($byte));

Мы получили бинарное представление большого числа, используя бинарный формат по умолчанию и два дополнительных представления (с указанием «true» в функции intToBin).

nbsp;Если же Вам необходимо использовать числа больше, то нужно пользоваться внешними библиотеками или установить PHP расширение «GMP» или «BC Math». ;
Автор статьи: DuB