Xem thêm

Sàng nguyên tố Eratosthenes: Tìm số nguyên tố nhanh chóng

Huy Erick
Thuật toán sàng nguyên tố Eratosthenes là một phương pháp hiệu quả để tìm kiếm các số nguyên tố. Đặc biệt, nó rất hữu ích khi bạn muốn tìm tất cả các số nguyên tố...

Thuật toán sàng nguyên tố Eratosthenes là một phương pháp hiệu quả để tìm kiếm các số nguyên tố. Đặc biệt, nó rất hữu ích khi bạn muốn tìm tất cả các số nguyên tố nhỏ hơn một số N cho trước (N ≥ 2). Với đơn giản là số nguyên tố nhỏ nhất là 2.

Định nghĩa số nguyên tố

Số nguyên tố là số nguyên dương chỉ có hai ước phân biệt: 1 và chính nó. Số nguyên tố nhỏ nhất là số 2.

Nếu bạn muốn kiểm tra xem một số có phải là số nguyên tố hay không, hãy đọc bài về thuật toán kiểm tra số nguyên tố.

Ý tưởng của thuật toán sàng nguyên tố Eratosthenes

Dựa trên lý thuyết về số nguyên tố, chúng ta biết rằng một số nguyên tố chỉ có hai ước là 1 và chính nó. Do đó, nếu ta xác định một số x là số nguyên tố, ta có thể kết luận rằng tất cả các số chia hết cho x không phải là số nguyên tố. Điều này giúp chúng ta loại bỏ một số lượng lớn các số mà không cần phải kiểm tra.

Ví dụ:

  • Số 2 là số nguyên tố => các số 4, 6, 8, 10,... không phải là số nguyên tố.
  • Số 3 là số nguyên tố => các số 9, 15, 21,... không phải là số nguyên tố. (Do 6, 12, 18 đã bị loại ở số 2)

Thuật toán sàng nguyên tố Eratosthenes

  1. Tạo một mảng để đánh dấu các số từ 2 đến N và mặc định tất cả đều là số nguyên tố.
  2. Xét số đầu tiên tìm được là số nguyên tố - giả sử là x, đánh dấu tất cả các bội của x: 2x, 3x, 4x,... trong đoạn [x, N] không phải là số nguyên tố.
  3. Tìm số tiếp theo được đánh dấu là số nguyên tố trong đoạn [x, N]. Nếu không còn số nào, thoát chương trình. Nếu còn, gán nó bằng x và lặp lại bước 2.
  4. Khi kết thúc thuật toán, các số không bị đánh dấu là các số nguyên tố.

Mô tả thuật toán sàng nguyên tố Eratosthenes Mô tả thuật toán sàng nguyên tố Eratosthenes

Cài đặt thuật toán sàng nguyên tố

Ngôn ngữ C/C++

// Code từ https://blog.luyencode.net
#include 
int main() {
    int N = 1000;
    bool check[N + 1];
    // Khởi tạo tất cả các số [2...N] đều là số nguyên tố
    for (int i = 2; i <= N; i++) {
        check[i] = true;
    }
    // Thuật toán sàng nguyên tố
    // Nếu một số là số nguyên tố, thì tất cả các bội của nó không phải là số nguyên tố
    for (int i = 2; i <= N; i++) {
        if (check[i] == true) {
            for (int j = 2 * i; j <= N; j += i) {
                check[j] = false;
            }
        }
    }
    // In ra các số là số nguyên tố
    for (int i = 2; i <= N; i++) {
        if (check[i] == true) {
            printf("%d ", i);
        }
    }
}

Cài đặt sử dụng Java

// Code từ https://blog.luyencode.net
import java.util.*;
import java.lang.*;
import java.io.*;

class Eratosthenes {
    public static void main (String[] args) throws java.lang.Exception {
        int N = 1000;
        boolean[] check = new boolean[N + 1];
        // Khởi tạo tất cả các số [2...N] đều là số nguyên tố
        for (int i = 2; i <= N; i++) {
            check[i] = true;
        }
        // Thuật toán sàng nguyên tố
        // Nếu một số là số nguyên tố, thì tất cả các bội của nó không phải là số nguyên tố
        for (int i = 2; i <= N; i++) {
            if (check[i] == true) {
                for (int j = 2 * i; j <= N; j += i) {
                    check[j] = false;
                }
            }
        }
        // In ra các số là số nguyên tố
        for (int i = 2; i <= N; i++) {
            if (check[i] == true) {
                System.out.print(i + " ");
            }
        }
    }
}

Kết quả khi chạy:

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 997
1