Máy tính modulo

Số dư (a mod b)
Tiếp theo

Phép modulo (hay “mod”) trả về phần dư sau phép chia số nguyên: 17 mod 5 = 2 vì 17 = 3·5 + 2. Đây là cốt lõi của số học đồng hồ, mật mã học, hàm băm và mẫu “mỗi hàng thứ N” trong SQL. Máy tính này nhận toán hạng nguyên hoặc thập phân, hiển thị rõ ràng thương và phần dư, đồng thời xử lý khác biệt về quy ước dấu giữa các ngôn ngữ (% trong Python ≠ % trong C với số âm).

Cách tính a mod b

  1. 1

    Nhập số bị chia (a) và số chia (b)

    Bất kỳ số nào; chấp nhận số thập phân và số âm.

  2. 2

    Chọn quy ước dấu

    Phép chia cắt bỏ (C, Java, Go), phép chia làm tròn xuống (Python, Ruby, quy ước toán học).

  3. 3

    Đọc thương và phần dư

    a = q·b + r, với quy tắc đã chọn cho dấu của r.

  4. 4

    Xem biểu thức toán học

    Các giá trị được thay vào giúp thấy rõ từng bước.

Hai quy ước cho số âm

Với toán hạng dương, mọi quy ước đều thống nhất: 17 mod 5 = 2. Với số âm, các ngôn ngữ khác nhau:

Ngôn ngữ -17 mod 5 Quy ước
Python, Ruby 3 Làm tròn xuống
C, Java, Go, JS -2 Cắt bỏ
Sách giáo khoa Toán 3 Làm tròn xuống (thường)

Phép chia làm tròn xuống: thương được làm tròn về phía −∞. Phần dư luôn mang dấu của số chia: cùng dấu với b. Phép chia cắt bỏ: thương được làm tròn về phía 0. Phần dư mang dấu của số bị chia: cùng dấu với a.

Với a = -17, b = 5:

  • Cắt bỏ: q = -3 (làm tròn về 0), r = -17 − (-3)·5 = -2.
  • Làm tròn xuống: q = -4 (làm tròn về -∞), r = -17 − (-4)·5 = 3.

Cả hai đều đúng theo quy ước của mình. Hãy chọn cái phù hợp với ngôn ngữ của bạn.

Modulo xuất hiện ở đâu

  • Thời gian. Số phút trong một giờ, các ngày trong tuần, số giây trong một ngày, tất cả đều là số học modulo.
  • Bảng băm. hash(key) mod table_size chọn một bucket.
  • Lập lịch xoay vòng (round-robin). task_i mod worker_count phân bổ công việc.
  • Mật mã học. RSA và Diffie-Hellman được xây trên mod n với các số nguyên tố cực lớn.
  • Mỗi hàng thứ N. Trong SQL: WHERE id % 3 = 0.
  • Kiểm tra chẵn/lẻ. n mod 2 == 0 nghĩa là số chẵn.
  • Mẫu xen kẽ. Kẻ sọc theo hàng, tô màu cách một phần tử.
  • Bộ đệm vòng. (index + 1) mod size quay lại đầu.

Các đẳng thức hữu ích

  • (a + b) mod n = ((a mod n) + (b mod n)) mod n
  • (a · b) mod n = ((a mod n) · (b mod n)) mod n
  • (a^k) mod n có thể tính bằng lũy thừa modular nhanh trong O(log k), thiết yếu cho mật mã số lớn.
  • a mod 1 = 0 với mọi số nguyên a.
  • a mod a = 0.

Modulo số thập phân

Với số thực, định nghĩa tự nhiên là a mod b = a − b · floor(a/b). 7.5 mod 2.5 = 0 vì 7,5 là bội số chính xác. 7.6 mod 2.5 = 0.1.

Toán tử % của JavaScript hoạt động trên số thực; fmod của Python thực hiện modulo thực kiểu cắt bỏ; % của Python thực hiện modulo thực kiểu làm tròn xuống.

Ví dụ có lời giải

  • 100 mod 7: 100 = 14·7 + 2, nên phần dư là 2.
  • 25 mod 4: 25 = 6·4 + 1, nên phần dư là 1.
  • -10 mod 3 (làm tròn xuống): -10 = -4·3 + 2, phần dư 2. (Cắt bỏ sẽ cho -1.)
  • 17.5 mod 5: 17,5 = 3·5 + 2,5, phần dư 2,5.

Câu hỏi thường gặp

Hầu hết trường hợp chúng đồng nghĩa. Về mặt hình thức, “modulo” thường hàm ý quy ước toán học (làm tròn xuống), trong khi “remainder” (phần dư) thường chỉ biến thể cắt bỏ (kiểu C). Những tên gọi này lọt vào tài liệu ngôn ngữ; khi quan trọng, hãy nêu rõ quy ước.

Python theo quy ước toán học (làm tròn xuống), giữ dấu của phần dư trùng với số chia. C theo quy ước ALU phần cứng (cắt bỏ), trong đó dấu của phần dư trùng với số bị chia. Không cái nào sai; chỉ là lựa chọn khác nhau.

Không, chia cho 0 là không xác định. Máy tính trả về lỗi khi b = 0.

Thường là có. Hãy kiểm tra đặc tả ngôn ngữ của bạn về cách xử lý số âm, Python và Ruby khác với C, Java, Go và JavaScript.

Với toán kiểu RSA dùng số 2048 bit, hãy dùng thư viện chuyên dụng (pow(a, b, n) của Python, BigInteger.modPow của Java). Máy tính này xử lý các giá trị thường ngày, không phải giá trị cấp mật mã.

Công cụ liên quan

Công cụ này có phiên bản bằng các ngôn ngữ khác