2009-08-04 9 views

Respuesta

4

La clase interna más cercana en las bibliotecas Cocoa es NSDecimalNumber que proporciona aritmética de base 10 (y por lo tanto puede manejar aritmética de entero solamente) para el rango mantisa x 10^exponente donde mantissa es un flotador de 38 bits y el exponente es - 128 a 128. Si eso cubre el rango que necesita, existen métodos de multiplicación y potencia. De lo contrario, dado que Objective-C es un superconjunto de C, cualquier implementación C de bigint que pueda encontrar será suficiente.

+0

Esto es casi seguro que no es lo que el autor está buscando. 'NSDecimalNumber' usa un sistema de numeración de base 10 para codificar y manipular números, no el (mucho) más común base-2. Un sistema de número de base 10 se usa generalmente cuando se trata de dinero en efectivo. De hecho, puede ser ilegal procesar números relacionados con la divisa en sistemas de numeración no basados ​​en la base 10, según su jurisdicción. – johne

7

Como biblioteca C simple, BN de openssl debería ser capaz de hacerlo.

BN_mod_exp() calcula a la p-ésima potencia módulo m (r = a^p% m). Esta función usa menos tiempo y espacio que BN_exp().

2

Hice rodar mi propio envoltorio alrededor de GMP una vez, hace mucho tiempo. Nunca antes había usado bibliotecarios BigNum ObjC de terceros, pero tenía estos marcadores: RSMath, que usa las funciones bignum de OpenSSL, y MPInteger, que usa GMP.

10

Espero que no sea demasiado tarde para responder este hilo.

Puede probar "LibTomMath", que es de código abierto y gratuito (el autor regala este proyecto como de dominio público). Funciona de la caja sin ninguna configuración, simplemente ponga todo bn _ *. C y tommath * .h en su proyecto Xcode y ya está listo para comenzar.

#import "tommath.h" 

mp_int number1, number2, number3; 

mp_init(&number1); 
mp_init(&number2); 
mp_init(&number3); 

mp_read_radix(&number1, "0a120edfff558c98a73015d5d67e8990", 16); 
mp_read_radix(&number2, "12e6f45d698c7b7009a841c1348d6ff4", 16); 

mp_mul(&number1, &number2, &number3); 

char output[1000]; 
mp_toradix(&number3, output, 16); 
NSLog(@"number3:%s", output); 

mp_div(&number3, &number1, &number2, NULL); 
mp_toradix(&number2, output, 16); 
NSLog(@"number2:%s", output); 
+0

TomMath no parece tener una función pow(), puede cuadrar o raíz cuadrada, pero si desea elevar a la potencia de n no es simple. – Muskie

+0

Por supuesto que tiene exponenciación - la función se llama 'mp_expt_d'. – dchest

7

Puede intentar https://github.com/kirsteins/JKBigInteger Es similar a la clase de Java BigInteger. Tiene métodos mod y pow que puedes combinar.

+0

¡Funciona a la perfección! ¡Gran biblioteca de la tercera parte! –

+0

buena biblioteca, creo que esta es la mejor respuesta –

+0

Parece que se usa internamente "LibTomMath" (ver la respuesta de iwat). – LaborEtArs

Cuestiones relacionadas