Featured image of post ما هو غربال إراتوستينس؟ خوارزمية وتنفيذ لسرد الأعداد الأولية حتى 1000

ما هو غربال إراتوستينس؟ خوارزمية وتنفيذ لسرد الأعداد الأولية حتى 1000

نشرح بوضوح آليات عمل والخطوات المحددة لخوارزمية "غربال إراتوستينس" للعثور على الأعداد الأولية بكفاءة. كما نقدم مثالاً على التنفيذ لسرد الأعداد الأولية التي تصل إلى 1000 باستخدام لغة Rust.

ما هو غربال إراتوستينس

غربال إراتوستينس هو خوارزمية لسرد الأعداد الأولية حتى عدد معين. الخوارزمية بسيطة ويمكن تنفيذها باتباع الخطوات التالية:

  1. قم بإنشاء مصفوفة من القيم المنطقية (bool) تحتوي على N عنصرًا وهيئ جميع العناصر إلى true.
  2. قم بتعيين العنصرين الصفر والأول من المصفوفة إلى false (لأن 0 و 1 ليسا عددين أوليين).
  3. إذا كان العنصر الثاني في المصفوفة هو true ، فقم بطباعة 2 كعدد أولي.
  4. قم بتعيين جميع العناصر المضاعفة للعدد 2 بدءًا من $2^2$ إلى false ※
  5. إذا كان العنصر الثالث في المصفوفة هو true ، فقم بطباعة 3 كعدد أولي.
  6. قم بتعيين جميع العناصر المضاعفة للعدد 3 بدءًا من $3^2$ إلى false.
  7. كرر نفس العملية للعناصر الرابع والخامس ، … ، والعنصر N.

※ السبب في تعيين العناصر الأكبر من المربع إلى false هو أن الأعداد الأصغر من المربع قد تمت معالجتها بالفعل (تم إكمال السرد).

التنفيذ في Rust

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
fn main() {
    let n = 1000;
    let mut is_prime = vec![true; n+1];
    is_prime[0] = false;
    is_prime[1] = false;
    for i in 2..=n {
        if is_prime[i] {
            println!("{}", i);
            let mut j = i * i;
            while j <= n {
                is_prime[j] = false;
                j += i;
            }
        }
    }
}

نسخة أسرع قليلاً

سنقوم بتنفيذ نسخة أسرع قليلاً مع مراعاة النقاط التالية:

  • بدلاً من تهيئة المصفوفة إلى true ، نقوم بتهيئتها إلى false (هذا أسرع).
  • نظرًا لأن مضاعفات 2 ليست أعدادًا أولية ، سنتخطى عملية تعيين مضاعفات 2 إلى false.
  • ليس من الضروري التكرار حتى n ، إذا قمت بسرد الأعداد الأولية حتى الجذر التربيعي لـ n ، يمكنك سرد الأعداد الأولية حتى n.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
fn main() {
    let n = 1000;
    let mut is_prime = vec![false; n+1];
    is_prime[2] = true;
    for i in (3..=n).step_by(2) {
        is_prime[i] = true;
    }
    for i in 3..=((n as f64).sqrt() as usize) {
        if is_prime[i] {
            let mut j = i * i;
            while j <= n {
                is_prime[j] = false;
                j += i * 2;
            }
        }
    }
    for i in (2..=n).filter(|&x| is_prime[x]) {
        println!("{}", i);
    }
}

مراجع

comments powered by Disqus
مبني بستخدام Hugo
قالب Stack مصمم من Jimmy