Máy tính giai thừa tính n! — tích của tất cả số nguyên dương từ 1 đến n. Hàm này xuất hiện khắp tổ hợp, xác suất, giải tích (chuỗi Taylor) và thống kê, và tăng nhanh hơn bất kỳ đa thức hay mũ đơn giản nào. Máy tính này nhận số nguyên từ 0 đến 170 với độ chính xác chuẩn; với n >170 kết quả vượt phạm vi IEEE-754 (~1,8 × 10³⁰⁸), nên đầu vào lớn hơn dùng số học BigInt để giữ nguyên mọi chữ số. Mỗi phép tính cho ra giá trị cuối cùng kèm theo khai triển từng bước để bạn kiểm tra phép nhân bằng tay, hữu ích cho rà soát bài tập, dựng bài toán tổ hợp và giải bài xác suất.
Giai thừa là gì?
Giai thừa là tích của tất cả các số nguyên dương từ 1 đến một số nguyên không âm n cho trước. Ký hiệu là n! và đọc là "n giai thừa" — ký hiệu dấu chấm than được nhà toán học người Pháp Christian Kramp giới thiệu năm 1808 và được dùng đến nay vì gọn và dễ nhận biết. Theo quy ước 0! = 1; đây là tích rỗng, tương đương phép cộng rỗng bằng 0, và là cần thiết để các công thức tổ hợp như C(n,0) = 1 và chuỗi Taylor của e^x hoạt động đúng tại n = 0.
Làm thế nào để tính Giai thừa?
Để tính giai thừa thủ công:
- Chọn số nguyên không âm n bạn muốn tính giai thừa.
- Liệt kê các số nguyên từ 1 đến n.
- Nhân chúng theo thứ tự: 1 × 2 × 3 × ... × n. Nhân tuần tự từ trái sang phải là cách đơn giản nhất và tránh được ngăn xếp đệ quy sâu.
- Tích cuối cùng là n!.
- Để kiểm tra, máy tính cũng hiển thị khai triển đầy đủ để bạn xem từng bước nhân.
Công thức Giai thừa:
n! = n × (n-1) × (n-2) × ... × 2 × 1, với trường hợp cơ sở 0! = 1.
Ví dụ
Để tính 5!:
5! = 5 × 4 × 3 × 2 × 1 = 120
Vậy 5! = 120.
Thay đổi n trong ô nhập để tính giai thừa khác; khai triển bên dưới kết quả sẽ cập nhật theo.
Các trường hợp đặc biệt:
- 0! = 1 (theo định nghĩa, tích rỗng)
- 1! = 1
- Giai thừa tăng rất nhanh: 10! = 3.628.800; 20! ≈ 2,43 × 10¹⁸; 70! ≈ 1,2 × 10¹⁰⁰
Ứng dụng của Giai thừa:
- Hoán vị: n! cách sắp xếp n đối tượng khác nhau
- Tổ hợp: C(n,k) = n! / (k! × (n−k)!)
- Xác suất và thống kê (hệ số đa thức, kỳ vọng)
- Khai triển chuỗi Taylor: e^x = Σ xⁿ / n!
- Xấp xỉ Stirling cho giai thừa lớn: n! ≈ √(2πn) × (n/e)ⁿ
Câu hỏi thường gặp
Ba lập luận độc lập đều dẫn đến 0! = 1, nên các nhà toán học cố định quy ước này thay vì để 0! không xác định. (1) Tích rỗng: trong đại số, nhân không có số nào với nhau cho phần tử đơn vị của phép nhân, tức là 1 — cùng logic làm x⁰ = 1 với mọi x khác 0. (2) Tổ hợp: C(n,0) đếm số cách chọn ra không gì từ n đối tượng, đúng bằng 1 (chọn rỗng). Công thức C(n,0) = n! / (0! × n!) chỉ ra 1 khi 0! = 1. (3) Nhất quán đệ quy: quy tắc n! = n × (n−1)! phải đúng tại n = 1, cho 1! = 1 × 0!, vậy 0! phải bằng 1 để 1! = 1 đúng. Cùng logic mở rộng sang hàm gamma Γ(n+1) = n!, với Γ(1) = 1 bằng tích phân trực tiếp. Vậy 0! = 1 không phải lựa chọn tùy tiện — đó là giá trị duy nhất giữ toàn bộ bộ máy công thức nhất quán.
Vì 170! ≈ 7,257 × 10³⁰⁶ là giai thừa lớn nhất vừa với một số dấu phẩy động chính xác kép chuẩn IEEE-754, với cực đại khoảng 1,798 × 10³⁰⁸. 171! ≈ 1,241 × 10³⁰⁹ tràn thành Infinity trong JavaScript, Excel và hầu hết máy tính. Để xử lý n lớn hơn, phép tính chuyển sang BigInt — kiểu nguyên có độ chính xác tùy ý tích hợp sẵn trong JavaScript hiện đại — có thể tính bất kỳ giai thừa nào chỉ giới hạn bởi bộ nhớ và thời gian. 1000! có 2568 chữ số và mất một phần giây; 100000! có 456.574 chữ số và mất vài giây. Với giai thừa rất lớn thường bạn không cần giá trị chính xác — bạn cần xấp xỉ Stirling log(n!) ≈ n log n − n + 0,5 log(2πn), chính xác đến phần trăm nhỏ ngay cả với n vừa phải.
Xấp xỉ Stirling nói rằng n! ≈ √(2πn) × (n/e)ⁿ với n lớn. Sai số dưới 1% khi n ≥ 10 và dưới 0,1% khi n ≥ 100, vậy về cơ bản là chính xác cho mọi ứng dụng không cần từng chữ số. Phiên bản logarit, log(n!) ≈ n log n − n + 0,5 log(2πn), mới là cái thực sự được dùng trong thực tế vì hàm mũ thô tràn nhanh như chính n! — nhưng logarit thì không. Cơ học thống kê, lý thuyết thông tin và phương pháp điểm yên ngựa trong giải tích phức đều dựa vào dạng log để ước lượng các đại lượng như entropy của một hệ, hành vi tiệm cận của hệ số nhị thức và định lý giới hạn trung tâm. James Stirling công bố điều này trong Methodus Differentialis năm 1730; một phiên bản chính xác hơn đã được de Moivre tìm ra trước đó. Tinh chỉnh tiếp cho chuỗi Stirling — chuỗi tiệm cận hữu ích trong giải tích số.
Cả ba đều đếm cách sắp xếp, nhưng khác nhau ở chỗ coi cái gì là khác biệt. Giai thừa n! đếm số thứ tự của n đối tượng khác nhau — ABCDE có 5! = 120 thứ tự. Hoán vị P(n,k) = n! / (n−k)! đếm các sắp xếp có thứ tự của k đối tượng chọn từ n — P(5,2) = 5!/3! = 20 cặp có thứ tự, trong đó AB và BA được tính riêng. Tổ hợp C(n,k) = n! / (k! × (n−k)!) đếm các lựa chọn không có thứ tự của k đối tượng từ n — C(5,2) = 10 vì AB và BA giờ là một. Quy tắc nhớ: nếu thứ tự quan trọng, dùng hoán vị; nếu không, dùng tổ hợp. Giai thừa là trường hợp đặc biệt k = n. Cả ba quy về biểu thức gọn gàng với giai thừa, vì vậy máy tính giai thừa là nền tảng cho toàn bộ tổ hợp.
Có — chúng được định nghĩa bằng hàm gamma Γ, mở rộng giai thừa đến gần như mọi số thực và phức. Quan hệ chính xác là n! = Γ(n+1), nên Γ(1) = 0! = 1, Γ(2) = 1! = 1, Γ(3) = 2! = 2, v.v. Với đối số không nguyên, bạn nhận được các giá trị hữu ích như Γ(0,5) = √π, tương đương (−0,5)! = √π ≈ 1,7725. Các giá trị bán nguyên xuất hiện khắp vật lý — thể tích hình cầu n chiều, phân phối chi-bình phương, chuẩn hóa phân phối vận tốc Maxwell-Boltzmann. Tuy nhiên, số nguyên âm vẫn không xác định: Γ có cực tại 0, −1, −2, ..., nên (−1)!, (−2)!, ... là vô hạn. Máy tính này trả về lỗi khi nhập số nguyên âm thay vì cho giá trị gây hiểu lầm. Nếu cần giá trị Γ, hãy dùng công cụ chuyên về hàm gamma hoặc ngôn ngữ lập trình có hàm tgamma.
Các chữ số 0 ở cuối của n! đến từ các thừa số 10 trong tích, và mỗi 10 cần một thừa số 2 và một thừa số 5. Số lượng thừa số 2 trong n! luôn vượt số lượng 5, nên số chữ số 0 ở cuối bằng tổng số thừa số 5 trong phân tích của n!. Công thức Legendre cho chính xác: Z(n) = ⌊n/5⌋ + ⌊n/25⌋ + ⌊n/125⌋ + ⌊n/625⌋ + ... cho đến khi các số hạng bằng 0. Ví dụ: 100! có ⌊100/5⌋ + ⌊100/25⌋ = 20 + 4 = 24 chữ số 0 ở cuối; 1000! có 200 + 40 + 8 + 1 = 249 chữ số 0 ở cuối. Đây là bài toán cổ điển của thi đấu toán, và đẳng thức Legendre cho lời giải trong O(log n) — nhanh hơn rất nhiều so với tính chính giai thừa. Kỹ thuật tương tự áp dụng cho mọi cơ số: với cơ số b, đếm số lần xuất hiện của từng thừa số nguyên tố của b trong n! và lấy giá trị nhỏ nhất sau khi cân chỉnh.
Lặp gần như luôn tốt hơn cho n!. Định nghĩa đệ quy n! = n × (n−1)! đọc tự nhiên và là ví dụ giáo khoa dạy đệ quy, nhưng trong thực tế nó cấp phát một khung ngăn xếp cho mỗi số nguyên đến trường hợp cơ sở. Các engine JavaScript thường giới hạn ngăn xếp khoảng 10.000 đến 100.000 khung trước khi ném RangeError: Maximum call stack size exceeded, còn Python mặc định là 1.000. Vòng lặp lặp — for (let i = 2, r = 1n; i <= n; i++) r *= BigInt(i) — dùng ngăn xếp hằng và chạy nhanh hơn do không có chi phí gọi hàm mỗi bước. Một số ngôn ngữ (Scheme, Scala trong trường hợp đặc biệt) hỗ trợ tối ưu hóa đệ quy đuôi và có thể biên dịch một giai thừa đệ quy viết đúng thành vòng lặp, nhưng JavaScript và Python thì không. Để học, viết bản đệ quy một lần để cảm nhận cấu trúc; với mã sản xuất hoặc tính toán phía trình duyệt như máy tính này, hãy dùng vòng lặp.
Ở nhiều nơi hơn người ta tưởng. (1) Xác suất: nghịch lý sinh nhật, đếm các bàn bài poker, xác suất xổ số — đều xây trên tổ hợp, vốn là tỷ số giai thừa. (2) Thống kê: phân phối nhị thức và đa thức, chi-bình phương và gamma, xấp xỉ chuẩn dựa trên Stirling cho luật rời rạc. (3) Giải tích: mọi chuỗi Taylor — sin, cos, e^x, log(1+x) — đều có n! ở mẫu. Chính n! ở mẫu làm chuỗi hội tụ nhanh hơn đa thức ở tử tăng. (4) Vật lý: hàm phân hoạch trong cơ học thống kê, đếm đường đi trong cơ học lượng tử, tiết diện tán xạ. (5) Khoa học máy tính: thuật toán đếm, phân tích trường hợp trung bình của sắp xếp (n! hoán vị trên n phần tử), suy luận FFT. (6) Đời sống hàng ngày: đếm đảo chữ ("có bao nhiêu cách sắp xếp các chữ trong MISSISSIPPI?" dùng 11! chia cho giai thừa của các chữ lặp), sơ đồ chỗ ngồi, ước lượng độ mạnh mật khẩu.