Ước, số nguyên tố, UCLN – BCNN
Buổi 8
Số học: dạng bài xuất hiện gần như mọi năm
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN1 / 22
Hôm nay em sẽ học
- Liệt kê và đếm ước của một số
- Kiểm tra số nguyên tố
- Vì sao chỉ cần xét đến √n – bài học về tốc độ
- Thuật toán Euclid tìm UCLN; tính BCNN
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN2 / 22
Ôn lại toán
- Ước của 12 là: 1, 2, 3, 4, 6, 12
- Số nguyên tố có đúng 2 ước: 1 và chính nó. Ví dụ: 2, 3, 5, 7, 11, 13…
- UCLN(12, 18) = 6, BCNN(12, 18) = 36
Số 1 không phải số nguyên tố (chỉ có 1 ước). Số 0 và số âm cũng không phải.
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN3 / 22
Phần 1: Ước của một số
a chia hết cho b khi a % b == 0
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN4 / 22
Liệt kê ước – cách đơn giản
n = int(input())
for i in range(1, n + 1):
if n % i == 0:
print(i, end=" ")12
1 2 3 4 6 12
Thử với n = 1 000 000 000. Chương trình có chạy nhanh không?
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN5 / 22
Ước luôn đi theo cặp
| Cặp ước của 36 | Số nhỏ | Số lớn |
|---|
| 1 × 36 | 1 | 36 |
| 2 × 18 | 2 | 18 |
| 3 × 12 | 3 | 12 |
| 4 × 9 | 4 | 9 |
| 6 × 6 | 6 | 6 |
Trong mỗi cặp luôn có một số ≤ √36 = 6. Chỉ cần tìm đến √n là thấy hết các cặp!
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN6 / 22
Phần 2: Số nguyên tố
Chỉ cần thử đến căn bậc hai
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN7 / 22
Kiểm tra số nguyên tố
n = int(input())
nt = n >= 2
i = 2
while i * i <= n:
if n % i == 0:
nt = False
break
i += 1
print("YES" if nt else "NO")nt = n >= 2: số nhỏ hơn 2 không phải nguyên tố- Thử chia cho i = 2, 3, 4, … khi
i * i <= n - Gặp ước → không nguyên tố, dừng ngay
Dùng i * i <= n thay vì căn bậc hai để tránh sai số.
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN8 / 22
Thí nghiệm bấm giờ
Kiểm tra n = 1 000 000 007 là số nguyên tố:
| Cách | Số lần thử | Thời gian (khoảng) |
|---|
| Thử đến n | 1 tỷ lần | vài phút |
| Thử đến √n | 31 623 lần | chưa tới 0,1 giây |
Python làm được khoảng 10⁶ – 10⁷ phép tính mỗi giây. Đề cho n đến 10⁹ thì vòng lặp đến n là không kịp!
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN9 / 22
Phần 3: UCLN và BCNN
Thuật toán Euclid – hơn 2000 năm tuổi
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN10 / 22
Thuật toán Euclid
UCLN(a, b) = UCLN(b, a % b), và UCLN(a, 0) = a
a, b = map(int, input().split())
while b != 0:
a, b = b, a % b
print(a)| a | b | a % b |
|---|
| 48 | 18 | 12 |
| 18 | 12 | 6 |
| 12 | 6 | 0 |
| 6 | 0 | dừng |
UCLN(48, 18) = 6
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN11 / 22
BCNN và thư viện math
BCNN(a, b) = a × b ÷ UCLN(a, b)
import math
a, b = map(int, input().split())
g = math.gcd(a, b)
print(g, a // g * b)
12 18
6 36
Khi đi thi được dùng math.gcd. Nhưng em phải tự viết được Euclid để hiểu.
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN12 / 22
Luyện tập
Bài ★ cả lớp · Bài ★★★ thử thách
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN13 / 22
Bài 1 ★ – LIETKEUOC
Input: số nguyên n (1 ≤ n ≤ 10⁶).
Output: các ước của n theo thứ tự tăng dần.
| Input | Output |
|---|
12 | 1 2 3 4 6 12 |
1 | 1 |
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN14 / 22
Bài 2 ★ – NGUYENTO
Input: số nguyên n (1 ≤ n ≤ 10¹²).
Output: YES nếu n là số nguyên tố, ngược lại NO.
| Input | Output |
|---|
13 | YES |
1 | NO |
1000000007 | YES |
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN15 / 22
Bài 3 ★★ – DEMUOC
Input: số nguyên n (1 ≤ n ≤ 10¹²).
Output: số ước của n.
Mỗi ước i ≤ √n cho một cặp (i, n / i). Khi i × i = n thì chỉ đếm 1 lần!
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN16 / 22
Bài 4 ★★ – UCLNBCNN
Input: hai số nguyên a, b (1 ≤ a, b ≤ 10¹⁸).
Output: UCLN và BCNN của a và b.
| Input | Output |
|---|
12 18 | 6 36 |
7 5 | 1 35 |
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN17 / 22
Bài 5 ★★ – RUTGON
Input: tử số a, mẫu số b (b ≠ 0, có thể âm).
Output: phân số tối giản dạng p/q với q > 0.
| Input | Output |
|---|
6 -8 | -3/4 |
10 5 | 2/1 |
0 5 | 0/1 |
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN18 / 22
Bài 6 ★★★ – HOANHAO
Số hoàn hảo bằng tổng các ước nhỏ hơn nó.
Ví dụ: 6 = 1 + 2 + 3
Input: n (n ≤ 10⁴).
Output: các số hoàn hảo không vượt quá n.
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN19 / 22
Bài 7 ★★★ – PTTSNT
Phân tích n ra thừa số nguyên tố.
Input: n (2 ≤ n ≤ 10¹²).
Output: mỗi dòng p k – thừa số p với số mũ k, p tăng dần.
| Input | Output |
|---|
360 | 2 3
3 2
5 1 |
13 | 13 1 |
360 = 2³ × 3² × 5
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN20 / 22
Tóm tắt buổi 8
- a chia hết cho b:
a % b == 0 - Tìm ước / kiểm tra nguyên tố: chỉ cần
i * i <= n - UCLN:
while b != 0: a, b = b, a % b - BCNN =
a // g * b - Số 0, số 1, số âm không phải số nguyên tố
Luôn đọc giới hạn n: n ≤ 10⁶ có thể duyệt hết, n ≤ 10¹² phải dùng √n.
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN21 / 22
Bài về nhà
- Đếm số nguyên tố trong đoạn [a, b] (b ≤ 10⁴).
- Liệt kê các cặp số nguyên tố sinh đôi không vượt quá n (hai số nguyên tố hơn kém nhau 2, ví dụ 3 và 5, 11 và 13).
- Nhập n, rồi n số trên một dòng. Tính UCLN của n số đó.
Buổi 8 – Ước, số nguyên tố, UCLN – BCNN22 / 22