TIntX هو منفذ Pascal من مكتبة Intx التعسفية الدقيقة العددية مع سريع ، حول O(N * log N) تطبيق خوارزميات الضرب/التقسيم. إنه يوفر جميع العمليات الحسابية الأساسية على الأعداد الصحيحة ، والمقارنة ، والتحول في اتجاهين ، وما إلى ذلك. كما يسمح أيضًا بتحليل أرقام في قواعد مختلفة وتحويلها إلى أي قاعدة. تتمثل ميزة هذه المكتبة في الضرب السريع والقسمة ومن خوارزميات تحويل قاعدة/إلى قاعدة. تعتمد جميع الإصدارات السريعة من الخوارزميات على الضرب السريع للأعداد الصحيحة الكبيرة باستخدام تحويل Hartley السريع الذي يتم تشغيله لـ O(N * log N * log log N) time بدلاً من O(N^2) .
بناء الحالة
فيما يلي عينة من التعليمات البرمجية التي تستخدم TIntX لحساب 42 في الطاقة 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 بحيث يكون استخدامه شفافًا للمطورين ، كما لو كنت تعمل مع الأعداد الصحيحة المعتادة.
تعمل مكتبة TIntX داخليًا بأرقام فاصلة عائمة عندما يتم إجراء الضرب باستخدام FHT (تحويل Hartley السريع) ، لذا في مرحلة ما يتوقف عن العمل بشكل صحيح ويفقد الدقة. لحسن الحظ ، تبدأ آثار الآثار الجانبية غير السارة في الظهور عندما يكون حجم عدد صحيح حوالي 2^28 بايت أي للأعداد الصحيحة الضخمة حقًا. على أي حال ، لالتقاط مثل هذه الأخطاء ، تمت إضافة بعض التعليمات البرمجية ، تحقق صحة نتيجة الضرب FHT في رمز - يتطلب الأمر آخر أرقامًا أخرى لكل عدد صحيح كبير ، وضربها باستخدام النهج الكلاسيكي ، ثم يقارن أرقام N الأخيرة من النتيجة الكلاسيكية مع آخر أرقام من نتيجة FHT (لذلك فهو نوع من فحص CRC مبسط). إذا تم العثور على أي تناقض ، يتم إلقاء EFhtMultiplicationException ؛ يمكن تعطيل هذا الشيك باستخدام الإعدادات العالمية.
للحصول على أرقام عدد صحيح ضخم حقًا (مثل 42 في Power 1048576 أعلاه) ، يمكن أن تستغرق استدعاء ToString() بعض الوقت لتنفيذها. هذا لأنه ، يتم تخزين أعداد TIntX كبيرة داخليًا على أنها رقم 2^32 -قسوة في صفيف 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.