TIntX es un puerto Pascal de la biblioteca entera de precisión arbitraria intx con Fast, sobre la implementación de algoritmos de multiplicación/división O(N * log N) . Proporciona todas las operaciones aritméticas básicas en enteros, comparando, desplazamiento de bit a bit, etc. También permite números de análisis en diferentes bases y convertirlos en cadena, también en cualquier base. La ventaja de esta biblioteca es su rápida multiplicación, división y de algoritmos de conversión base/a base. Todas las versiones rápidas de los algoritmos se basan en la multiplicación rápida de enteros grandes que usan transformación de Hartley rápida que se ejecuta para el tiempo O(N * log N * log log N) en lugar del clásico O(N^2) .
Estado de construcción
Aquí hay una muestra de código que usa TIntX para calcular 42 en la potencia 1048576 (que es 2^20 (1 shl 20)):
uses // including only the non-obvious
SysUtils, uIntX, uEnums;
procedure Calc ();
var
valA, valB: UInt32;
Delta: Double;
begin
valA := GetTickCount;
TIntX. Pow ( 42 , 1048576 );
valB := GetTickCount;
Delta := (valB - valA) / 1000 ;
ShowMessage(Format( ' time elapsed is %f seconds ' , [Delta]));
end ;
procedure TForm1.Button1Click (Sender: TObject);
begin
Calc();
TIntX.GlobalSettings.MultiplyMode := TMultiplyMode.mmClassic;
Calc();
end ; First 'Calc()' call uses fast multiplication implementation (which is default),
second, classic one. On my machine (Windows 10 Update 2, Intel Core i3 2.53 GHz,
6 GB RAM), Compiled with 64 bits, first call took 0.30 seconds while the second one
took 17.91 seconds.Resulting number has 1,702,101 digits.
Algunas otras funciones implementadas internamente son
IntegerSquareRoot (Integer SquareRoot)
Square
GCD (Greatest Common Divisor (HCF))
LCM (Least Common Multiple)
AbsoluteValue (Get Absolute Value of a Negative TIntX)
Bézouts Identity
InvMod (Modular Inverse)
Factorial
IntegerLogN (base, number) (Gets IntegerLog of a number using a specified base)
Ln (The natural logarithm)
Log10 (The base-10 logarithm)
LogN (Logarithm of a number for a specified base)
Random (Now Uses PcgRandom Instead of Mersemme Twister)
Modular Exponentiation (ModPow)
IsProbablyPrime (based on Miller Rabin Primality Test)
Como puede ver, TIntX implementa todos los operadores aritméticos estándar que utilizan operator overloading para que su uso sea transparente para los desarrolladores, como si está trabajando con enteros habituales.
La biblioteca TIntX internamente funciona con números de punto flotante cuando la multiplicación usando FHT (transformación de Hartley Fast) se realiza, por lo que en algún momento deja de funcionar correctamente y pierde precisión. Afortunadamente, estos efectos desagradables de efectos secundarios comienzan a aparecer cuando el tamaño de entero es de aproximadamente 2^28 bytes, es decir, para enteros realmente enormes. De todos modos, para detectar tales errores, se agregó algún código, la verificación de la validez del resultado de la multiplicación FHT en el código: se requiere N Últimos dígitos de cada entero grande, los multiplica usando un enfoque clásico y luego compara los últimos n dígitos de los resultados clásicos con los últimos n dígitos de resultados FHT (por lo que es una especie de verificación de CRC simplificada). Si se encuentra alguna inconsistencia, entonces se lanza una EFhtMultiplicationException ; Esta verificación se puede deshabilitar utilizando la configuración global.
Para un número entero realmente enorme (como 42 en Power 1048576 arriba) ToString() La llamada puede llevar bastante tiempo ejecutarse. Esto se debe a que, los enteros grandes TIntX internamente se almacenan como número de 2^32 bases en la matriz UInt32 y para generar salida de cadena decimal, debe convertirse de 2^32 base a base decimal. Dicho enfoque de almacenamiento de dígitos se eligió intencionalmente: hace que ToString() sea más lento pero usa la memoria de manera eficiente y hace que las operaciones primitivas en los dígitos más rápido que la potencia del almacenamiento de 10 base (lo que haría que ToString() funcione más rápido) y, por lo general, los cálculos se usan con mayor frecuencia que ToString() .
Compiladores compatibles
FreePascal 3.0.0 and Above.
Delphi 2010 and Above.
Instalación de la biblioteca.
Método uno:
Use los paquetes proporcionados en la carpeta "PAQUETES".
Método dos:
Agregue la ruta de la biblioteca y la ruta subterránea a la ruta de búsqueda de su proyecto.
Pruebas unitarias.
Para ejecutar pruebas unitarias,
Para FPC 3.0.0 y superior
Simply compile and run "IntXLib.Tests" project in "FreePascal.Tests" Folder.
Método uno (usando TestInsight y DunitX) (preferido).
1). Download and Install TestInsight (and DunitX if not available).
2). Open Project Options of Unit Test (IntXLib.Tests.TestInsight) in "Delphi.Tests"
Folder.
3). To Use TestInsight, right-click on the project, then select
"Enable for TestInsight" or "TestInsight Project".
Save Project then Build and Run Test Project through TestInsight.
Método dos (usando el corredor de la consola Dunitx).
1). Download and Install DunitX (if not available).
2). Open Project Options of Unit Test (IntXLib.Tests.TestInsight) in "Delphi.Tests"
Folder.
3). Save Project then Build and Run Test Project..
###Licencia
Este "software" tiene licencia bajo MIT License (MIT) .
1MhFfW7tDuEHQSgie65uJcAfJgCNchGeKf0x6c1DC21aeC49A822A4f1E3bf07c623C2C1978a98345367-40 Special Thanks to first of all, (Andriy Kozachuk) for creating the
Original CSharp version, members of Delphi Developers Community on Google Plus,
Uncle Midnight,Ron4Fun for various support offered.