Số nguyên tố: Là số chỉ chia hết cho 1 và chính nó.

Cách đơn giản nhất để kiểm tra number có phải là số nguyên tố không là tạo một nhóm các số từ 2 đến number // 2 + 1 (chia lấy phần nguyên). Nếu number không chia hết cho 1 số nào đó trong nhóm đó –> number là số nguyên tố.

Cách này chưa phải hiệu quả nhất trong việc kiểm tra một số có phải là số nguyên tố không. Ta có thể thu gọn tập số kiểm tra bằng cách tạo ra một nhóm từ 2 đến (căn bậc hai của number) + 1.

Ví dụ: Kiểm tra số nguyên tố của 36. 36 có các ước số là 2, 3, 6, 9, 18. căn bậc hai của 36 là 6. –> Chỉ cần kiểm tra từ 2 –> 6 là đủ.


import math


def is_prime_normal_solution(number):
    if number <= 1:
        return False
    max_range = int(math.sqrt(number)) + 1
    for counter in range(2, max_range):
        if not number % counter:
            return False
    return True


Việc kiểm tra này có vẻ như khá ổn nhưng liệu có cách nào khác để kiểm tra tốt hơn không ?

Để ý danh sách các số nguyên tố: 2, 3, 5, 7, 11, 13…

Ngoại trừ số 2 đầu tiên, các số tiếp theo đều là số lẻ.

–> Nếu đặt counter = 3 và tăng dần thêm 2 chúng ta sẽ giảm được 1/2 số lần trong vòng lặp.

Ngoài ra chúng ta có thể giảm số lượng so sánh bằng cách đặt bước kiểm tra chia hết cho 2 ngay từ đầu.


def is_prime_advance_solution(number):
    if number <= 1:
        return False
    elif number <= 3:
        return True
    elif not number % 2:
        return False
    max_range = int(math.sqrt(number)) + 1
    for counter in range(3, max_range, 2):
        if not number % counter:
            return False
    return True


Đưa 2 function trên vào code hoàn thiện:


"""
@author: vinh.nguyenquang
@email: quangvinh19862003@gmail.com

"""
import math

def is_prime_normal_solution(number):
    if number <= 1:
        return False
    max_range = int(math.sqrt(number)) + 1
    for counter in range(2, max_range):
        if not number % counter:
            return False
    return True


def is_prime_advance_solution(number):
    if number <= 1:
        return False
    elif number <= 3:
        return True
    elif not number % 2:
        return False
    max_range = int(math.sqrt(number)) + 1
    for counter in range(3, max_range, 2):
        if not number % counter:
            return False
    return True



if __name__ == "__main__":
    import time
    number = 3
    print("is_prime_normal_solution: {} ".format(number), end=' ')
    start = time.time()
    print(is_prime_normal_solution(number), end=' ')
    done = time.time()
    elapsed = done - start
    print("elapsed time: {}s".format(elapsed))

    print("is_prime_advance_solution: {} ".format(number), end=' ')
    start = time.time()
    print(is_prime_advance_solution(number), end=' ')
    done = time.time()
    elapsed = done - start
    print("elapsed time: {}s".format(elapsed))


Kết quả chạy chương trình:

Nguyens-MacBook-Pro:prime vinh.nguyenquang$ python3 prime.py 
is_prime_normal_solution: 999999911111111  True elapsed time: 3.7082290649414062s
is_prime_advance_solution: 999999911111111  True elapsed time: 1.875870943069458s
Nguyens-MacBook-Pro:prime vinh.nguyenquang$ python3 prime.py 
is_prime_normal_solution: 9999999111111112  False elapsed time: 2.8133392333984375e-05s
is_prime_advance_solution: 9999999111111112  False elapsed time: 2.1457672119140625e-06s


Với khoảng cách thời gian như này, thật đáng để chúng ta suy nghĩ và áp dụng vào thực tế.