PHP bcmod或gmp_mod输入类型问题

PHP bcmod或gmp_mod输入类型问题,php,gmp,bc,Php,Gmp,Bc,我在php中使用bcmod和gmp_mod函数来处理大数 这很好: // 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) +

我在php中使用bcmod和gmp_mod函数来处理大数

这很好:

// 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不是静态的。因此,我必须使用类型转换,如:

这不管用了

对于gmp,出现以下错误:

gmp_mod(): Unable to convert variable to GMP - string is not an integer
bcmod(): Division by zero
关于bc,给了我一个错误:

gmp_mod(): Unable to convert variable to GMP - string is not an integer
bcmod(): Division by zero
问题是,string不能将其转换为string fine。有什么想法吗

编辑:我找到了一个解决方案,但输入仍然是字符串:

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

如果您接受$n的输入,它将作为字符串而不是int,并且如果您在任意点将类型转换为int。。。注意int的最大大小,上面给定的no被转换为1.0E+22,现在当您尝试键入cast string1.0E+22时会发生什么,它会变成1.0E+22,这显然只是一个字符串,不能转换为gmp编号

因此,您需要将科学符号转换为自动包含的字符串,因此您还需要替换这些逗号

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

我知道原因,只是在寻找解决方案。永远不要定义$n的类型,它将始终是一个字符串…如果从。。。你不能说谢谢你。但它不会返回准确的值。在您的情况下,它会返回1000000000000000yah,这样我们就失去了精度。。因此,在php.net上使用字符串表示大数字是一个严格的警告