Đăng nhập để tham gia lộ trình luyện tập
Some problems in the training are missing or you do not have permission to view them.
70, 71, 72
Lộ trình Sàng số nguyên tố
Số nguyên tố là một trong những chủ đề nền tảng quan trọng của Lý thuyết số trong lập trình thi đấu. Rất nhiều bài toán không chỉ yêu cầu kiểm tra một số có phải số nguyên tố hay không, mà còn yêu cầu xử lý hàng nghìn hoặc hàng triệu giá trị trong cùng một lần chạy chương trình.
Nếu kiểm tra từng số độc lập bằng phép thử chia, lời giải có thể trở nên quá chậm. Khi đó, kỹ thuật sàng số nguyên tố cho phép tiền xử lý đồng thời một khoảng số và trả lời các truy vấn sau đó rất nhanh.
Lộ trình này được xây dựng theo hướng:
hiểu bản chất → cài đặt đúng → tối ưu → ứng dụng → biến thể nâng cao.
Mục tiêu của lộ trình
Sau khi hoàn thành lộ trình, học viên cần có khả năng:
- hiểu chính xác định nghĩa số nguyên tố và hợp số;
- kiểm tra một số có phải số nguyên tố trong ;
- xây dựng Sàng Eratosthenes;
- hiểu vì sao chỉ cần xét các số đến ;
- hiểu vì sao khi sàng từ số nguyên tố có thể bắt đầu từ ;
- tìm toàn bộ số nguyên tố không vượt quá ;
- đếm số nguyên tố trong một đoạn;
- xây dựng mảng đánh dấu số nguyên tố;
- xây dựng mảng ước nguyên tố nhỏ nhất;
- phân tích một số thành thừa số nguyên tố nhanh sau tiền xử lý;
- tính số lượng ước và tổng các ước từ phân tích thừa số nguyên tố;
- làm quen với Sàng tuyến tính;
- xử lý các bài toán có nhiều truy vấn liên quan đến số nguyên tố;
- nhận biết khi nào nên dùng kiểm tra nguyên tố, Sàng Eratosthenes, SPF, Sàng tuyến tính hoặc sàng đoạn.
Phần 1. Nền tảng về số nguyên tố
Trước khi học sàng, cần nắm chắc:
- ước và bội;
- số nguyên tố;
- hợp số;
- phân tích thừa số nguyên tố;
- căn bậc hai;
- phép chia lấy dư;
- độ phức tạp thuật toán.
Một số nguyên là số nguyên tố nếu chỉ có đúng hai ước dương:
Ví dụ:
- là các số nguyên tố;
- không phải số nguyên tố;
- là hợp số.
Phần 2. Kiểm tra nguyên tố bằng thử chia
Cách đơn giản nhất là thử xem có chia hết cho số nào từ đến hay không.
Cách này có độ phức tạp và chỉ phù hợp với dữ liệu nhỏ.
Ta có thể cải tiến bằng nhận xét:
Nếu là hợp số thì tồn tại hai số nguyên sao cho
Ít nhất một trong hai số không vượt quá .
Vì vậy chỉ cần thử các ước đến .
Độ phức tạp giảm còn:
Đây là phương pháp phù hợp khi chỉ cần kiểm tra một hoặc một vài số.
Phần 3. Sàng Eratosthenes
Khi cần xác định trạng thái nguyên tố của tất cả các số từ đến , kiểm tra từng số bằng không còn hiệu quả.
Sàng Eratosthenes xử lý toàn bộ đoạn:
trong khoảng:
Ý tưởng:
- Ban đầu xem mọi số từ trở đi là số nguyên tố.
- Xét lần lượt từng số .
- Nếu chưa bị loại thì là số nguyên tố.
- Loại các bội của .
- Tiếp tục cho đến khi .
Ví dụ với , các số nguyên tố thu được là:
Đây là thuật toán sàng quan trọng nhất và phải được cài đặt thành thạo.
Phần 4. Tối ưu Sàng Eratosthenes
Khi xử lý số nguyên tố , không cần bắt đầu loại từ .
Các số
đã được xử lý bởi những số nhỏ hơn.
Do đó có thể bắt đầu từ:
Ta cũng chỉ cần thực hiện bước sàng với các thỏa mãn:
Đây là hai tối ưu cơ bản cần hiểu rõ thay vì chỉ ghi nhớ công thức.
Phần 5. Đếm số nguyên tố
Sau khi có mảng đánh dấu nguyên tố, ta có thể đếm số lượng số nguyên tố không vượt quá .
Tiếp tục xây dựng mảng cộng dồn:
Khi đó số lượng số nguyên tố trong đoạn là:
Sau tiền xử lý, mỗi truy vấn được trả lời trong .
Đây là một dạng kết hợp quan trọng giữa:
Sàng số nguyên tố + Prefix Sum.
Phần 6. Ước nguyên tố nhỏ nhất
Thay vì chỉ lưu một số có phải nguyên tố hay không, ta có thể lưu:
Ví dụ:
Nếu là số nguyên tố thì:
Mảng SPF cho phép phân tích một số thành thừa số nguyên tố rất nhanh sau khi đã tiền xử lý.
Ví dụ:
Ta lần lượt sử dụng:
$$84 \rightarrow 42 \rightarrow 21 \rightarrow 7 \rightarrow 1.$$SPF đặc biệt hữu ích trong các bài có nhiều truy vấn phân tích thừa số nguyên tố.
Phần 7. Ứng dụng của phân tích thừa số nguyên tố
Nếu
thì số lượng ước dương của là:
Tổng các ước dương của là:
$$\sigma(n)= (1+p_1+\cdots+p_1^{a_1}) (1+p_2+\cdots+p_2^{a_2}) \cdots (1+p_k+\cdots+p_k^{a_k}).$$Vì vậy sàng không chỉ dùng để tìm số nguyên tố mà còn là bước tiền xử lý cho nhiều bài toán lý thuyết số khác.
Phần 8. Sàng tuyến tính
Sàng tuyến tính, còn được gọi là Linear Sieve, có thể xây dựng danh sách số nguyên tố trong:
Ý tưởng quan trọng của phương pháp là đảm bảo mỗi hợp số được sinh ra theo một cách có kiểm soát, thường thông qua ước nguyên tố nhỏ nhất của nó.
Ngoài danh sách số nguyên tố, Sàng tuyến tính còn rất thuận lợi khi cần tính đồng thời các hàm số học như:
- ước nguyên tố nhỏ nhất;
- số lượng thừa số nguyên tố;
- hàm Euler ;
- hàm Möbius .
Ở giai đoạn đầu, học viên cần ưu tiên hiểu và thành thạo Sàng Eratosthenes trước khi chuyển sang Sàng tuyến tính.
Phần 9. Sàng đoạn
Khi cần tìm các số nguyên tố trong đoạn:
nhưng quá lớn để tạo mảng kích thước , có thể sử dụng Segmented Sieve.
Ta chỉ cần sàng trước các số nguyên tố đến:
sau đó dùng chúng để loại các hợp số trong đoạn .
Kỹ thuật này đặc biệt hữu ích khi:
- rất lớn;
- độ dài đoạn không quá lớn;
- không thể tạo một mảng từ đến .
Thứ tự học đề nghị
Học viên nên hoàn thành các phần theo đúng thứ tự:
- Ước, bội và số nguyên tố.
- Kiểm tra nguyên tố bằng thử chia.
- Tối ưu kiểm tra đến .
- Sàng Eratosthenes cơ bản.
- Tối ưu sàng từ .
- Liệt kê số nguyên tố.
- Đếm số nguyên tố.
- Sàng kết hợp Prefix Sum.
- Phân tích thừa số nguyên tố.
- Mảng SPF.
- Các hàm dựa trên phân tích thừa số.
- Sàng tuyến tính.
- Sàng đoạn.
- Bài toán tổng hợp và bài thi lập trình.
Kỹ năng cần đạt
Không nên xem là hoàn thành lộ trình nếu chỉ thuộc mã nguồn của Sàng Eratosthenes.
Học viên cần tự giải thích được:
- tại sao không phải số nguyên tố;
- tại sao chỉ cần kiểm tra đến ;
- tại sao Sàng Eratosthenes có thể bắt đầu loại từ ;
- tại sao chỉ cần sàng với ;
- sự khác nhau giữa kiểm tra nguyên tố và sàng số nguyên tố;
- khi nào cần dùng SPF;
- khi nào Sàng tuyến tính có lợi;
- khi nào phải chuyển sang Sàng đoạn;
- cách kết hợp sàng với Prefix Sum để xử lý nhiều truy vấn.
Mục tiêu cuối cùng là khi gặp một bài toán liên quan đến số nguyên tố, học viên có thể nhanh chóng xác định đúng dạng tiền xử lý và lựa chọn thuật toán phù hợp với giới hạn dữ liệu.
- Người tham gia
- 1
- Tạo bởi