系数太大

hip*_*vet 5 utilities

我正在尝试使用一个factor实用程序,但它告诉我这个数字太大了。有什么实用程序可以factor做但不能告诉数字太大吗?

cuo*_*glm 6

也许你factor不是用 构建的GMP,所以它不能处理大于2**64-1

$ factor 18446744073709551616
factor: `18446744073709551616' is too large
$ factor 18446744073709551615
18446744073709551615: 3 5 17 257 641 65537 6700417
Run Code Online (Sandbox Code Playgroud)

运行此命令以检查是否factor使用以下命令构建GMP

$ ldd /usr/bin/factor 
        linux-vdso.so.1 (0x00007fffda1fe000)
        libgmp.so.10 => /usr/lib64/libgmp.so.10 (0x00007faae00f5000)
        libc.so.6 => /lib64/libc.so.6 (0x00007faadfd46000)
        /lib64/ld-linux-x86-64.so.2 (0x00007faae037c000)
Run Code Online (Sandbox Code Playgroud)

某些机器上的限制可能更高(数字必须符合uintmax_t类型),但您的数字是 256 位数字,并且没有普通机器支持这么大的uintmax_t.

请注意,该factor实用程序可以使用GMP支持进行编译。在这种情况下,实际上对数字的大小没有限制。您的发行版似乎没有激活 GMP 支持(这是有道理的,因为它会为很少使用的功能添加对核心系统包的额外库的依赖)。

如果你有perl,你可以尝试factor.plMath::Prime::Util模块中包含程序:

$ /home/cuonglm/.cpan/build/Math-Prime-Util-0.31-9c_xq3/bin/factor.pl 115792089237316195423570985008687907852837564279074904382605163141518161494337
115792089237316195423570985008687907852837564279074904382605163141518161494337: 115792089237316195423570985008687907852837564279074904382605163141518161494337
Run Code Online (Sandbox Code Playgroud)

  • 按照这个逻辑,即使在 64 位系统上,`FFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141` 也不应该工作,因为它比 64 位大得多。(实际上它不在我的 64 位系统上) (4认同)
  • @Patrick:哦,你的 `factor` 不是用 `GNU MP` 构建的,所以它不能处理任意精度的数字。有关更多详细信息,请参阅“信息因子”。 (2认同)
  • @richard 否:`factor` 在大多数 32 位平台上支持 64 位数字。 (2认同)

vin*_*c17 6

您也可以factor从 coreutils 中使用。然而,它需要在 bignum 支持下进行编译。仅供参考,某些发行版附带的二进制文件并非如此,例如 Debian(错误 608832)。但是您可以下载源代码并在安装 GMP 后重新编译它(如果找到则默认使用)。

另一种解决方案是使用 Pari/GP(以数论着称):

? factor(806578020551755900412008880903137528217525975284037923)
%1 =
[ 238366085426200783161668947 1]

[3383778439410064898661524209 1]
Run Code Online (Sandbox Code Playgroud)

有了这个数字,需要几秒钟。