Hai hàm có hai trách nhiệm
Bài vận dụng thứ nhất yêu cầu in **n số nguyên tố đầu tiên**, không phải mọi số nguyên tố nhỏ hơn n. Hàm `la_nguyen_to(x)` trả đúng/sai cho một số; hàm `n_so_nguyen_to_dau(n)` thử các số từ 2 và gom đủ n số. `1` không là số nguyên tố. Muốn kiểm x, chỉ cần thử ước đến căn bậc hai của x: nếu x có ước lớn hơn căn thì ước đi cặp với nó nhỏ hơn căn. SGV minh họa vòng lặp vô hạn có điểm dừng sau khi in số thứ n; ví dụ dưới dùng `while len(ket_qua) < n` nên cả `n=0` cũng dừng ngay.
Kiểm một số, rồi tạo đủ số lượng
```python
from math import isqrt
def la_nguyen_to(x):
if x < 2:
return False
for uoc in range(2, isqrt(x) + 1):
if x % uoc == 0:
return False
return True
def n_so_nguyen_to_dau(n):
if n < 0:
raise ValueError("n phải không âm")
ket_qua = []
x = 2
while len(ket_qua) < n:
if la_nguyen_to(x):
ket_qua.append(x)
x += 1
return ket_qua
print(*n_so_nguyen_to_dau(5))
```
Chương trình in `2 3 5 7 11`. Hàm trả dãy rỗng khi `n=0`; `print(*[])` chỉ in một dòng trống. Nếu bài giao n là số tự nhiên dương, có thể yêu cầu n≥1 ở đầu vào; xử lí 0 ở đây giúp hàm không bị chạy mãi khi dữ liệu ngoài dự kiến.
Bài luyện
Năm số nguyên tố đầu tiên là dãy nào?
Đủ năm số bắt đầu từ 2.
1 không nguyên tố.
4 và 6 hợp số.
Bỏ sót số 2.
Lời giải
Bắt đầu từ 2, lần lượt các số nguyên tố là 2,3,5,7,11.
Bài luyện
Vì sao chỉ cần thử ước tới `isqrt(x)`?
Hai ước đi thành cặp, ít nhất một ước không vượt căn.
Số lớn hơn căn có thể hợp số.
Vòng for dùng đúng phạm vi ghi trong mã.
Số lẻ như 9 vẫn hợp số.
Lời giải
Nếu x=a×b và cả a,b đều lớn hơn căn x thì tích vượt x, vô lí; vậy một ước không vượt căn.
Bài luyện
`n_so_nguyen_to_dau(0)` trả gì?
Điều kiện len(ket_qua)<0 sai từ đầu.
Chưa cần số nào.
Vòng while không chạy.
0 không âm.
Lời giải
Kết quả ban đầu rỗng và 0<0 là sai; hàm trả [] ngay.
Đang học