TIntX ist ein Pascal -Port der intx willkürlichen Präzisionsgüller -Bibliothek mit Fast, über O(N * log N) Multiplikations-/Division -Algorithmen -Implementierung. Es liefert alle grundlegenden arithmetischen Operationen für Ganzzahlen, vergleichen, bitweise Verschiebungen usw. Es ermöglicht auch Parsen Zahlen in verschiedenen Basen und konvertiert sie in eine String, auch in jeder Basis. Der Vorteil dieser Bibliothek ist ihre schnelle Multiplikation, Abteilung und von Basis/zu Basisumrechnungsalgorithmen. Alle schnellen Versionen der Algorithmen basieren auf der schnellen Multiplikation großer Ganzzahlen, indem sie Fast Hartley -Transformation für O(N * log N * log log N) anstelle von klassischem O(N^2) läuft.
Status erstellen
Hier ist eine Probe von Code, die TIntX verwendet, um 42 in Power 1048576 (2^20 (1 SHL 20)) zu berechnen:
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.
Einige andere Funktionen, die intern von mir implementiert werden, sind
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)
Wie Sie sehen können, implementiert TIntX alle Standard -Arithmetikbetreiber mit operator overloading sodass seine Verwendung für Entwickler transparent ist, z. B. wenn Sie mit üblichen Ganzzahlen arbeiten.
Die interne TIntX -Bibliothek arbeitet mit Floating-Punkt-Nummern, wenn die Multiplikation mit FHT (Fast Hartley Transform) durchgeführt wird, sodass sie irgendwann nicht mehr korrekt funktioniert und Präzision verliert. Glücklicherweise erscheint diese unangenehmen Nebenwirkungen von Effekteffekten, wenn die ganzzahlige Größe etwa 2^28 Bytes beträgt, dh für wirklich große ganze Zahlen. Um solche Fehler zu fangen, wurde ein Code hinzugefügt, FHT -Multiplikationsergebnis -Gültigkeitsprüfung in den Code - er dauert die letzten Ziffern jeder großen Ganzzahl, multipliziert sie mithilfe des klassischen Ansatzes und vergleicht dann die letzten n -Ziffern des klassischen Ergebnisses mit dem letzten N -Ziffern des FHT -Ergebniss (daher ist es eine Art vereinfachte CRC -Prüfung). Wenn eine Inkonsistenz gefunden wird, wird eine EFhtMultiplicationException ausgeworfen. Diese Prüfung kann mit globalen Einstellungen deaktiviert werden.
Für eine wirklich riesige Ganzzahl -Zahlen (wie 42 in Power 1048576 oben) kann ToString() der Aufruf einige Zeit in Anspruch nehmen, um auszuführen. Dies liegt daran, dass intern TIntX Big Ganzzahlen in UInt32 -Array als 2^32 -Base -Zahl gespeichert sind und die Ausgabe der Dezimalstritten von 2^32 in die Dezimalbasis umgewandelt werden sollte. Ein solcher Ziffernspeicheransatz wurde absichtlich ausgewählt-er macht ToString() langsamer, verwendet jedoch den Speicher effizient und macht primitive Vorgänge auf Ziffern schneller als Strom von 10-Basispeichern (was ToString() schneller funktionieren würde) und werden normalerweise häufiger als ToString() .
Unterstützte Compiler
FreePascal 3.0.0 and Above.
Delphi 2010 and Above.
Installation der Bibliothek.
Methode eins:
Verwenden Sie die bereitgestellten Pakete im Ordner "Pakete".
Methode zwei:
Fügen Sie den Bibliothekspfad und den Unterweg zu Ihrem Projektsuchpfad hinzu.
Unit -Tests.
Einheitstests ausführen,
Für FPC 3.0.0 und höher
Simply compile and run "IntXLib.Tests" project in "FreePascal.Tests" Folder.
Methode eins (unter Verwendung von TestInsight und Dunitx) (bevorzugt).
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.
Methode zwei (mit 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..
###Lizenz
Diese "Software" ist unter MIT License (MIT) lizenziert.
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.