Lua的标准(或最佳支持)大数(任意精度)库是什么?

时间:2008-11-13 23:10:23

标签: math lua precision bignum

我正在处理我无法完成的大数字。使用Lua的标准数学库,似乎没有方便的方法来保持精度超过某些内部限制。我还看到有几个库可以加载来处理大数字:

  1. http://oss.digirati.com.br/luabignum/
  2. http://www.tc.umn.edu/~ringx004/mapm-main.html
  3. http://lua-users.org/lists/lua-l/2002-02/msg00312.html(可能与#2相同)
  4. http://www.gammon.com.au/scripts/doc.php?general=lua_bc(但我找不到任何来源)
  5. 此外,如果绑定已建立,则可以从Lua调用C中的many libraries

    您是否有过使用这些库中的一个或多个的经验?

6 个答案:

答案 0 :(得分:15)

使用lbc代替lmapm会更容易,因为lbc是自包含的。

require"bc"
s=bc.pow(2,1000):tostring()
z=0
for i=1,#s do
        z=z+s:byte(i)-("0"):byte(1)
end
print(z)

答案 1 :(得分:6)

Luiz Figueiredo的lmapm library,Lua语言的作者之一。

答案 2 :(得分:6)

我使用Norman Ramsey的建议来解决Project Euler问题#16。我认为问题的关键在于准确计算303位整数,这并不是一个扰流。

以下是我需要安装和使用该库的步骤:

  1. Lua需要在启用动态加载的情况下构建。我使用Cygwin,但我将PLAT中的src/Makefile更改为linux。默认值none无法启用动态加载。

  2. 需要构建MAMP并安装在C编译器可以找到的地方。我将libmapm.a放在/usr/local/lib/中。下一个m_apm.hm_apm_lc.h转到/usr/local/include/

  3. 需要将lmamp的makefile更改为Lua和MAMP库的正确位置。对我而言,这意味着取消注释LUALUAINCLUALIBLUABIN的第二个声明并编辑MAMP的声明。

  4. 最后,mapm.so需要放在Lua找到的地方。我把它放在/usr/local/lib/lua/5.1/

  5. 谢谢大家的建议!

答案 3 :(得分:5)

我无法回答,但我会添加LGMP,一个GMP绑定。没用过。

不是我的专业领域,但我希望GNU多精度算术库在这里非常标准,不是吗?

答案 4 :(得分:3)

虽然不是任意精度,Lua decNumber,IBM decNumber的Lua 5.1包装器,实现了建议的通用十进制算术标准IEEE 754r。它具有Lua 5.1算术运算符和更多,完全控制舍入模式,工作精度高达69位十进制数。

答案 5 :(得分:1)

有几个问题库,每个都有您的优点 和缺点,最佳选择取决于您的要求。我会说 lbc是一个不错的首选 满足您的要求或Luiz Figueiredo的任何其他要求。对于最高效的应用程序,我猜可能会使用GMP绑定,因为GMP是用于处理大整数的标准C库,并且经过了很好的优化。

尽管如此,如果您正在寻找纯Lua,lua-bint 库可能是处理大整数的一种选择, 我不会说这是最好的,因为效率更高 和完整的代码,例如上面提到的代码,但是通常它们需要编译C代码 否则可能会麻烦设置。但是当比较纯Lua大整数库时 根据您的用例,它可能是一个有效的选择。该库已记录在案, 测试完全涵盖的代码,并包含许多示例。但是,请接受以下建议: 盐,因为我是图书馆作者。

要安装,如果您已经在计算机中安装了luarocks,则可以直接下载 bint.lua 文件,因为它除了需要Lua 5.3+之外没有其他依赖项。

这里是一个小示例,使用它来解决Eu​​ler项目中的问题16 (在先前的答案中提到):

            TCHAR szPath[MAX_PATH + 1];
            DWORD result = GetTempPath(MAX_PATH + 1, szPath);
            if (result != ERROR_SUCCESS) {
                // check GetLastError()
            }