【问题标题】:PHP bcmod or gmp_mod input type issuePHP bcmod 或 gmp_mod 输入类型问题
【发布时间】:2023-04-16 04:20:02
【问题描述】:

我在 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 不是静态的。所以我必须使用 type cast 像:

$n = (string)10000000000000000000001;

不再起作用了。

for gmp 给出这个错误:

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

关于bc,给我这个错误:

bcmod(): Division by zero

问题是,(string) 无法将其转换为字符串。有什么想法吗?

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

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

【问题讨论】:

    标签: php gmp bc


    【解决方案1】:

    如果您输入$n,它会给您一个string,而不是int,并且如果您在任何时候都将类型转换为int...注意 int 的最大大小,上面给出的 no 被转换为 1.0E+22 现在当你尝试输入 cast (string)1.0E+22 时会发生什么,它变成了 "1.0E+22" 这显然只是一个字符串,不能转换为 gmp 数字。

    所以您需要将科学记数法转换为自动包含的字符串,因此您还需要替换那些逗号

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

    【讨论】:

    • 我知道原因,只是在寻找解决方案。
    • 从不定义 $n 的类型,它始终是一个字符串...如果从...获取输入,您就不能进行类型转换
    • 谢谢。但它不会返回确切的值。在您的情况下,它返回 10000000000000000000000
    • 是的,这样做我们会失去精度.. 所以它在 php.net 上严格警告使用字符串来表示大数字