Trial Division
, Sundaram Sieve
, Erastothenes Sieve
, Atkin Sieve
, Wheel Sieve
, Bitwise Sieve
, Segment Bitwise Sieve
, Segment Sieve
, Sieve
Với mọi số nguyên trong đoạn . Ta đếm số ước của trong đoạn . Nếu có đúng ước thì là số nguyên tố
Time:
Space:
Algo: Brute-forces Sieve
Nhận thấy là là số nguyên tố, khi và chỉ khi nó có đúng ước nguyên dương là và
Nếu và tồn tai một giá trị trong đoạn mà chia hết thì sẽ là hợp số
Thấy rằng khi tồn tại giá trị như thế, thì tồn tại số nguyên để
Không mất tính tổng quát ta giả sử
Áp dụng bất đẳng thức AM-GM cho 2 số nguyên dương và ta có
Từ đó suy ra ta chỉ cần duyêt qua
Time:
Space:
Algo: Sqrt Sieve
Nhận xét các số có dạng với và và
Ta áp dụng tính chất trên cho cả việc sàng lẫn việc kiểm tra
For
Time: total - check
Space:
Algo: Sqrt Sieve
Ta nhận thấy nếu không phải số nguyên tố thì tồn tại một số mà chia hết.
Mà mọi ước của đều là ước của
Nên ta chỉ cần kiểm tra xem có ước nguyên tố nào hay không
Time:
Space:
Algo: Sqrt Sieve
Với mỗi số . Đánh dấu các bội của khác gồm các số () không phải số nguyên tố. Chứng minh:
Time:
Space:
Algo: Divisor Sieve
Time:
Space:
Algo: Divisor Sieve
Nhận thấy rằng các số có nhiều ước thì sẽ bị đánh dấu nhiều lần. Vì khi là hợp số, thì với mọi ước của , thì bội của cũng là bội của . Nên để hạn chế điều đó, ta chỉ đánh dấu các bội của khi là số nguyên tố.
Time:
Space:
Algo: Eratosthenes Sieve
Mình có thể cải thiện hơn nữa. Bằng cách đánh dấu các số chẵn khác không phải số nguyên tố. Rồi xét các số lẻ
Thay vì đánh dấu các bội với , thì nhận thấy mọi với đều đã bị đánh dấu bởi một số nguyên tố nào đó trước . Nên ta đánh dấu từ luôn.
Time:
Space:
Algo: Eratosthenes Sieve
Nhưng, với cách trên thì mình vẫn phải đánh dấu nhiều lần các số có nhiều ước nguyên tố.
Ta gọi lpf[x]
là ước nguyên tố nhỏ nhất của (viết tắt của lowest_prime_factor
)
Khi này mọi số đều có thể được biểu diễn bằng . Mà từ định nghĩa ta có
Giờ nếu ta chỉ đánh dấu các số có dạng với nguyên tố và . Thì mỗi số chỉ bị đánh dấu bởi một số nguyên tố mà thôi
Time:
Space: lpf[] + prime[]
Algo: Eratosthenes Sieve
Mình biết trước được số lượng phần tử rồi thì có thể sài mảng tĩnh để xử lí nhanh hơn
Time:
Space: lpf[] + prime[]
Algo: Eratosthenes Sieve
Cái thuật sàng này thì phức tạp hơn nhiều và cũng sử dụng nhiều phép toán nhân chia nên khó tối ưu hơn là sàng Erastothenes.
Nhưng mà thôi kệ, cứ viết về nó vậy.
Ý tưởng của A. O. L. Atkin và Daniel J. Bernstein là như sau:
Để phủ hết các số nguyên tố ta kiểm tra thêm các dạng
Time:
Space:
Algo: Atkin Sieve
Ta chia làm các vòng for độc lập để có thể có những tối ưu riêng từng cái
Time:
Space:
Algo: Atkin Sieve
Áp dụng toán học và tìm những trường hợp nào nghiệm thỏa cả phương trình lẫn điều kiện modulo và đơn giản hóa lại thành phép cộng trừ ta thu được như sau
Time:
Space:
Algo: Atkin Sieve
Time:
Space:
Algo: Atkin Sieve
Time:
Space:
Algo: Erastothenes Sieve
Time:
Space:
Algo: Erastothenes Sieve
Time:
Space:
Algo: Erastothenes Sieve
Time:
Space:
Algo: Erastothenes Sieve
Time:
Space:
Algo: Erastothenes Sieve
Time:
Space:
Algo: Erastothenes Sieve
Time:
Space:
Algo: Erastothenes Sieve
Time:
Space:
Algo: Erastothenes Sieve
Time:
Space:
Algo: Erastothenes Sieve
Original: primesieve
Time:
Space:
Algo: Erastothenes Sieve
Original: primesieve
Num | Algorithm | Time Complexity | ||||||
---|---|---|---|---|---|---|---|---|
1. | Brute-forces | 109ms | 11215ms | >15000ms | >15000ms | >15000ms | MLE | |
2. | Trial Division | 15ms | 15ms | 171ms | 3993ms | >15000ms | MLE | |
3. | Improved Trial Division | 0ms | 0ms | 61ms | 1325ms | >15000ms | MLE | |
4. | Second Improved Trial Division | 0ms | 0ms | 61ms | 1325ms | >15000ms | MLE | |
5. | Divisor Sieve | 15ms | 31ms | 31ms | 576ms | 14617ms | MLE | |
6. | Sundaram Sieve | 15ms | 31ms | 31ms | 31ms | 1419ms | >15000ms | |
7. | Eratosthenes Sieve | 0ms | 15ms | 15ms | 78ms | 1169ms | MLE | |
8. | Improved Eratosthenes Sieve | 0ms | 15ms | 15ms | 93ms | 1014ms | MLE | |
9. | Linear Eratosthenes Sieve | 0ms | 15ms | 15ms | 61ms | 795ms | MLE | |
10. | Improved Linear Eratosthenes Sieve | 0ms | 0ms | 15ms | 77ms | 732ms | MLE | |
11. | Atkin Sieve | 0ms | 15ms | 15ms | 93ms | 1122ms | MLE | |
12. | Improved Atkin Sieve | 0ms | 0ms | 0ms | 61ms | 733ms | MLE | |
13. | Non-modulo Atkin Sieve | 0ms | 15ms | 15ms | 46ms | 561ms | MLE | |
14. | Improved Non-modulo Atkin Sieve | 0ms | 0ms | 0ms | 46ms | 402ms | MLE | |
15. | Eratosthenes Wheel-2 Sieve | 0ms | 0ms | 15ms | 62ms | 857ms | 9000ms | |
16. | Improved Eratosthenes Wheel-2 Sieve | 0ms | 0ms | 0ms | 15ms | 546ms | 6666ms | |
17. | Eratosthenes Wheel-2 Bitwise Sieve | 0ms | 0ms | 0ms | 30ms | 234ms | 4648ms | |
18. | Improved Eratosthenes Wheel-2 Bitwise Sieve | 0ms | 0ms | 0ms | 30ms | 218ms | 4071ms | |
19. | Improved Erastothenes Wheel-2-3-5-7 Sieve | 0ms | 15ms | 15ms | 30ms | 358ms | 4242ms | |
20. | Improved Erastothenes Wheel-2-3-5-7 Segment Sieve | 0ms | 0ms | 0ms | 30ms | 186ms | 1980ms | |
21. | Erastothenes Segment Sieve | 0ms | 15ms | 31ms | 46ms | 312ms | 2776ms | |
22. | Improved Erastothenes Segment Sieve | 0ms | 15ms | 15ms | 30ms | 109ms | 1466ms | |
23. | Erastothenes Segment Bitwise Sieve | 0ms | 0ms | 0ms | 62ms | 546ms ? | 5366ms ? | |
24. | Improved Erastothenes Segment Bitwise Sieve | 0ms | 0ms | 0ms | 15ms | 46ms | 592ms |