TIntX เป็นพอร์ต Pascal ของ Library Integer Integer ที่มีความแม่นยำโดยพลการที่มีความรวดเร็วเกี่ยวกับการใช้งานการคูณ/การหารอัลกอริทึมการคูณ O(N * log N) มันให้การดำเนินการทางคณิตศาสตร์พื้นฐานทั้งหมดในจำนวนเต็มเปรียบเทียบการขยับแบบบิตตามมาเป็นต้นนอกจากนี้ยังช่วยให้ตัวเลขการแยกวิเคราะห์ในฐานที่แตกต่างกันและแปลงเป็นสตริงรวมถึงในฐานใด ๆ ข้อได้เปรียบของไลบรารีนี้คือการคูณการแบ่งและจากฐาน/ไปยังอัลกอริทึมการแปลงฐานอย่างรวดเร็ว อัลกอริทึมรุ่นที่รวดเร็วทั้งหมดจะขึ้นอยู่กับการคูณอย่างรวดเร็วของจำนวนเต็มขนาดใหญ่โดยใช้การแปลง Hartley อย่างรวดเร็วซึ่งทำงานสำหรับ O(N * log N * log log N) เวลาแทนที่จะเป็นคลาสสิก O(N^2)
สร้างสถานะ
นี่คือตัวอย่างของรหัสที่ใช้ TIntX เพื่อคำนวณ 42 in power 1048576 (ซึ่งคือ 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.
ฟังก์ชั่นอื่น ๆ ที่ใช้ภายในโดยฉันคือ
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 ดังนั้นการใช้งานจึงโปร่งใสสำหรับนักพัฒนาเช่นถ้าคุณทำงานกับจำนวนเต็มปกติ
Library TIntX ภายในทำงานด้วยหมายเลขจุดลอยตัวเมื่อการคูณโดยใช้ FHT (Fast Hartley Transform) จะดำเนินการดังนั้นในบางจุดจะหยุดทำงานอย่างถูกต้องและสูญเสียความแม่นยำ โชคดีที่เอฟเฟกต์ผลข้างเคียงที่ไม่พึงประสงค์นี้เริ่มปรากฏขึ้นเมื่อขนาดจำนวนเต็มประมาณ 2^28 ไบต์เช่นจำนวนเต็มขนาดใหญ่จริงๆ อย่างไรก็ตามในการจับข้อผิดพลาดดังกล่าวบางรหัสถูกเพิ่มเข้ามาให้การตรวจสอบความถูกต้องของการคูณ FHT ในรหัส - ต้องใช้ตัวเลขสุดท้ายของจำนวนเต็มขนาดใหญ่แต่ละตัวทวีคูณพวกเขาโดยใช้วิธีการคลาสสิกจากนั้นเปรียบเทียบตัวเลขคลาสสิกสุดท้ายกับตัวเลข N สุดท้ายของผลลัพธ์ FHT หากพบความไม่สอดคล้องกันใด ๆ EFhtMultiplicationException จะถูกโยนลงไป การตรวจสอบนี้สามารถปิดใช้งานได้โดยใช้การตั้งค่าทั่วโลก
สำหรับตัวเลขจำนวนเต็มขนาดใหญ่จริง ๆ (เช่น 42 ใน Power 1048576 ด้านบน) การ ToString() อาจใช้เวลาพอสมควรในการดำเนินการ นี่เป็นเพราะจำนวนเต็มขนาดใหญ่ TIntX ภายในถูกเก็บไว้เป็นหมายเลข 2^32 -base ในอาร์เรย์ UInt32 และเพื่อสร้างเอาต์พุตสตริงทศนิยมควรแปลงจากฐาน 2^32 เป็นฐานทศนิยม วิธีการจัดเก็บตัวเลขดังกล่าวได้รับการคัดเลือกอย่างตั้งใจ-ทำให้ ToString() ช้าลง แต่ใช้หน่วยความจำอย่างมีประสิทธิภาพและทำให้การทำงานแบบดั้งเดิมบนตัวเลขเร็วกว่ากำลังของการจัดเก็บ 10 ฐาน (ซึ่งจะทำให้การทำงานของ ToString() ทำงานได้เร็วขึ้น) และการคำนวณมักจะใช้บ่อยกว่า ToString()
คอมไพเลอร์ที่รองรับ
FreePascal 3.0.0 and Above.
Delphi 2010 and Above.
การติดตั้งไลบรารี
วิธีที่หนึ่ง:
ใช้แพ็คเกจที่ให้ไว้ในโฟลเดอร์ "แพ็คเกจ"
วิธีที่สอง:
เพิ่มเส้นทางไลบรารีและเส้นทางย่อยไปยังเส้นทางการค้นหาโครงการของคุณ
การทดสอบหน่วย
เพื่อเรียกใช้การทดสอบหน่วย
สำหรับ FPC 3.0.0 ขึ้นไป
Simply compile and run "IntXLib.Tests" project in "FreePascal.Tests" Folder.
วิธีการที่หนึ่ง (ใช้ 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.
วิธีที่สอง (ใช้ 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..
###ใบอนุญาต
"ซอฟต์แวร์" นี้ได้รับใบอนุญาตภายใต้ 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.