Tìm tổng các số nguyên tố nhỏ hơn 2 triệu.

Problem 10: Summation-of-primes

The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.

Find the sum of all the primes below two million.

Đề bài

Các số nguyên tố nhỏ hơn 10 có tổng là: 2 + 3 + 5 + 7 = 17.

Hãy tìm tổng các số nguyên tố nhỏ hơn 2 triệu.

Phân tích đề bài:

Bài toán này, tôi mất 2 ngày để tìm hiểu cách làm tối ưu nhưng càng làm càng…làm thời gian chạy chương trình tăng lên.

Cuối cùng lại quay về cách làm “trâu bò”.


import math

UPPER_LIMIT = 2000000


def is_prime(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


def calc_summation_of_primes():
    sum_of_prime = 2
    number = 3
    while number <= UPPER_LIMIT:
        if is_prime(number):
            sum_of_prime += number
        number += 2
    return sum_of_prime


if __name__ == "__main__":
    import time
    start = time.time()
    ##
    result = calc_summation_of_primes()
    ##
    done = time.time()
    elapsed = done - start
    print("Prime sum of all primes below {} is {}".format(UPPER_LIMIT, result))
    print("elapsed time: {}s".format(elapsed))


Thời gian chạy trên máy của tôi:

Nguyens-MacBook-Pro:PE-010 vinh.nguyenquang$ python3 summation_of_primes.py
Prime sum of all primes below 2000000 is 142913828922
elapsed time: 6.484667062759399s

Buồn thật, bài PE đầu tiên có thời gian chạy > 1s.

Source-code: PE-010