خوارزمية القاسم المشترك الأكبر الثنائي

خوارزمية القاسم المشترك الأكبر الثنائية ، والمعروفة أيضًا بخوارزمية شتاين أو خوارزمية إقليدس الثنائية ، [ 1 ] [ 2 ] هي خوارزمية لحساب القاسم المشترك الأكبر (GCD) لعددين صحيحين غير سالبين. تستخدم خوارزمية شتاين عمليات حسابية أبسط من خوارزمية إقليدس التقليدية ؛ إذ تستبدل القسمة بعمليات الإزاحة الحسابية والمقارنات والطرح.
على الرغم من أن الخوارزمية في شكلها المعاصر نُشرت لأول مرة من قبل الفيزيائي والمبرمج جوزيف شتاين في عام 1967، [ 3 ] إلا أنها كانت معروفة بحلول القرن الثاني قبل الميلاد، في الصين القديمة. [ 4 ]
الخوارزمية
تجد الخوارزمية القاسم المشترك الأكبر لعددين غير سالبينومن خلال تطبيق هذه المتطابقات بشكل متكرر:
- كل شيء يقسم الصفر، وهو أكبر عدد يقسم.
- :هو قاسم مشترك.
- لوغريب:إذن فهو ليس قاسمًا مشتركًا.
- لوغريب و.
بما أن القاسم المشترك الأكبر تبادلي ()، تظل تلك المتطابقات سارية حتى في حالة تبديل المعاملات:،لوغريب، إلخ.
تطبيق
على الرغم من صحة الوصف المذكور أعلاه للخوارزمية من الناحية الرياضية، إلا أن خوارزمية القاسم المشترك الأكبر الثنائية تُجري عددًا أكبر من التكرارات الحلقية مقارنةً بالخوارزمية الإقليدية، لذا فهي لا تُقدم ميزة في الأداء إلا إذا كانت هذه التكرارات أسرع بكثير. وتختلف تطبيقات البرامج عالية الأداء عنها عادةً في بعض الجوانب البارزة:
- تجنب التقسيم التجريبي المتكرر بواسطةلصالح عملية العد البدائية للأصفار اللاحقة وإزاحة بت واحد ، وهو ما يعادل وظيفيًا تطبيق الهوية 3 بشكل متكرر، ولكنه أسرع بكثير؛
- التعبير عن الخوارزمية بشكل تكراري بدلاً من التكراري : يمكن تصميم التنفيذ الناتج لتجنب العمل المتكرر، وذلك باستدعاء المتطابقة 2 في البداية والحفاظ على أن كلا العددين فرديان عند دخول الحلقة، والتي تحتاج فقط إلى تنفيذ المتطابقتين 3 و4؛ و
- جعل جسم الحلقة خالياً من التفرعات باستثناء شرط الخروج : يمكن أن يكون للتفرعات غير المتوقعة تأثير سلبي كبير على الأداء. [ 5 ] [ 6 ]
v==0
فيما يلي تطبيق للخوارزمية بلغة C.
// عدّ الأصفار اللاحقة. هذا مثال تعليمي فقط؛ // لتحسين الأداء، استخدم __builtin_ctzll() أو ما شابه. static int ctz ( uint64_t n ) { int s = 0 , t ; while (( t = n & 15 ) == 0 ) { n >>= 4 ; s += 4 ; } return s + (( 0x12131210 >> 2 * t ) & 3 ); } uint64_t gcd ( uint64_t u , uint64_t v ) { if ( ! u || ! v ) return u | v ; // العنصر المحايد رقم 1 int shift = ctz ( u | v ); u >>= ctz ( u ); uint64_t min , max ; while ( v ) { v >>= ctz ( v ); // العنصر المحايد رقم 3 min = ( u < v ) ? u : v ; // المتطابقة رقم 4 max = ( u > v ) ? u : v ; u = min ; v = max - min ; } return u << shift ; // المتطابقة رقم 2 }فيما يلي تطبيق للخوارزمية بلغة Rust يوضح تلك الاختلافات، وهو مقتبس من uutils . التبادل الشرطي لـو(ضمان) يتم تجميعها إلى حركات مشروطة ؛ [ 7 ] :
pub fn gcd ( mut u : u64 , mut v : u64 ) -> u64 { // الحالات الأساسية: gcd(n, 0) = gcd(0, n) = n if u == 0 { return v ; } else if v == 0 { return u ; }// باستخدام المتطابقتين 2 و3: // القاسم المشترك الأكبر (2ⁱ u, 2ʲ v) = 2ᵏ القاسم المشترك الأكبر (u, v) حيث u وv عددان فرديان و k = min(i, j) // 2ᵏ هو أكبر قوة للعدد 2 تقسم كلاً من 2ⁱ u و2ʲ v let i = u.trailing_zeros ( ) ; u >>= i ; let j = v.trailing_zeros ( ) ; v >>= j ; let k = i.min ( j ) ;حلقة { // u و v عددان فرديان في بداية الحلقة debug_assert! ( u % 2 == 1 , "u = {} يجب أن يكون عددًا فرديًا" , u ); debug_assert! ( v % 2 == 1 , "v = {} يجب أن يكون عددًا فرديًا" , v );// قم بالتبديل إذا لزم الأمر بحيث يكون u ≤ v إذا كان u > v { ( u , v ) = ( v , u ); }// المتطابقة 4: القاسم المشترك الأكبر (u, v) = القاسم المشترك الأكبر (u, vu) لأن u ≤ v و u و v كلاهما فرديان v -= u ; // v الآن زوجيإذا كانت قيمة v تساوي صفرًا { // العنصر المحايد 1: القاسم المشترك الأكبر (u, 0) = u // الإزاحة بمقدار k ضرورية لإعادة إضافة العامل 2ᵏ الذي تم حذفه قبل الحلقة return u << k ; }// المتطابقة 3: القاسم المشترك الأكبر (u, 2ʲ v) = القاسم المشترك الأكبر (u, v) لأن u عدد فردي ، v >> = v.trailing_zeros (); } }ملاحظة : يقبل التطبيق أعلاه أعدادًا صحيحة غير سالبة؛ مع العلم أنيمكن التعامل مع الحالة الموقعة على النحو التالي:
/// يحسب القاسم المشترك الأكبر لعددين صحيحين مُوقّعين من 64 بت /// النتيجة غير مُوقّعة، ولا يمكن تمثيلها دائمًا كـ i64: gcd(i64::MIN, i64::MIN) == 1 << 63 pub fn signed_gcd ( u : i64 , v : i64 ) -> u64 { gcd ( u . unsigned_abs (), v . unsigned_abs ()) }تعقيد
يتطلب الخوارزمية، من الناحية التقاربية ،خطوات، حيثيمثل عدد البتات في العدد الأكبر من العددين، حيث أن كل خطوتين تقللان أحد المعاملات على الأقل بمعامل واحد على الأقل منتتضمن كل خطوة بضع عمليات حسابية فقط ((مع ثابت صغير)؛ عند التعامل مع أرقام بحجم الكلمات ، تُترجم كل عملية حسابية إلى عملية آلة واحدة، لذا فإن عدد عمليات الآلة يكون في حدود، أي.
بالنسبة للأعداد الكبيرة بشكل تعسفي، فإن التعقيد التقاربي لهذه الخوارزمية هو[ 8 ] بما أن كل عملية حسابية (الطرح والإزاحة) تتضمن عددًا خطيًا من عمليات الآلة (عملية واحدة لكل كلمة في التمثيل الثنائي للأعداد). إذا أمكن تمثيل الأعداد في ذاكرة الآلة، أي إذا أمكن تمثيل حجم كل عدد بكلمة آلة واحدة، فإن هذا الحد يتقلص إلى:
وهذا ينطبق أيضاً على خوارزمية إقليدس، على الرغم من أن تحليلاً أكثر دقة أجراه أخافي وفالي أثبت أن القاسم المشترك الأكبر الثنائي يستخدم عمليات بت أقل بنسبة 60% تقريباً. [ 9 ]
الإضافات
يمكن توسيع خوارزمية القاسم المشترك الأكبر الثنائي بعدة طرق، إما لإخراج معلومات إضافية، أو للتعامل مع الأعداد الصحيحة الكبيرة بشكل أكثر كفاءة، أو لحساب القاسم المشترك الأكبر في مجالات أخرى غير الأعداد الصحيحة.
تتناسب خوارزمية القاسم المشترك الأكبر الثنائي الموسعة ، المشابهة لخوارزمية إقليدس الموسعة ، مع النوع الأول من التوسيع، حيث أنها توفر معاملات بيزو بالإضافة إلى القاسم المشترك الأكبر: أعداد صحيحة.وبحيث[ 10 ] [ 11 ] [ 12 ]
في حالة الأعداد الصحيحة الكبيرة، يكون أفضل تعقيد تقاربي هو، معتكلفةالضرب الثنائي؛ هذه العملية شبه خطية وأصغر بكثير من خوارزمية القاسم المشترك الأكبر الثنائيةمع ذلك، لا تتفوق التطبيقات العملية على الخوارزميات القديمة إلا للأعداد الأكبر من 64 كيلوبت تقريبًا ( أي أكبر من 8 × 10^ 19265 ). ويتحقق ذلك بتوسيع خوارزمية القاسم المشترك الأكبر الثنائية باستخدام أفكار من خوارزمية شونهاج-ستراسن لضرب الأعداد الصحيحة بسرعة. [ 13 ]
تم توسيع خوارزمية القاسم المشترك الأكبر الثنائي لتشمل مجالات أخرى غير الأعداد الطبيعية، مثل الأعداد الصحيحة الغاوسية ، [ 14 ] وأعداد أيزنشتاين ، [ 15 ] والحلقات التربيعية، [ 16 ] [ 17 ] وحلقات الأعداد الصحيحة لحقول الأعداد . [ 18 ]
وصف تاريخي
كانت خوارزمية حساب القاسم المشترك الأكبر لعددين معروفة في الصين القديمة، في عهد أسرة هان ، كطريقة لتبسيط الكسور:
إن أمكن، قسّم الناتج على اثنين؛ وإلا، خذ المقام والبسط، واطرح الأصغر من الأكبر، وكرر ذلك بالتناوب حتى يصبح الناتج متساوياً. ثم اطرح نفس العدد من البسط والمقام.
— فانغتيان – مسح الأراضي، الفصول التسعة في الفن الرياضي
عبارة "إن أمكن، قم بتقسيمها إلى النصف" غامضة، [ 4 ]
- إذا انطبق هذا عندما يصبح أي من العددين زوجيًا، فإن الخوارزمية هي خوارزمية القاسم المشترك الأكبر الثنائي؛
- إذا كان هذا ينطبق فقط عندما يكون كلا الرقمين زوجيين، فإن الخوارزمية تشبه خوارزمية إقليدس .
انظر أيضاً
مراجع
- ↑ برنت، ريتشارد ب. (13-15 سبتمبر 1999). عشرون عامًا من تحليل خوارزمية إقليدس الثنائية . ندوة أكسفورد-مايكروسوفت لعام 1999 تكريمًا للأستاذ السير أنتوني هوار. أكسفورد.
- ↑ برنت، ريتشارد ب. (نوفمبر 1999). تحليل إضافي لخوارزمية إقليدس الثنائية (تقرير فني). مختبر الحوسبة بجامعة أكسفورد. arXiv : 1303.2772 . PRG TR-7-99.
- ↑ شتاين، ج. (فبراير 1967)، "المسائل الحسابية المرتبطة بجبر راكا"، مجلة الفيزياء الحاسوبية ، 1 (3): 397-405 ، Bibcode : 1967JCoPh...1..397S ، doi : 10.1016/0021-9991(67)90047-2 ، ISSN 0021-9991
- 1 2 كنوت، دونالد (1998)، الخوارزميات شبه العددية ، فن برمجة الحاسوب ، المجلد 2 ( الطبعة الثالثة)، أديسون-ويسلي، ISBN 978-0-201-89684-8
- ↑ كابور، راجيف (21 فبراير 2009). "تجنب تكلفة التنبؤ الخاطئ بالتفرعات" . منطقة مطوري إنتل .
- ↑ ليمير، دانيال (15 أكتوبر 2019). "يمكن أن تؤدي الفروع المتوقعة بشكل خاطئ إلى مضاعفة أوقات التشغيل" .
- ↑ جودبولت، مات. "مستكشف المترجمات" . تم الاطلاع عليه في 4 فبراير 2024 .
- ↑ "GNU MP 6.1.2: Binary GCD" .
- ↑ أخافي، علي؛ فالي، بريجيت (2000)، "متوسط تعقيد البتات للخوارزميات الإقليدية" ، وقائع مؤتمر ICALP'00، سلسلة محاضرات علوم الحاسوب 1853 : 373-387 ، CiteSeerX 10.1.1.42.7616
- ↑ كنوت 1998 ، ص 646 ، إجابة التمرين 39 من القسم 4.5.2
- ↑ مينيز، ألفريد جيه؛ فان أورشوت، بول سي؛ فانستون، سكوت أ. (أكتوبر 1996). "§14.4 خوارزميات القاسم المشترك الأكبر" (ملف PDF) . دليل التشفير التطبيقي . مطبعة CRC. الصفحات 606-610 . ISBN 0-8493-8523-7تم الاطلاع عليه بتاريخ 9 سبتمبر 2017 .
- ↑ كوهين، هنري (1993). "الفصل 1 : الخوارزميات الأساسية لنظرية الأعداد". دورة في نظرية الأعداد الجبرية الحاسوبية . نصوص الدراسات العليا في الرياضيات . المجلد 138. سبرينغر-فيرلاغ . الصفحات 17-18 . ISBN 0-387-55640-0.
- ↑ ستيل، داميان؛ زيمرمان، بول (2004)، "خوارزمية القاسم المشترك الأكبر الثنائية المتكررة" (ملف PDF) ، نظرية الأعداد الخوارزمية ، سلسلة محاضرات في علوم الحاسوب، المجلد 3076، سبرينغر، برلين، الصفحات 411-425 ، CiteSeerX 10.1.1.107.8612 ، doi : 10.1007/978-3-540-24847-7_31 ، ISBN 978-3-540-22156-2, MR 2138011 , S2CID 3119374 , تقرير بحث INRIA RR-5050 .
- ↑ ويلرت، أندريه (يوليو 2000). "حساب القاسم المشترك الأكبر (1+i) في Z [ i ] كنموذج لخوارزمية القاسم المشترك الأكبر الثنائية" . مجلة الحساب الرمزي . 30 (5): 605-617 . doi : 10.1006/jsco.2000.0422 .
- ^ دامغارد، إيفان بييري؛ فراندسن ، جودموند سكوفبيرج (12-15 أغسطس 2003). خوارزميات فعالة لـ GCD والبقايا المكعبة في حلقة الأعداد الصحيحة لأيزنشتاين . الندوة الدولية الرابعة عشرة حول أساسيات نظرية الحساب. مالمو ، السويد. ص 109 – 117. دوى : 10.1007 / 978-3-540-45077-1_11 .
- ↑ أغاروال، سوراب؛ فراندسن، غودموند سكوفبيرغ (13-18 يونيو 2004). خوارزميات شبيهة بالقاسم المشترك الأكبر الثنائي لبعض الحلقات التربيعية المعقدة . ندوة نظرية الأعداد الخوارزمية. برلينغتون، فيرمونت ، الولايات المتحدة الأمريكية. ص 57-71 . doi : 10.1007/978-3-540-24847-7_4 .
- ↑ أغاروال، سوراب؛ فراندسن، غودموند سكوفبيرغ (20-24 مارس 2006). خوارزمية جديدة لإيجاد القاسم المشترك الأكبر لحلقات الأعداد التربيعية ذات التحليل الفريد . الندوة اللاتينية الأمريكية السابعة حول المعلوماتية النظرية. فالديفيا، تشيلي. ص 30-42 . doi : 10.1007/11682462_8 .
- ↑ ويكستروم، دوغلاس (11-15 يوليو 2005). حول خوارزمية القاسم المشترك الأكبر من الرتبة l في حلقات الأعداد الصحيحة . الأوتوماتا واللغات والبرمجة، الندوة الدولية الثانية والثلاثون. لشبونة، البرتغال. ص 1189-1201 . doi : 10.1007/11523468_96 .
للمزيد من القراءة
- كنوت، دونالد (1998). "الفقرة 4.5 الحساب الكسري". الخوارزميات شبه العددية . فن برمجة الحاسوب . المجلد 2 ( الطبعة الثالثة). أديسون-ويسلي. الصفحات 330-417 . ISBN 978-0-201-89684-8.
يغطي هذا التقرير حساب القاسم المشترك الأكبر الثنائي الموسع، بالإضافة إلى تحليل احتمالي للخوارزمية.
- كوهين، هنري (1993). "الفصل 1 : الخوارزميات الأساسية لنظرية الأعداد". دورة في نظرية الأعداد الجبرية الحاسوبية . نصوص الدراسات العليا في الرياضيات . المجلد 138. سبرينغر-فيرلاغ . الصفحات 12-24 . ISBN 0-387-55640-0.
يغطي مجموعة متنوعة من المواضيع، بما في ذلك خوارزمية GCD الثنائية الموسعة التي تُخرج معاملات بيزو ، والمعالجة الفعالة للأعداد الصحيحة متعددة الدقة باستخدام نوع مختلف من خوارزمية GCD الخاصة بـ Lehmer ، والعلاقة بين GCD وتوسعات الكسور المستمرة للأعداد الحقيقية.
- فالي، بريجيت (سبتمبر-أكتوبر 1998). "ديناميكيات خوارزمية إقليدس الثنائية: التحليل الوظيفي والمؤثرات" . مجلة Algorithmica . 22 (4): 660-685 . doi : 10.1007/PL00009246 . S2CID 27441335. مؤرشف من الأصل (PS) في 13 مايو 2011.
تحليل الخوارزمية في الحالة المتوسطة، من خلال عدسة التحليل الوظيفي : يتم صياغة المعلمات الرئيسية للخوارزميات كنظام ديناميكي ، وترتبط قيمتها المتوسطة بالمقياس الثابت لمؤثر نقل النظام .
روابط خارجية
- قاموس المعهد الوطني للمعايير والتكنولوجيا للخوارزميات وهياكل البيانات: خوارزمية القاسم المشترك الأكبر الثنائي
- خوارزمية قطع العقدة: خوارزمية إقليدس الثنائية على موقع cut-the-knot
- تحليل خوارزمية إقليدس الثنائية (1976)، وهي ورقة بحثية لريتشارد ب. برنت ، تتضمن صيغة معدلة تستخدم الإزاحات إلى اليسار.
- خوارزميات نظرية الأعداد
