gmp — проблема с типом ввода PHP bcmod или gmp_mod

Я использую функции bcmod и gmp_mod в php для обработки больших чисел.

Это отлично работает:

// large number must be string
$n = "10000000000000000000001";
$y = 1025;
$c = 1025;
// Both works the same (also tested in python)
$y = gmp_mod( (bcpowmod($y, 2, $n) + $c) , $n);
$y = bcmod  ( (bcpowmod($y, 2, $n) + $c) , $n);

Но вход $n не является статичным Поэтому я должен использовать тип литья лайк:

$n = (string)10000000000000000000001;

это не работает больше.

за ГМП выдает эту ошибку:

gmp_mod(): Unable to convert variable to GMP - string is not an integer

И о До нашей эры, дает мне эту ошибку:

bcmod(): Division by zero

Проблема в, (string) не преобразует его в строку отлично. Любая идея?

Редактировать: Я нашел решение Вот, но все же ввод — строка:

$bigint = gmp_init("9999999999999999999");
$bigint_string = gmp_strval($bigint);
var_dump($bigint_string);

0

Решение

Если вы принимаете вход для $n это даст вам как string не так int и если вы набрали тип int в любой момент … учитывая максимальный размер int, приведенное выше значение no преобразуется в 1.0E+22 Теперь, что происходит, когда вы пытаетесь набрать приведение (string)1.0E+22 это становится "1.0E+22" которая, очевидно, является просто строкой и не может быть преобразована в число gmp.

Таким образом, вам нужно преобразовать научную нотацию в строку, которая будет автоматически включать, следовательно, вам также необходимо заменить эти запятые

$n = 10000000000000000000001;
$n = str_replace(",", "", number_format($n));
1

Другие решения

Других решений пока нет …