TIntX 、 O(N * log N)乗算/分割アルゴリズムの実装について、高速な任意の精密整数ライブラリのPascalポートです。整数でのすべての基本的な算術操作を提供し、比較、ビットワイズシフトなどを提供します。また、異なる塩基での解析を解析し、任意のベースで弦に変換することもできます。このライブラリの利点は、その高速乗算、分割、およびベース/ベース変換アルゴリズムへの除算です。アルゴリズムのすべての高速バージョンは、クラシックO(N^2)の代わりにO(N * log N * log log N)時間で実行される高速ハートリー変換を使用して、大きな整数の高速乗算に基づいています。
ステータスを構築します
これは、 TIntXを使用してPower 1048576(2^20(1 Shl 20))の42を計算するコードのサンプルです。
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.
私によって内部的に実装された他のいくつかの機能はそうです
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)
ご覧のとおり、 TIntX operator overloadingを使用してすべての標準算術演算子を実装しているため、通常の整数を扱っている場合など、開発者にとって使用が透明です。
内部的にはTIntX FHT(Fast Hartley Transform)を使用して乗算するとフローティングポイント数で動作するため、ある時点で正しく動作を停止し、精度を失います。幸いなことに、この不快な副作用効果は、整数サイズが約2^28バイトの場合、非常に大きな整数の場合に表示されます。とにかく、このようなエラーをキャッチするために、いくつかのコードが追加され、FHT乗算結果の妥当性チェックがコードにチェックされます。各大きな整数の最後の数字が必要であり、クラシックなアプローチを使用してそれらを乗算し、クラシック結果の最後のn桁をFHT結果の最後のn桁と比較します(したがって、CRCチェックの一種です)。矛盾が見つかった場合、 EFhtMultiplicationExceptionがスローされます。このチェックは、グローバル設定を使用して無効にすることができます。
非常に巨大な整数(上記のPower 1048576の42など)の場合ToString()コールは実行にかなりの時間がかかる場合があります。これは、内部的にTIntXビッグ整数がUInt32アレイに2^32ベース数として保存され、小数弦出力を生成するには、 2^32ベースから小数ベースに変換する必要があるためです。このような数字のストレージアプローチは意図的に選択されました - それはToString()を遅くしますが、メモリを効率的に使用し、10ベースストレージの電力よりも桁の原始操作を速くします( ToString()より速く動作させます)。通常、計算はToString()よりも頻繁に使用されます。
サポートされているコンパイラ
FreePascal 3.0.0 and Above.
Delphi 2010 and Above.
ライブラリのインストール。
方法1:
「パッケージ」フォルダーの提供されたパッケージを使用します。
方法2:
プロジェクト検索パスにライブラリパスとサブパスを追加します。
ユニットテスト。
ユニットテストを実行するには、
FPC 3.0.0以上の場合
Simply compile and run "IntXLib.Tests" project in "FreePascal.Tests" Folder.
方法1(TestInsightおよびDunitxを使用)(優先)。
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.
方法2(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..
###ライセンス
この「ソフトウェア」は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.