TIntX adalah port pascal dari pustaka integer presisi presisi intx dengan cepat, tentang O(N * log N) implementasi algoritma multiplikasi/divisi. Ini menyediakan semua operasi aritmatika dasar pada bilangan bulat, membandingkan, menggeser bitwise dll. Ini juga memungkinkan penguraian angka di berbagai basis dan mengubahnya menjadi string, juga di basis apa pun. Keuntungan dari perpustakaan ini adalah perkalian, divisi, dan dari algoritma konversi dasar/ke dasar. Semua versi cepat dari algoritma didasarkan pada multiplikasi cepat bilangan bulat besar menggunakan transformasi Hartley cepat yang berjalan untuk O(N * log N * log log N) waktu, bukan klasik O(N^2) .
Bangun status
Berikut adalah sampel kode yang menggunakan TIntX untuk menghitung 42 dalam daya 1048576 (yaitu 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.
Beberapa fungsi lain yang diimplementasikan secara internal oleh saya
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)
Seperti yang Anda lihat, TIntX mengimplementasikan semua operator aritmatika standar menggunakan operator overloading sehingga penggunaannya transparan untuk pengembang, seperti jika Anda bekerja dengan bilangan bulat biasa.
Perpustakaan TIntX internal beroperasi dengan bilangan titik mengambang saat perkalian menggunakan FHT (Fast Hartley Transform) dilakukan sehingga pada titik tertentu berhenti bekerja dengan benar dan kehilangan presisi. Untungnya, efek efek samping yang tidak menyenangkan ini mulai muncul ketika ukuran integer sekitar 2^28 byte yaitu untuk bilangan bulat yang sangat besar. Ngomong -ngomong, untuk menangkap kesalahan seperti itu beberapa kode ditambahkan, FHT Multiplikasi Hasil Validitas Periksa ke dalam kode - dibutuhkan N digit terakhir dari setiap bilangan bulat besar, melipatgandakan mereka menggunakan pendekatan klasik dan kemudian membandingkan n digit terakhir hasil klasik dengan n digit terakhir dari hasil FHT (jadi ini jenis pemeriksaan CRC yang disederhanakan). Jika ada ketidakkonsistenan yang ditemukan, maka EFhtMultiplicationException dilemparkan; Cek ini dapat dinonaktifkan menggunakan pengaturan global.
Untuk nomor integer yang sangat besar (seperti 42 dalam daya 1048576 di atas) panggilan ToString() dapat memakan waktu cukup lama untuk dieksekusi. Ini karena, bilangan bulat besar TIntX internal disimpan sebagai angka 2^32 -Base dalam array UInt32 dan untuk menghasilkan output string desimal itu harus dikonversi dari 2^32 basis ke dasar desimal. Pendekatan penyimpanan digit seperti itu dipilih dengan sengaja-itu membuat ToString() lebih lambat tetapi menggunakan memori secara efisien dan membuat operasi primitif pada digit lebih cepat daripada daya penyimpanan 10-base (yang akan membuat ToString() bekerja lebih cepat) dan biasanya perhitungan digunakan lebih sering daripada ToString() .
Kompiler yang didukung
FreePascal 3.0.0 and Above.
Delphi 2010 and Above.
Menginstal perpustakaan.
Metode Satu:
Gunakan paket yang disediakan di folder "Paket".
Metode dua:
Tambahkan jalur perpustakaan dan sub jalur ke jalur pencarian proyek Anda.
Tes unit.
Untuk menjalankan tes unit,
Untuk FPC 3.0.0 dan di atas
Simply compile and run "IntXLib.Tests" project in "FreePascal.Tests" Folder.
Metode satu (menggunakan testInsight dan dunitx) (lebih disukai).
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.
Metode dua (menggunakan 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..
###Lisensi
"Perangkat lunak" ini dilisensikan di bawah 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.