TIntX est un port Pascal de la bibliothèque entière de précision arbitraire INTX avec une implémentation rapide, à environ O(N * log N) Multiplication / Division Implémentation des algorithmes. Il fournit toutes les opérations arithmétiques de base sur des entiers, en comparant, un changement de bit, etc. Il permet également d'analyser les nombres dans différentes bases et de les convertir en chaîne, également dans n'importe quelle base. L'avantage de cette bibliothèque est sa multiplication rapide, sa division et des algorithmes de conversion de base / à la base. Toutes les versions rapides des algorithmes sont basées sur une multiplication rapide de grands entiers en utilisant la transformation rapide de Hartley qui fonctionne pour O(N * log N * log log N) au lieu de classique O(N^2) .
Statut de construction
Voici un échantillon de code qui utilise TIntX pour calculer 42 en puissance 1048576 (qui est 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.
Certaines autres fonctions implémentées en interne par moi sont
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)
Comme vous pouvez le voir, TIntX implémente tous les opérateurs arithmétiques standard utilisant operator overloading afin que son utilisation soit transparente pour les développeurs, comme si vous travaillez avec des entiers habituels.
La bibliothèque TIntX en interne fonctionne avec des nombres à virgule flottante lorsque la multiplication à l'aide de FHT (Fast Hartley Transform) est effectuée, donc à un moment donné, il cesse de fonctionner correctement et perd la précision. Heureusement, ces effets désagréables à effets secondaires commencent à apparaître lorsque la taille des entiers est d'environ 2 ^ 28 octets, c'est-à-dire pour des entiers vraiment énormes. Quoi qu'il en soit, pour attraper de telles erreurs, un code a été ajouté, la vérification de la validité du résultat de la multiplication FHT dans le code - il faut n les derniers chiffres de chaque grand entier, les multiplie en utilisant une approche classique, puis compare les derniers chiffres du résultat classique avec le dernier chiffre du résultat FHT (donc c'est une sorte de vérification CRC simplifiée). Si une incohérence est trouvée, une conception EFhtMultiplicationException est lancée; Cette vérification peut être désactivée à l'aide des paramètres globaux.
Pour un nombre vraiment énorme en entier (comme 42 en puissance 1048576 ci-dessus), l'appel ToString() peut prendre un certain temps à exécuter. En effet, les grands entiers TIntX en interne sont stockés sous forme de numéro de base 2^32 dans le tableau UInt32 et pour générer une sortie de chaîne décimale, il doit être converti de la base 2^32 en base décimale. Ces approches de stockage des chiffres ont été choisies intentionnellement - elle rend ToString() plus lent mais utilise efficacement la mémoire et rend les opérations primitives sur des chiffres plus rapidement que la puissance du stockage à 10 bases (ce qui ferait du travail ToString() plus rapidement) et généralement les calculs sont utilisés plus souvent que ToString() .
Compilateurs pris en charge
FreePascal 3.0.0 and Above.
Delphi 2010 and Above.
Installation de la bibliothèque.
Méthode un:
Utilisez les packages fournis dans le dossier "Packages".
Méthode deux:
Ajoutez le chemin de la bibliothèque et le sous-chemin de votre chemin de recherche de projet.
Tests unitaires.
Pour exécuter des tests unitaires,
Pour FPC 3.0.0 et plus
Simply compile and run "IntXLib.Tests" project in "FreePascal.Tests" Folder.
Méthode un (en utilisant TeshiNsight et Dunitx) (préféré).
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éthode deux (en utilisant le coureur de console 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..
###Licence
Ce "logiciel" est sous 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.