Kiểm tra nguyên tố

\(O(N)\) - Cơ bản

Để kiểm tra một số n có phải là số nguyên tố hay không, ta có thể duyệt \(i\) từ \(2\) đến \(n-1\):

bool isPrime(int n) {
    if (n < 2) return false;
    for (int i = 2; i <= n-1; ++i)
        if (n % i == 0) return false;
    return true;
}

\(O(\sqrt{N})\) - Tối ưu

Có thể dễ dàng chứng minh được một hợp số \(n\) luôn có ước dương khác \(1\) nhỏ hơn hoặc bằng \(\sqrt{n}\). Từ đó, ta chỉ cần duyệt \(i\) từ \(2\) đến \(\sqrt{n}\):

bool isPrime(long long n) {
    if (n < 2) return false;
    for (long long i = 2; i*i <= n; ++i)
        if (n % i == 0) return false;
    return true;
}

Một thuật toán tốt hơn: Để tối ưu thêm thuật toán trên thì đầu tiên ta kiểm tra:

bool isPrime(long long n) {
    if (n < 2) return false;
    if (n < 4) return true;
    if (n % 2 == 0 || n % 3 == 0) return false;
    for (long long i = 5; i*i <= n; i+=6)
        if (n % i == 0 || n % (i+2) == 0) return false;
    return true;
}

\(O(Klog(N)) / O(Klog(N)^2)\) - Miller

Ta có thể dùng thuật toán Miller để kiểm tra các số nguyên tố 64bit với độ phức tạp nhỏ.

Code ở đây