2011-10-24 26 views
16

Estoy pensando en diferentes formas de implementar la aritmética de precisión arbitraria (a veces llamada Bignum, Integer o BigInt).¿Existen estrategias de implementación comunes para la aritmética de precisión arbitraria que son válidas independientemente de un idioma específico?

Parece que el idioma común es utilizar una matriz para el almacenamiento del valor real y reasignarlo según sea necesario si los requisitos de espacio aumentan o disminuyen.

Más precisamente, parece que el tamaño de bit de los elementos de la matriz es a menudo el segundo tamaño más grande comúnmente soportado (¿para hacer cálculos con overflow más fáciles de implementar, probablemente?), E. gramo. idioma/plataforma admite números de 128 bits -> matriz de números de 64 bits + variable de 128 bits para controlar el desbordamiento.

¿Existen formas fundamentalmente diferentes de implementar la aritmética de precisión arbitraria o es la manera "probada y verdadera" de implementarla sin grandes pérdidas de rendimiento?

Mi pregunta es sobre la estructura de datos subyacente, no los algoritmos para las operaciones. Sé que Karatsuba, Toom-Cook et alii.

+1

Para enteros grandes, se usan FFT y DFT, creo. –

+0

Para la eficiencia (propagación de acarreo) un bignum se almacena comúnmente como una matriz binaria en forma de little-endian. El tamaño de los elementos de la matriz de hecho tiene que ver con la capacidad de una computadora para procesar los números para obtener un acarreo (para adiciones) o pedir prestado (para restar). El lenguaje de programación específico, la matriz que contiene el bignum puede ser una matriz de bytes, ya que los bytes se pueden convertir fácilmente en el tipo de datos más eficiente disponible. 4 bytes a un int, 8 bytes a un largo, etc. –

+0

En realidad, para sumar y restar, puede usar la longitud de bit nativa. Si hay un acarreo, 'a + b a' para enteros positivos. Pero es bastante complicado manejar el desbordamiento en la multiplicación. Puede hacerlo, pero es mejor dejarlo en la CPU. :) – vhallac

Respuesta

10

Es posible utilizar el Chinese Remainder Theorem-represent large integers de una manera fundamentalmente diferente de la^sistema n usual de base-2.

Creo que una representación basada en CRT seguirá utilizando una matriz de elementos que, al igual que la representación convencional, se basan en la aritmética nativa más conveniente disponible. Sin embargo, estos elementos contienen los restos del número cuando se divide por una secuencia de primos, no de base-2^n dígitos.

Al igual que en la representación convencional, la cantidad de elementos utilizados determina el tamaño máximo del número representable. Desafortunadamente, no es fácil calcular si un número basado en CRT es mayor que otro, por lo que es difícil determinar si su representación ha desbordado el tamaño máximo. Tenga en cuenta que la suma y la multiplicación son muy rápidas en la representación de CRT, lo que podría ser una ventaja si puede resolver el problema del desbordamiento.

Sin embargo, para responder a su pregunta: creo que es correcto decir que el sistema base-2^n es efectivamente la representación "probada y verdadera", que es utilizada por la mayoría de las bibliotecas populares de bignum. Creo que recuerdo que existen bibliotecas bignum existentes basadas en CRT, aunque no las he comprobado últimamente para ver si todavía existen ...

+0

+1, la representación basada en CRT es la representación interna de algunos de los algoritmos basados ​​en la Transformación Teórica del Número (NTT) para la multiplicación. – Mysticial

Cuestiones relacionadas