
(
مصدر الشكل )
من المعروف أن Sieve of Eratosthenes (RE) هي واحدة من أقدم الخوارزميات التي ظهرت قبل اختراع أجهزة الكمبيوتر بوقت طويل. لذلك ، قد تعتقد أن هذه الخوارزمية قد درست على مدار القرون لأعلى ولأسفل ولا يمكن إضافة أي شيء إليها. إذا نظرت إلى ويكيبيديا ، هناك بحر من الإشارات إلى مصادر موثوقة يمكنك من خلالها الغرق بسهولة. لذلك ، فوجئت عندما اكتشفت بالصدفة في اليوم الآخر أن
الخيار المقدم على النحو الأمثل على ويكيبيديا يمكن تحسينه بشكل كبير.
كان هكذا. في مناقشة لمقال عن البرمجة الوظيفية (FP) ، سأل
سؤالًا : كيفية كتابة تعلم اللغة الألمانية في هذا النموذج. امتلاك أكثر من المعرفة الضئيلة بالعربية ، لا أجرؤ على الحكم على الإجابات ، لكن المشاركين الآخرين في المناقشة رفضوا بعض الحلول المقترحة على الفور ، مشيرين إلى أنه بدلاً من التعقيد النظري
O(n log logn) (1)سيكون للتطبيق المقترح تعقيد حسابي
O(n2/ logn) (2)وبهذا التعقيد ، لا يمكنك الانتظار عند فرز 10 ملايين رقم على سبيل المثال. أصبحت مهتمًا وحاولت تنفيذ الإصدار الأمثل وفقًا ليكيبيديا ، باستخدام البرمجة الإجرائية المعتادة. في Delphi-7 ، حصلت على الكود التالي:
قائمة 1program EratosthenesSieve;
تمثل RE صفيف Boolean الغربال ذي قيم معاكسة - إذا كان الرقم أوليًا ، فسيتم الإشارة إليه على أنه خطأ ، مما يقلل من عدد عمليات النفي (لا) أثناء غربلة. هناك 3 إجراءات في البرنامج: تهيئة RE - init ، والحسابات (غربلة وتصحيح الأرقام في RE) - calc ، وطباعة الأعداد الأولية الموجودة كنتيجة - طباعة ، ويتم حساب عدد الأرقام التي تم العثور عليها. سألفت الانتباه بشكل خاص إلى إخراج التعليقات التمهيدية في إجراء الطباعة: للاختبار عند N = 1000 ، تتم إزالة التعليق.
هنا في إجراء calc ، استخدم توصية Wikipedia: بالنسبة للرقم الأولي التالي i ، احذف الأرقام من RE
i2،i2+i،i2+2i،...
غربل هذا البرنامج مليار رقم في 17.6 ثانية. على جهاز الكمبيوتر (3.4 جيجاهيرتز Intel Core i7 CPU).
بعد أن صنعت هذا البرنامج ، تذكرت فجأة الخصائص المعروفة
للأرقام الفردية والزوجية .
Lemma 1. 1) فردي + فردي = متساوي ؛ 2) غريب + حتى = غريب ؛ 3) حتى + حتى = حتى.دليل1)
(2n+1)+(2m+1)=2n+2m+2 القسمة على 2. TCD.
2)
(2n+1)+(2m)=2n+2m+1 غير قابل للقسمة على 2 دون الباقي. وهو المطلوب.
3)
(2n)+(2m)=2n+2m القسمة على 2. TCD.
Lemma 2. مربع رقم فردي هو رقم فردي.برهان. (2n+1)2=4n2+4n+1 غير قابل للقسمة على 2 دون الباقي. وهو المطلوب.
المذكرة. عدد أولي أكبر من 2 غريب.لذلك ، يمكنك فقط حذف الأرقام الفردية:
i2،i2+2i،i2+4i،... (3)لكن أولاً تحتاج إلى شطب جميع الأرقام الزوجية. يتم ذلك عن طريق إجراء تهيئة التهيئة المعدلة.
ادراج 2 program EratosthenesSieve;
هذا البرنامج يعمل لمدة 9.9 ثانية. - تقريبا أسرع مرتين.
لتقييم المراسلات العملية في الوقت الحقيقي للبرنامج إلى النظرية ، اقترحت ذلك
dt=C∗O،
حيث
dt - قياس وقت التشغيل ؛
C - ثابت مع البعد الزمني ؛
يادولا - التقييم النظري.
تحسب من هنا
C لتقييم (1) و (2). إلى
N=106 و أقل
dt قريبة من الصفر. لذلك ، أحمل البيانات على البرنامج الأول للكبير
N.كما نرى ، فإن التقدير (1) أقرب بكثير إلى النتائج الحقيقية. بالنسبة للبرنامج الثاني ، لوحظ صورة مماثلة. أشك كثيراً في أنني اكتشفت أمريكا تستخدم التسلسل (3) ، وسأكون ممتنًا جدًا للارتباط بالعمل الذي تم تطبيق هذا النهج عليه. على الأرجح ، غرق مؤلفو ويكيبيديا أنفسهم في بحر من المعلومات حول الحرب الإلكترونية وغابوا عن هذا العمل.
سكرتير خاص لخوارزمية ويكيبيديا مع "وقت التشغيل الخطي"
انظر