2008-11-13 7 views
18

Estoy trabajando con grandes números que no puedo completar. Utilizando la biblioteca matemática estándar de Lua, parece que no hay una manera conveniente de preservar la precisión más allá de un límite interno. También veo que hay varias bibliotecas que se pueden cargar a trabajar con grandes números:¿Cuál es la biblioteca de números grandes (de precisión arbitraria) estándar (o mejor respaldada) para 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 (podría ser idéntica a # 2)
  4. http://www.gammon.com.au/scripts/doc.php?general=lua_bc (pero no puedo encuentre cualquier fuente)

Además, hay many libraries en C que podrían llamarse desde Lua, si se establecieron los enlaces.

¿Has tenido alguna experiencia con una o más de estas bibliotecas?

+1

He escrito fijaciones Lua por varias bibliotecas de números grandes: LBC, LBN, lint64, lmapm, LQD, todos disponibles en http://www.tecgraf.puc-rio.br/~lhf/ftp/ lua /. Tienen diferentes características y requisitos. – lhf

Respuesta

5

El lmapm library de Luiz Figueiredo, uno de los autores del lenguaje Lua.

5

Realmente no puedo responder, pero agregaré LGMP, una encuadernación GMP. No utilizado.

No es mi campo de experiencia, pero espero que la biblioteca aritmética de precisión múltiple de GNU sea un estándar aquí, ¿no?

+1

Ah. Eso es muy útil ya que la documentación GMP no muestra que: http://gmplib.org/manual/Language-Bindings.html#Language-Bindings –

3

Aunque no es arbitraria precisión, Lua decNumber, un envoltorio de Lua 5.1 para IBM decNumber, implementa la propuesta general Aritmética decimal estándar IEEE 754r. Tiene los operadores aritméticos Lua 5.1 y más, control total sobre los modos de redondeo y precisión de trabajo de hasta 69 dígitos decimales.

+1

69? Eso es casi un tercio de lo que necesito. (Estoy trabajando en .) –

6

Utilicé la sugerencia de Norman Ramsey para resolver el problema del Proyecto Euler #16. No creo que sea un spoiler decir que la clave del problema es calcular un entero de 303 dígitos con precisión.

Estos son los pasos que necesitaba para instalar y utilizar la biblioteca:

  1. Lua tiene que ser construido con activar la carga dinámica. Yo uso Cygwin, pero cambié PLAT en src/Makefile para ser linux. El valor predeterminado, none, no habilita la carga dinámica.

  2. El MAMP debe construirse e instalarse en algún lugar que el compilador de C pueda encontrar. Puse libmapm.a en /usr/local/lib/. Siguiente m_apm.h y m_apm_lc.h fue a /usr/local/include/.

  3. El archivo MAKE para lmamp necesita ser alterado a la ubicación correcta de las bibliotecas Lua y MAMP. Para mí, eso significa eliminar la segunda declaración de LUA, LUAINC, LUALIB y LUABIN y editar la declaración de MAMP.

  4. Finalmente, mapm.so debe colocarse en algún lugar donde Lua lo encuentre. Lo puse en /usr/local/lib/lua/5.1/.

¡Gracias a todos por las sugerencias!

13

usando lbc en lugar de lmapm sería más fácil porque LBC es autónomo.

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) 
Cuestiones relacionadas