Ướ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

  1. Liệt kê và đếm ước của một số
  2. Kiểm tra số nguyên tố
  3. Vì sao chỉ cần xét đến √n – bài học về tốc độ
  4. 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 36Số nhỏSố lớn
1 × 36136
2 × 18218
3 × 12312
4 × 949
6 × 666
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áchSố lần thửThời gian (khoảng)
Thử đến n1 tỷ lầnvài phút
Thử đến √n31 623 lầnchư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)
aba % b
481812
18126
1260
60dừ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.

InputOutput
121 2 3 4 6 12
11
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.

InputOutput
13YES
1NO
1000000007YES
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.

InputOutput
369
11
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.

InputOutput
12 186 36
7 51 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.

InputOutput
6 -8-3/4
10 52/1
0 50/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.

InputOutput
306 28
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.

InputOutput
3602 3 3 2 5 1
1313 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à

  1. Đếm số nguyên tố trong đoạn [a, b] (b ≤ 10⁴).
  2. 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).
  3. 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
← → chuyển slide · F toàn màn hình