Lesson 04 — Lũy thừa, căn, logarit

Mini-app tương tác đi kèm README. Gồm 4 phần: máy tính power/root/log, kiểm chứng quy luật, demo log scale, và logSumExp playground.

1. Máy tính: power, root, log

Lũy thừa: ab

Tính a^b với a, b bất kỳ (kể cả b âm hoặc phân số).

Nhấn "Tính" để xem kết quả.
Thử: a=2, b=10 → 1024. a=5, b=-2 → 0.04. a=16, b=0.75 → 8.

Căn bậc n: √[n]{x}

Tính căn bậc n của x. Tương đương x^(1/n).

Nhấn "Tính" để xem kết quả.
Thử: x=8, n=3 → 2 (cube root). x=16, n=4 → 2. x=-8, n=3 → -2 (n lẻ cho phép x âm).

Logarit: logb(x)

Hỏi "b lũy thừa bao nhiêu thì ra x?"

Nhấn "Tính" để xem kết quả.
Thử: b=2, x=1024 → 10. b=10, x=0.001 → -3. b=5, x=125 → 3.

2. Kiểm chứng quy luật

Chọn quy luật → nhập số → check 2 vế

Chọn 1 quy luật, app sẽ tính cả vế trái và vế phải, đối chiếu xem có khớp không.

Chọn quy luật ở trên.

3. Log scale: vì sao "vẽ log" giúp nhìn được dữ liệu trải nhiều bậc

Bảng: 1, 10, 100, ..., 10⁹

Cùng một dãy số, vẽ trên hai trục khác nhau. Linear scale: số nhỏ "biến mất"; log scale: các số cách đều nhau.

📏 Linear scale (1 đơn vị pixel = 1 đơn vị số)
📐 Log scale (1 đơn vị pixel = 1 order of magnitude)
Nhận xét: trên linear scale, các số nhỏ (1, 10, 100, ...) gần như invisible vì chúng nhỏ hơn 10⁹ tới 9 bậc. Trên log scale, chúng cách đều — vì log₁₀(1)=0, log₁₀(10)=1, log₁₀(100)=2, ...

4. logSumExp playground — ổn định số trong ML

So sánh: naive vs stable

Nhập một danh sách số (phân cách bằng dấu phẩy hoặc khoảng trắng). Tính log(Σ exp(x_i)) theo 2 cách. Với x lớn (vd 1000), cách naive overflow → +Inf.

Nhấn "Tính" để so sánh.
Thử: 1000, 1001, 999 → naive: +Inf, stable: ≈1001.41.
Thử nhỏ: 1, 2, 3 → cả hai khớp (≈3.41).
Thử cực lớn: 800, 900, 1000 — naive cũng overflow.
Công thức ổn định:
log(Σ exp(xᵢ)) = M + log(Σ exp(xᵢ − M))
với M = max(xs). Sau khi trừ M, mọi exp(...) ∈ (0, 1] → không overflow.