Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรม C++ การถาลแอตкин (Sieve of Atkin) สร้างจำนวนเฉพาะในช่วงที่กำหนด


การถาลแอต킨 (Sieve of Atkin)

นี่คือโปรแกรม C++ สำหรับการนำการถาลแอตкинมาใช้สร้างจำนวนเฉพาะในช่วงที่กำหนด การถาลแอตкинเป็นอัลกอริทึมสมัยใหม่สำหรับหาจำนวนเฉพาะทั้งหมดจนถึงจำนวนเต็มที่กำหนด

อัลกอริทึม

เริ่มต้น
  สร้างรายการผลลัพธ์ เติมด้วย 2, 3, และ 5
  เริ่มต้นอาร์เรย์ถาล (sieve array) ด้วยค่า false
  ทำเครื่องหมาย siev[n] เป็น true หากเป็นจริงหนึ่งในเงื่อนไขต่อไปนี้:
  a) n = (4*x*x) + (y*y) มีจำนวนคำตอบเป็นคี่ และ n % 12 = 1 หรือ n % 12 = 5
  b) n = (3*x*x) + (y*y) มีจำนวนคำตอบเป็นคี่ และ n % 12 = 7
  c) n = (3*x*x) - (y*y) มีจำนวนคำตอบเป็นคี่, x > y และ n % 12 = 11
  ทำเครื่องหมายพหุคูณของกำลังสองเป็น non-prime
  พิมพ์จำนวนเฉพาะโดยใช้ sieve[]
สิ้นสุด

โค้ดตัวอย่าง

#include <bits/stdc++.h>
using namespace std;

int SieveOfAtkin(int lmt) {
    if (lmt > 2)
        cout << 2 << " ";
    if (lmt > 3)
        cout << 3 << " ";
    bool sieve[lmt];
    for (int i = 0; i < lmt; i++)
        sieve[i] = false;
    
    for (int a = 1; a * a < lmt; a++) {
        for (int b = 1; b * b < lmt; b++) {
            // ส่วนหลักของการถาลแอตкин
            int n = (4 * a * a) + (b * b);
            if (n <= lmt && (n % 12 == 1 || n % 12 == 5))
                sieve[n] ^= true;
            
            n = (3 * a * a) + (b * b);
            if (n <= lmt && n % 12 == 7)
                sieve[n] ^= true;
            
            n = (3 * a * a) - (b * b);
            if (a > b && n <= lmt && n % 12 == 11)
                sieve[n] ^= true;
        }
    }
    
    for (int r = 5; r * r < lmt; r++) {
        if (sieve[r]) {
            for (int i = r * r; i < lmt; i += r * r)
                sieve[i] = false;
        }
    }
    
    for (int x = 5; x < lmt; x++)
        if (sieve[x])
            cout << x << " ";
}

int main(void) {
    int lmt = 30;
    SieveOfAtkin(lmt);
    return 0;
}

ผลลัพธ์ตัวอย่าง

2 3 5 7 11 13 17 19 23 29