Я использую функции 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);
Если вы принимаете вход для $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));
Других решений пока нет …