2017-02-10 21 views
0

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

Это прекрасно работает:

// 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) не преобразует его в строку тонкой , Есть идеи?

Edit: Я нашел решение here, но до сих пор вход строка:

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

ответ

1

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

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

$n = 10000000000000000000001; 
$n = str_replace(",", "", number_format($n)); 
+0

Я знаю причину, просто ищет решение. –

+0

никогда не определяете тип $ n, и он всегда будет строкой ... если принимать входные данные из ... вы ca't typecast –

+0

См. Решение –