Modular, Modulo, and Remainder

ตอนเขียนโปรแกรมสมัยแรกๆ เคยจำว่า modulo คือฟังก์ชันการหาเศษจากผลหาร แต่พอใช้ไปสักพักแล้วเริ่มรู้สึกแปลกๆ ตอนที่เวลาตัวตั้งหรือตัวหารเป็นค่าติดลบ ซึ่ง modulo ให้ผลเป็นค่าติดลบได้ อย่าง -5 mod 2 = -1 (เพราะ -2 * 2 + -1) .. เอ่อ .. ถ้า modulo ใช้สำหรับหา ‘เศษ’ ของการหาร ทำไมเศษมันเป็นติดลบได้ล่ะ ? เศษมันควรจะ >= 0 หรือเปล่า ? .. เรื่องนี้อาจจะต้องย้อนกลับไปไกลหน่อย

ที่มาของ modulo หรือ mod มาจาก modular arithmetic ซึ่งนิยามโดย คาร์ล เฟดริก เกาส์ เมื่อสองร้องกว่าปีที่แล้ว ตามนิยามที่เกาส์เขียนไว้คือ จำนวนเต็ม a, b จะเป็น congruent modulo ของจำนวนเต็ม n ถ้า (a – b) หารด้วย n ลงตัว หรือเขียนได้เป็น

a ≡ b (mod n)

ถ้าคิดย้อนกลับก็จะได้ว่า a หารด้วย n จะได้เศษเป็น b .. ใน modular arithmetic ค่า b เป็นจำนวนเต็มบวกหรือลบก็ได้ ดังนั้นผลลัพธ์ของ modulo จึงเป็นค่าติดลบได้ .. ค่า b บางทีเรียกว่า residue หรือ remainder แยกเป็นสองแบบคือ minimal residue มีค่าเท่ากับ b หรือ b – n ขึ้นกับว่าค่าสัมบูรณ์ของตัวไหนน้อยกว่าก็เอาตัวนั้น และอีกแบบคือ common residue ซึ่งคือเศษของการหาร โดย b ต้องเป็นจำนวนเต็มที่น้อยกว่า n และ b >= 0

ดังนั้นค่าของ ฟังก์ชัน หรือ โอเปอร์เรเตอร์ modulo ในโปรแกรมหรือภาษาสำหรับเขียนโปรแกรมทั้งหลายจึงไม่ได้ให้ผลลัพธ์เป็นเศษของการหารซะทีเดียว .. อย่างไรก็เรายังสามารถหาเศษของการหารโดยใช้ modulo ได้ โดยกรณีผลลัพธ์เป็นค่าติดลบ ให้บวกตัวหารเข้าไปอีกที เช่น ตัวอย่าง -5 mod 3 = -2 จะได้เศษของการหารคือ = -2 + 3 = 1