مكتبة GNU للحسابات متعددة الدقة

مكتبة GNU للحسابات متعددة الدقة ( GMP ) هي مكتبة مجانية لإجراء العمليات الحسابية بدقة اختيارية ، وتعمل على الأعداد الصحيحة الموقعة ، والأعداد النسبية ، والأعداد العشرية . [ 4 ] لا توجد حدود عملية للدقة باستثناء تلك التي تفرضها الذاكرة المتاحة (قد يصل حجم المعاملات إلى 2 ^32 - 1 بت على الأجهزة ذات 32 بت، و2 ^37 بت على الأجهزة ذات 64 بت). [ 5 ] [ 6 ] تتميز GMP بمجموعة غنية من الدوال، وتتمتع هذه الدوال بواجهة قياسية. الواجهة الأساسية مخصصة للغة C ، ولكن توجد أغلفة للغات أخرى، بما في ذلك Ada و C++ و C# و Julia و. NET و OCaml و Perl و PHP و Python و R و Ruby و Rust .

قبل عام 2008، كانت Kaffe ، وهي آلة افتراضية لجافا ، تستخدم GMP لدعم العمليات الحسابية المدمجة في جافا ذات الدقة العشوائية. [ 7 ] بعد ذلك بوقت قصير، أُضيف دعم GMP إلى GNU Classpath ، كواجهات خلفية لـ java.math.BigIntegerو java.math.BigDecimal. [ 8 ]

تتمثل التطبيقات المستهدفة الرئيسية لـ GMP في تطبيقات وأبحاث التشفير ، وتطبيقات أمن الإنترنت، وأنظمة الجبر الحاسوبي .

تهدف مكتبة GMP إلى أن تكون أسرع من أي مكتبة أخرى للحسابات ذات الدقة العشوائية (الأعداد الكبيرة) لجميع أحجام المعاملات. ومن أهم العوامل التي تُسهم في تحقيق ذلك ما يلي:

تم إصدار أول نسخة من GMP في عام 1991. ويتم تطويرها وصيانتها باستمرار. [ 9 ]

يُعد GMP جزءًا من مشروع GNU (على الرغم من أن موقعه الإلكتروني خارج gnu.org قد يسبب الارتباك)، ويتم توزيعه بموجب رخصة GNU العامة الصغرى (LGPL).

تُستخدم GMP في العمليات الحسابية للأعداد الصحيحة في العديد من أنظمة الجبر الحاسوبي مثل Mathematica [ 10 ] و Maple [ 11 ] . كما تُستخدم أيضًا في مكتبة خوارزميات الهندسة الحسابية (CGAL).

يُعد GMP ضروريًا لبناء مجموعة مترجمات GNU (GCC). [ 12 ]

واجهة مكتبة C

تحدد واجهة مكتبة C ما يلي:

  • mpz_t(عدد صحيح متعدد الدقة)
  • mpq_t(عدد نسبي متعدد الدقة)
  • mpf_t(عدد الفاصلة العائمة متعدد الدقة)
  • gmp_randstate_t(حالة عشوائية، تُستخدم لإنتاج أرقام عشوائية)

تُسبق الدوال باسم النوع (على سبيل المثال، تُسبق العمليات على الأعداد الصحيحة متعددة الدقة بـ mpz، إلخ).

توفر المكتبة أيضًا أدوات مساعدة إضافية (جميعها مسبوقة بـ gmp)، مثل gmp_scanf، gmp_printf، إلخ.

مثال

فيما يلي مثال على كود C يوضح استخدام مكتبة GMP لضرب وطباعة الأعداد الكبيرة:

#include <stdio.h> #include <gmp.h>int main ( void ) { mpz_t x , y , result ;mpz_init_set_str ( x , "7612058254738945" , 10 ); mpz_init_set_str ( y , "9263591128439081" , 10 ); mpz_init ( result );mpz_mul ( result , x , y ); gmp_printf ( " %Zd \n " "* \n " " %Zd \n " "-------------------- \n " "%Zd \n " , x , y , result );// تحرير الذاكرة المستخدمة mpz_clear ( x ); mpz_clear ( y ); mpz_clear ( result );return 0 ; }

يحسب هذا الكود قيمة7612058254738945×9263591128439081{\displaystyle 7612058254738945\times 9263591128439081}.

يؤدي تجميع هذا البرنامج وتشغيله إلى هذه النتيجة. ( -lgmpيتم استخدام هذا الخيار عند التجميع على أنظمة من نوع يونكس).

 7612058254738945 * 9263591128439081 -------------------- 70514995317761165008628990709545 

واجهة مكتبة C++

تحدد واجهة مكتبة C++ الفئات التالية:

  • mpz_class(يتوافق مع mpz_t)
  • mpq_class(يتوافق مع mpq_t)
  • mpf_class(يتوافق مع mpf_t)
  • gmp_randclass(يقدم أدوات توليد الأرقام العشوائية)

تُدمج الدوال المستقلة في مكتبة C كطرق في فئات C++. تضع مكتبة C++ جميع الرموز بشكل عام، ولا تستخدم مساحة اسم خاصة بها . يُنصح بتجنب استخدامها autoفي التصريحات. [ 13 ] وللعودة إلى نوع C، توفر كل فئة get_mp_t()طريقة مقابلة (على سبيل المثال mpz_class::get_mpz_t()).

مثال

للمقارنة، يمكن كتابة برنامج C++ المكافئ التالي بدلاً من ذلك. ( -lgmpxx -lgmpيتم استخدام العلامات عند التجميع على أنظمة من نوع Unix.)

استيراد < gmpxx . h > ; استيراد std ;int main () { mpz_class x ( "7612058254738945" ); mpz_class y ( "9263591128439081" ); mpz_class result = x * y ;std :: println ( "{} \ n " " * \n " " {} \n " " -------------------- \n " "{}" , x.get_str ( ), y.get_str ( ), result.get_str () );return 0 ; }

روابط اللغة

اسم المكتبةلغةرخصة
مكتبة جنو متعددة الدقةلغة C ، لغة C++إل جي بي إل
الرياضيات::GMPبيرلإل جي بي إل
Math::GMPz و Math::GMPf و Math::GMPqبيرلرخصة فنية الإصدار 1.0 + رخصة جنو العمومية الإصدار 1.0 أو أحدث
مشروع بايثون متعدد الدقة العامبايثونإل جي بي إل
حزمة R 'gmp'Rرخصة جنو العمومية
مشروع روبي جيمزروبيأباتشي 2.0
روابط Rust FFI لـ GMP و MPFR و MPCالصدأإل جي بي إل
مكتبة GNU متعددة الدقة للغة PHPPHPPHP
إجراءات GNU متعددة الدقة لـ SBCL، مؤرشفة بتاريخ 19 نوفمبر 2020 على موقع Wayback Machineلغة الشفرة الشائعةالملكية العامة
Ch GMPالفصلملكية خاصة
غلاف GMP متوازي لـ BMDFMBMDFM LISP – Cالملكية العامة
مترجم لغة هاسكل من غلاسكو (التنفيذ Integerهو في الأساس ربط بـ GMP)هاسكلبي إس دي
luajit-gmpLuaJITمعهد ماساتشوستس للتكنولوجيا
غلاف gmp لدلفيدلفيمعهد ماساتشوستس للتكنولوجيا
زاريثأوكاميلإل جي بي إل
مكتبة Math.Gmp.Native.شبكةمعهد ماساتشوستس للتكنولوجيا
nim-gmpنيممعهد ماساتشوستس للتكنولوجيا
JGMPجافاإل جي بي إل

انظر أيضاً

مراجع

  1. "أرشيف GNU MP" . تم الاطلاع عليه بتاريخ 2018-12-03 .
  2. ^ توربيورن جرانلوند (30 يوليو 2023). "تم إصدار GMP 6.3.0" . تم الاسترجاع في 30 يوليو 2023 .
  3. "ملاحظات إصدار GMP 6.3" .
  4. 1 2 "ما هي ممارسات التصنيع الجيدة؟" . تم الاطلاع عليه بتاريخ 2014-04-07 .
  5. غرانلوند، توربيورن (2009-07-06). "مشاكل مع mpz_set_str والسلاسل النصية الضخمة" . تم الاسترجاع في 2013-03-17 .
  6. "أخبار GMP 6.0" . تم الاطلاع عليه بتاريخ 2019-10-04 .
  7. هيوز، أندرو جون (28 فبراير 2008). "هل تم حذف حسابات GMP؟" . تم الاطلاع عليه بتاريخ 17 مارس 2013 .
  8. "GNU Classpath 0.98 "أن تأتي متأخراً خير من ألا تأتي أبداً"" . 2009-02-05 . تم الاسترجاع 2013-03-17 .
  9. "مكتبة GNU MP Bignum" . تم الاطلاع عليها بتاريخ 2018-12-03 .
  10. "نواة برنامج Mathematica: قضايا في التصميم والتنفيذ" . أكتوبر 2006. تم الاطلاع عليه بتاريخ 17-03-2013 .
  11. "مكتبة GNU للدقة المتعددة (GMP)" . مابل سوفت . تم الاطلاع عليه بتاريخ 17-03-2013 .
  12. يستخدم GCC مكتبة GNU MPFR ، التي بدورها تعتمد على GMP. "سلسلة إصدارات GCC 4.3: التغييرات والميزات الجديدة والإصلاحات" . 2012-11-02 . تم الاطلاع عليه بتاريخ 2013-03-17 .
  13. مكتبة GNU للحسابات متعددة الدقة. "قيود واجهة C++ 12.6" . gmplib.org . مشروع GNU.