What is the standard (or best supported) big number (arbitrary precision) library for Lua?
Asked Answered
E

6

26

I'm working with large numbers that I can't have rounded off. Using Lua's standard math library, there seem to be no convenient way to preserve precision past some internal limit. I also see there are several libraries that can be loaded to work with big numbers:

  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 (might be identical to #2)
  4. http://www.gammon.com.au/scripts/doc.php?general=lua_bc (but I can't find any source)

Further, there are many libraries in C that could be called from Lua, if the bindings where established.

Have you had any experience with one or more of these libraries?

Eleaseeleatic answered 13/11, 2008 at 23:10 Comment(1)
I've written Lua bindings for several big number libraries: lbc, lbn, lint64, lmapm, lqd, all available at tecgraf.puc-rio.br/~lhf/ftp/lua. They have different features and requirements.Secession
M
7

The lmapm library by Luiz Figueiredo, one of the authors of the Lua language.

Minton answered 13/11, 2008 at 23:10 Comment(0)
S
19

Using lbc instead of lmapm would be easier because lbc is self-contained.

local bc = 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)
Secession answered 14/5, 2009 at 14:10 Comment(1)
All my big number libraries have been updated and are now self-contained. See tecgraf.puc-rio.br/~lhf/ftp/lua .Secession
E
8

I used Norman Ramsey's suggestion to solve Project Euler problem #16. I don't think it's a spoiler to say that the crux of the problem is calculating a 303 digit integer accurately.

Here are the steps I needed to install and use the library:

  1. Lua needs to be built with dynamic loading enabled. I use Cygwin, but I changed PLAT in src/Makefile to be linux. The default, none, doesn't enable dynamic loading.

  2. The MAMP needs to be built and installed somewhere that your C compiler can find it. I put libmapm.a in /usr/local/lib/. Next m_apm.h and m_apm_lc.h went to /usr/local/include/.

  3. The makefile for lmamp needs to be altered to the correct location of the Lua and MAMP libraries. For me, that means uncommenting the second declaration of LUA, LUAINC, LUALIB, and LUABIN and editing the declaration of MAMP.

  4. Finally, mapm.so needs to be placed somewhere that Lua will find it. I put it at /usr/local/lib/lua/5.1/.

Thank you all for the suggestions!

Eleaseeleatic answered 6/3, 2009 at 22:58 Comment(0)
M
7

The lmapm library by Luiz Figueiredo, one of the authors of the Lua language.

Minton answered 13/11, 2008 at 23:10 Comment(0)
C
6

I can't really answer, but I will add LGMP, a GMP binding. Not used.

Not my field of expertise, but I would expect the GNU multiple precision arithmetic library to be quite a standard here, no?

Cuenca answered 13/11, 2008 at 23:16 Comment(1)
Ah. That's helpful as the GMP documentation does not list it: gmplib.org/manual/Language-Bindings.html#Language-BindingsEleaseeleatic
G
5

Though not arbitrary precision, Lua decNumber, a Lua 5.1 wrapper for IBM decNumber, implements the proposed General Decimal Arithmetic standard IEEE 754r. It has the Lua 5.1 arithmetic operators and more, full control over rounding modes, and working precision up to 69 decimal digits.

Gus answered 15/11, 2008 at 5:51 Comment(2)
69? That's about a third as many as I need. (I'm working on <projecteuler.net/index.php?section=problems&id=16>.)Eleaseeleatic
@JonEricson You do realize you can use modular arithmetic to solve such problems? What if you were asked to find the sum of the digits of 7^3432566663432? Would your program work?Stability
R
2

There are several libraries for the problem, each one with your advantages and disadvantages, the best choice depends on your requeriments. I would say lbc is a good first pick if it fulfills your requirements or any other by Luiz Figueiredo. For the most efficient one I guess would be any using GMP bindings as GMP is a standard C library for dealing with large integers and is very well optimized.

Nevertheless in case you are looking for a pure Lua one, lua-bint library could be an option for dealing with big integers, I wouldn't say it's the best because there are more efficient and complete ones such the ones mentioned above, but usually they requires compiling C code or can be troublesome to setup. However when comparing pure Lua big integer libraries and depending in your use case it could perhaps be an efficient choice. The library is documented, code fully covered by tests and have many examples. But take this recommendation with grant of salt because I am the library author.

To install you can use luarocks if you already have it in your computer or simply download the bint.lua file in your project, as it has no other dependencies other than requiring Lua 5.3+.

Here is a small example using it to solve the problem #16 from Project Euler (mentioned in previous answers):

local bint = require 'bint'(1024)
local n = bint(1) << 1000
local digits = tostring(n)
local sum = 0
for i=1,#digits do
  sum = sum + tonumber(digits:sub(i,i))
end
print(sum) -- should output 1366
Roethke answered 9/7, 2020 at 22:23 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.