في التعليقات على واحدة من
المشاركات السابقة حول غربال إراتوستين ، تم ذكر الخوارزمية القصيرة من
ويكيبيديا :
الخوارزمية 1:1: i := 2, 3, 4, ..., n: 2: lp[i] = 0: 3: lp[i] := i 4: pr[] += {i} 5: p pr p ≤ lp[i] p*i ≤ n: 6: lp[p*i] := p : lp - n pr - n.
الخوارزمية بسيطة ، ولكنها ليست واضحة للجميع. المشكلة الرئيسية هي أنه لا يوجد دليل على ويكيبيديا ، وأن
الرابط إلى المصدر (
pdf ) يحتوي على خوارزمية مختلفة إلى حد ما عما سبق.
آمل أن أتمكن في هذا المنشور من إثبات أن هذه الخوارزمية لا تعمل فحسب ، بل تعمل أيضًا من أجل التعقيد الخطي.
ملاحظة حول تعقيد الخوارزميةعلى الرغم من أن هذه الخوارزمية أسرع من
الغربال القياسي
لـ Eratosthenes في O (n log log n) ، إلا أنها تتطلب ذاكرة أكبر بكثير. لذلك ، بالنسبة إلى n كبيرة حقًا ، حيثما تسطع هذه الخوارزمية بكل مجدها ، فإنها غير قابلة للتطبيق. ومع ذلك ، فإنه مفيد للغاية حتى بالنسبة للعدد الصغير ، إذا كنت لا تحتاج فقط إلى العثور على جميع الأعداد الأولية ، ولكن أيضًا عامل جميع الأرقام بسرعة حتى n.
حدد
m a t h c a l P - الكثير من الأعداد الأولية.
ل ف ( س ) - الحد الأدنى للقسمة الأولية لعدد:
lp (x) = دقيقة \ {p \ in \ mathcal {P} \ \ vert \ p \ vert x \}lp (x) = دقيقة \ {p \ in \ mathcal {P} \ \ vert \ p \ vert x \}rd(x) - عوامل أخرى:
rd(x)=x/lp(x)يرجى ملاحظة أن جميع التعاريف المذكورة أعلاه هي ل
x ge2 .
بعض الخصائص الواضحة للوظائف المقدمة أعلاه ، والتي سيتم استخدامها لاحقًا:
lp(a timesb)=min(lp(a)،lp(b))rd(x)<xp in mathcalP=>lp(p)=pدليل
ليما 1 :
lp(x) lelp(rd(x))، forallx notin mathcalP،x>1دليل : لأن أي المقسوم عليه
rd(x) أيضا مقسم
x و
lp(x) ليست متفوقة على أي المقسوم عليها
x ثم
lp(x) لا يتجاوز أي المقسوم عليه
rd(x) بما في ذلك أصغر منهم. المشكلة الوحيدة في هذا البيان هي إذا
rd(x) ليس لديه مقسومات بسيطة ، ولكن هذا ممكن فقط إذا
x in mathcalP وهو مستبعد في حالة اللمة.
مربعسمح
E = \ {(lp (x) ، rd (x)) \ vert \ forall x \ notin \ mathcal {P} ، 2 \ le x \ le n \}لأن
lp(x) timesrd(x)=x (بحكم التعريف
rd() ) ، إذا تلقينا الكثير
E ثم يمكننا حساب
lp() لجميع الأرقام المركبة تصل إلى ن. يتم ذلك ، على سبيل المثال ، بواسطة الخوارزمية التالية:
الخوارزمية 2: 1: (l,r) E: 2: lp[l*r] := l;
لاحظ ذلك
vertE vert len لذلك الخوارزمية 2 أعلاه تعمل من أجل تعقيد خطي.
علاوة على ذلك ، سأثبت أن الخوارزمية 1 من ويكيبيديا تتكرر فعليًا على جميع عناصر هذه المجموعة ، لأنه يمكن تحديدها بطريقة مختلفة.
سمح
E '= \ {(p، r) \ vert p \ in \ mathcal {P} ، 2 \ le r <n ، p \ le lp (r) ، p \ times r \ le n \}ليما 2 :
E=E′دليل :
سمح
(a،b) inE =>
موجودx notin mathcalP، 2 lex len mida=lp(x)،b=rd(x) .
بحكم التعريف
lp()،rd() :
a in mathcalP .
a timesb=x . بواسطة Lemma 1 ،
a lelp(b) .
ل
rd(x)<x ثم
b<n .
كما
x notin mathcalP .
ب جنرالالكتريك2دولا .
أيضا ، بحكم التعريف
E .
x len من هنا
a timesb len .
كل 4 شروط
E′ الوفاء بالوسائل
(a،b) inE′ =>
E subsetE′ .
سمح
(a،b) inE′ . سمح
x=a timesb .
بحكم التعريف
E′ .
a in mathcalP . وبالتالي،
دولا - الفجوة البسيطة
x .
lp(x)=lp(a timesb)=min(lp(a)،lp(b))=min(a،lp(b)).المعارف التقليدية
a lelp(b) ثم
lp(x)=a. وبالتالي،
b=rd(x).بحكم التعريف ،
x=a timesb len. من الواضح أيضا
x=a timesb ge2.جميع الظروف ل
E اكتمل =>
E′ subsetE.لذلك،
E=E′. مربعالآن يبقى فرز تلك الصحيحة
ص و
ع من تعريف المجموعة
E′ وتطبيق الخوارزمية 2. هذا هو بالضبط ما تفعله الخوارزمية 1 (يتم استخدام المتغير i فقط بدلاً من r). لكن هناك مشكلة! للفرز من خلال جميع عناصر مجموعة
E′ لحساب
lp، نحن بحاجة إلى معرفة
lp، لأن هناك شرط في التعريف
p lelp(r) .
لحسن الحظ ، هذه المشكلة تدور حول ترتيب الفرز الصحيح. من الضروري الفرز
ص في الحلقة الخارجية ، و
ع - في الداخل. ثم
lp(r) سيتم بالفعل حسابها. هذه الحقيقة أثبتتها النظرية التالية.
نظرية 1:الخوارزمية 1 تدعم الثابت التالي: بعد التكرار للحلقة الخارجية لـ i = k ، سيتم إبراز جميع الأعداد الأولية حتى k ضمناً في pr. سوف تحسب أيضا
lp() للجميع
x notin mathcalP midx len، rd(x) lek في مجموعة ليرة لبنانية.
دليل :
نثبت بالتحريض. بالنسبة إلى k = 2 ، يتم التحقق من الثابت يدويًا. ستتم إضافة الرقم 2 الأساسي الأول إلى قائمة العلاقات العامة ، لأن الصفيف lp [] مملوء في البداية بالأصفار. أيضا ، رقم مركب الوحيد الذي
rd(x) le2 هو 4. من السهل التحقق من أن الحلقة الداخلية ستنفذ مرة واحدة بالضبط (على n> 3) وتنفيذ lp [4]: 2 بشكل صحيح.
لنفترض الآن أن الثابت يحمل التكرار i = k-1. دعنا نثبت أنه سيكون صالحًا أيضًا للتكرار i = k.
للقيام بذلك ، يكفي التحقق من أنه سيتم إضافة الرقم i ، إذا كان أولي ، إلى القائمة pr و ذلك
lp() سيتم حسابها لجميع الأرقام المركبة
x len، بما في ذلك
rd(x)=i. هذه الأرقام من الثابت لـ k غير المشمولة بالفعل من قبل الثابت لـ k-1.
إذا كنت بسيطًا ، فسيكون lp [i] صفرًا ، لأن عملية الكتابة الوحيدة إلى الصفيف lp ، والتي من الناحية النظرية يمكنها حساب lp [i] (على السطر 6) ، تكتب دائمًا إلى مؤشرات مركبة ، لأن p * i (لـ i> 1) - دائما مركب. لذلك ، سيتم إضافة الرقم i إلى قائمة الأعداد الأولية. أيضًا ، في السطر 3 ، سيتم حساب lp [i].
إذا كنت مركبًا ، فسيتم حساب بداية التكرار lp [i] بالفعل من قبل الثابت لـ i = k-1 ، لأن
rd(i)<i أو
rd(i) lei−1، لذلك ، أنا يقع تحت الشرط الثابت في التكرار السابق. لذلك ، لن يتم إضافة الرقم المركب إلى قائمة الأعداد الأولية.
علاوة على ذلك ، بوجود lp [i] الصحيح وجميع الأعداد الأولية حتى i inclusive ، ستكرر الحلقة في الأسطر 5-6 على جميع العناصر
(p،i) inE′ حيث الجزء الثاني هو:
- p inP، لأنه من القائمة العلاقات العامة
- p lelp(i)، بشرط لإيقاف الدورة
- p timesi len، بشرط لإيقاف الدورة
- i<n، يتبع من p timesi len، p>1
جميع الأعداد الأولية اللازمة في قائمة العلاقات العامة هي ، لأن فقط أرقام تصل إلى
lp(i) lei . لذلك ، سيتم حساب قيم lp [] لجميع الأرقام المركبة
x من اجل ذلك
rd(x)=i . هذه هي بالضبط جميع الأرقام التي كانت مفقودة أثناء الانتقال من الثابت ل k-1 إلى الثابت ل k.
لذلك ، يحمل ثابت لأي i = 2..n.
مربعبواسطة الثابت من Theorem 1 لـ i = n اتضح أن جميع الأعداد الأولية تصل إلى n وأن كل lp [] سيتم حسابها بواسطة الخوارزمية 1.
وعلاوة على ذلك ، لأنه في الصفوف 5-6 يتم فرز عناصر مختلفة من المجموعة
E ، ثم سيتم تنفيذ الحلقة الداخلية الإجمالية لا أكثر
vertE vert<n العمليات. سيتم تشغيل عملية الفحص في الحلقة بسلاسة
vertE vert+n−1<2n مرات (
vertE vert ستعود مرات حقيقية و n-1 مرات ، لكل i ، ستعود خاطئة). جميع العمليات المتبقية متداخلة في دورة واحدة في i من 2 إلى n.
ويترتب على ذلك أن تعقيد الخوارزمية 1 هو O (n).