TIntX é uma porta Pascal da biblioteca inteira de precisão arbitrária Intx com implementação de algoritmos de multiplicação/divisão rápida, sobre O(N * log N) . Ele fornece todas as operações aritméticas básicas em números inteiros, comparando, mudanças bites etc. Também permite analisar números em diferentes bases e convertê -las em cordas, também em qualquer base. A vantagem desta biblioteca é sua multiplicação rápida, divisão e de algoritmos de conversão de base/base. Todas as versões rápidas dos algoritmos são baseadas na multiplicação rápida de grandes números inteiros usando o tempo rápido de Hartley, que é executado para o tempo O(N * log N * log log N) em vez do clássico O(N^2) .
Construir status
Aqui está uma amostra de código que usa TIntX para calcular 42 na potência 1048576 (que é 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.
Algumas outras funções implementadas internamente por mim são
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 você pode ver, TIntX implementa todos os operadores aritméticos padrão usando operator overloading para que seu uso seja transparente para os desenvolvedores, como se você estiver trabalhando com números inteiros usuais.
A biblioteca TIntX internamente opera com números de ponto flutuante quando a multiplicação usando FHT (Fast Hartley Transform) é realizada para que, em algum momento, ele pare de funcionar corretamente e perde precisão. Felizmente, esses efeitos desagradáveis de efeitos colaterais começam a aparecer quando o tamanho inteiro é de cerca de 2^28 bytes, ou seja, para inteiros realmente enormes. De qualquer forma, para capturar esses erros em que algum código foi adicionado, a verificação da validade do resultado da multiplicação de FHT - leva os últimos dígitos de cada grande número inteiro, multiplica -os usando a abordagem clássica e compara os últimos n dígitos do resultado clássico com os últimos n dígitos do resultado da FHT (por isso é uma espécie de verificação de CRC simplificada). Se alguma inconsistência for encontrada, é lançada uma EFhtMultiplicationException ; Esta verificação pode ser desativada usando configurações globais.
Para um número inteiro realmente enorme (como 42 no Power 1048576 acima), a chamada ToString() pode levar algum tempo para executar. Isso ocorre porque, internamente, os números inteiros TIntX são armazenados como número de 2^32 -32 na matriz UInt32 e, para gerar saída de sequência decimal, ele deve ser convertido da base 2^32 para a base decimal. Essa abordagem de armazenamento de dígitos foi escolhida intencionalmente-torna ToString() mais lento, mas usa a memória com eficiência e torna as operações primitivas em dígitos mais rapidamente do que a potência do armazenamento de 10 bases (que tornaria o trabalho ToString() mais rápido) e geralmente os cálculos são usados com mais frequência que ToString() .
Compiladores suportados
FreePascal 3.0.0 and Above.
Delphi 2010 and Above.
Instalando a biblioteca.
Método um:
Use os pacotes fornecidos na pasta "Pacotes".
Método dois:
Adicione o caminho da biblioteca e o sub -caminho ao seu caminho de pesquisa de projeto.
Testes de unidade.
Para executar testes de unidade,
Para FPC 3.0.0 e acima
Simply compile and run "IntXLib.Tests" project in "FreePascal.Tests" Folder.
Método um (usando TestInsight e 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 dois (usando Dunitx Console Runner).
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..
###Licença
Este "software" está licenciado sob 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.