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

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

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

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

  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