Pages

10/13/2011

วิธีคำนวนปฏิทินร้อยปีในใจ (พร้อมเหตุและผล)

(ภาพจาก iblog.siamhrm.com)


บล๊อคโพสต์นี้เป็นคณิตศาสตร์หน่อยแล้วกัน  พอดีได้ไปอ่านบทความเรื่องการคำนวนปฏิทินร้อยปีจาก http://lifehacker.com/5848651/how-to-quickly-figure-out-the-day-of-the-week-any-date-falls-on แล้วก็เห็นว่ามีสูตรคำนวนแบบง่ายๆอยู่ที่ http://gmmentalgym.blogspot.com/2011/03/day-of-week-for-any-date-revised.html  แต่ว่า.. พอเปิดเข้าไป ก็เจอแต่วิธีท่องจำ  ซึ่งเป็นอะไรที่ไม่ชอบเลยจริงๆ  เลยพยายามนั่งคิดให้เข้าใจสูตรอยู่   พอเข้าใจแล้วก็เลยเอามาเขียนบรรยายตรงนี้  เก็บเอาไว้กันลืม

วิธีแบบง่าย
วิธีนี้เอาไว้ใช้คำนวนภายในเดือนเดียวกัน หรือว่าห่างกันไปไม่กี่เดือน หรืออาจจะข้ามไม่กี่ปี  โดยเราจะใช้เทคนิคที่ว่า
วันที่ +7 แล้วจะออกมาเป็นวันเดิมเสมอ
ยกตัวอย่าง วันนี้เป็นวันที่ 13 ตุลาคม เป็นวันพฤหัสบดี ดังนั้นวันที่ 13+7 (=20), 13+7+7 (=27) ก็จะเป็นวันพฤหัสบดีด้วย  แน่นอนว่ากฎนี้ยังใช้ถอยหลัง(-7) ได้ด้วย ซึ่งจะทำให้ 13-7 (=5) เป็นวันพฤหัสด้วย
และพอเราได้วันใกล้เคียงแล้ว ก็ค่อยเทียบเดินหน้าถอยหลังไปไม่กี่วัน ก็จะรู้ว่าวันที่ต้องการนั้นคือวันอะไร
ถ้าเอากฎข้อนี้มาประยุกต์ใช้ต่อ  ถ้าเราอยากคำนวนวันห่างๆออกไปที่หารด้วย 7 ไม่ลงตัว จะสามารถใช้วิธีเอาผลต่างตรงนั้นมาทำ modulo (หรือการหารเอาเศษ) เพื่อให้ได้วันที่ต้องการได้เลยทันที
ยกตัวอย่างเช่น ถ้าต้องการหาว่าวันที่ 30 ตุลาคม เป็นวันอะไร โดยที่รู้ว่าวันที่ 13 ตุลาคมเป็นวันพฤหัส  เราก็จะสามารถใช้ผลต่าง 30 - 13 = 17 วันนี้ เอามาหารด้วย 7 เพื่อหาเศษ ซึ่งจะได้เป็น 17 % 7 = 3 นั่นหมายถึงว่า เราต้อง +3 จากวันพฤหัสไป ซึ่งหมายถึงว่าวันที่ต้องการนั้นเป็นวันอาทิตย์นั่นเอง

อีกกฎนึงก็คือ
บวกเดือน -คม ให้ +3 , บวกเดือน -ยน ให้ +2

ตรงนี้คือการนำกฎข้อที่แล้วมาใช้  เนื่องจาก เดือนที่ลงด้วย -คม จะมี 31 วัน ซึ่งก็คือ 7x4 + 3 ซึ่งถ้าการ +7 ทำให้ได้วันเดิมแล้ว ถ้าเราต้องการข้ามเดือนก็ต้อง +3 ของเดือนปัจจุบันเข้าไป  วิธีคิดเดือน -ยน ก็ใช้วิธีเดียวกัน

เช่น เรารู้ว่าวันที่ 13 ตุลาคมเป็นวันพฤหัส  แต่เราต้องการรู้ว่า วันที่ 20 เดือนหน้า(พ.ย.) เป็นวันอะไร
เราก็รู้ว่าเดือนนี้ลงท้ายด้วย -คม ดังนั้นเราจะ +3 ไปจากวันปัจจุบัน(พฤหัส)
ทำให้รู้่ว่าเดือนหน้า วันที่ 13 คือวันอาทิตย์ (พฤหัส+3)

แต่วันที่ 13 พ.ย. ยังไม่ใช่วันที่เราต้องการ(20 พ.ย.) ดังนั้นก็ใช้กฏแรกข้างบนเทียบต่อ ก็คือ 13+7 (=20) จะเป็นวันเดียวกัน ซึ่งก็คือเป็นวันอาทิตย์เหมือนเดิม

** หมายเหตุ: สำหรับเดือน กุมภาพันธ์ ซึ่งปกติมี 28 วัน ซึ่งเกิดจากก็คือ 7x4 ก็จะต้อง +0 เข้าไป ยกเว้นถ้าเป็นปีอธิกสุรทิน(leap year) เดือนก.พ.จะมี 29 วัน หรือก็คือ 7x4 + 1 ก็ค่อย +1 เข้าไป

และสุดท้ายแบบข้ามปี
เนื่องจาก ปีนึงปกติมี 365 วัน  หรือก็คือ 7x52 + 1  นั่นหมายความว่า ถ้าเราคิดถึงวันเดียวกันในปีถัดไป หรืออีก 365 วันข้างหน้า  วันนั้นก็จะเป็นวันปัจจุบัน +1
แต่ถ้าการนั้บข้ามปีนี้ จะผ่านวันที่ 29 กุมภาพันธ์ ด้วย นั่นจะทำให้ต้องนับเป็น 366 วัน หรือก็คือ 7x52 + 2 หรือก็คือวันปัจจุบัน +2
ก็จะสรุปได้ว่า
วันเดียวกันของปีข้างหน้าให้ +1, แต่ถ้านับผ่าน 29 กุมภาพันธ์ ก็ให้นับวันนั้นเพิ่มกลายเป็น +2 แทน

วิธีแบบยากแต่เร็ว

เนื่องจากวิธีข้างบนดูเหมือนจะง่าย แต่ว่ากว่าจะคิดหาวันแต่ละวันได้มันจะต้องใช้เวลาค่อนข้างนานในการเทียบแต่ละอย่าง ดังนั้นก็เลยมีคนแปลงวิธีด้านบนให้กลายมาเป็นสูตรง่ายๆ เพียงแค่แปลงวันเดือนปีที่ต้องการให้กลายเป็นตัวเลขก่อน แล้วค่อยเอาเลขพวกนั้นมาบวกกันก็จะได้วันที่ต้องการเลย
และแน่นอน..ตามหลักของ computer science  การคิดให้ความซับซ้อนน้อยลงก็ต้องแลกกับพื้นที่ความจำที่มากขึ้น (computation - memory trade-off)

สิ่งที่ต้องจำคือ
การแปลงวัน
ความหมายของวันในสัปดาห์(ผลลัพธ์การคำนวน)จะตีความได้ดังนี้
อาทิตย์ : 0
จันทร์ : 1
อังคาร : 2
พุธ : 3
พฤหัสบดี : 4
ศุกร์ : 5
เสาร์ : 6

คำอธิบาย:
ตรงนี้จะใช้ตัวเลขทางคณิตศาสตร์แทนวัน  โดยใช้เริ่มต้นจาก 0 และจบลงที่ 6
นั่นทำให้เวลาคำนวนเลขแล้วมีเลขเกิน 6 จะสามารถใช้วิธี modulo ด้วย 7 เพื่อให้ลดลงมีค่าอยู่ระหว่าง 0 - 6 ได้เหมือนเดิม เพื่อความสะดวกในการคิดคำนวน

ภาษาง่ายๆคือหมายถึงว่า  ถ้าคำนวนแล้วเลขเกิน 7 (วันในสัปดาห์มีแค่7วัน) ให้เอา 7 หาร แล้วเหลือเศษเท่าไหร่ก็จะได้ตัวเศษนั้นเป็นผลลัพธ์แทน
**ปล. การใช้ 7 หาร มาจากกฎข้อแรก

การแปลงเดือน
ตามตารางในลิงค์ที่ 2 ด้านบนจะแสดงการแปลงค่าเดือนไว้ดังนี้
มกราคม : 6
กุมภาพันธ์ : 2
มีนาคม : 2
เมษายน : 5
พฤษภาคม : 0
มิถุนายน : 3
กรกฎาคม : 5
สิงหาคม : 1
กันยายน : 4
ตุลาคม : 6
พฤศจิกายน : 2
ธันวาคม : 4
**โดยที่ปีไหนเป็นปี อธิกสุรทิน เดือน ม.ค.และก.พ.จะลดลงหนึ่ง เหลือเป็น 5 และ 1 ตามลำดับ

คำอธิบาย
จะเห็นว่าค่าของเดือนต่างๆ จะเพิ่มไปตามคำอธิบายการเพิ่มเดือน(ในวิธีคำนวนแบบง่าย) ก็คือใช้การ +3, +2 เหมือนเดิม และถ้าเลขเกิน 6 เมื่อไหร่ เลข 7 ก็จะปัดลงมาเป็น 0 (เนื่องจากวันมีแค่ 7 วันต่อสัปดาห์)  ส่วนการเริ่มต้นให้มกราคมเป็นเลข 6 นั้นเพื่อเป็นการดุลสมการให้ตรงกับวันที่ 1 มกราคม 2000 ซึ่งตรงกับวันเสาร์(6)  ซึ่งเดี๋ยวจะกล่าวต่อไป

การแปลงปี
การแปลงปีในสุตรตามลิงค์ที่2ด้านบนสุดจะบอกว่าให้จำว่า
ปีที่ติดกันและไม่เป็นปีอธิกสุรทิน ให้ใช้ +1 เช่น
2000 : 0
2001 : 1
2002 : 2
2003 : 3

คำอธิบาย:
วิธีคิดปีถัดไปที่ติดกันให้ดูที่วิธีคิดปีแบบง่ายจะเห็นว่าทำไมต้อง +1

แต่ถ้าเริ่มห่างเกิน 4 ปี ให้หาว่าห่างจากปีอธิกสุรทินที่ใกล้ที่สุดเท่าไหร่  โดยให้จำปีอธิกสุรทินเฉพาะคือ
2000 : 0
2004 : 5
2008 : 3
2012 : 1
2016 : 6
2020 : 4
2024 : 2

คำอธิบาย:
เนื่องจากปีที่ลงอธิกสุรทินจะมีวันเพิ่มขึ้น 1 วัน ดังนั้นจึงต้องเพิ่ม +1 เข้าไปเพื่อที่จะชดเชยกับวันนั้น
ทำให้จากเดิมที่ปีอธิกสุรทินถัดไปแทนที่จะแค่ +4 (สี่ปีถัดจากก่อนหน้า) แต่ต้องกลายเป็น +5 เพราะเพิ่มวันที่ชดเชยนั้น  และถ้าเกิน 7 ก็ให้ใช้วิธีหารด้วย 7 เอาเศษเหมือนเดิม(เพราะมีแค่7วันในสัปดาห์)

และเนื่องจากเราชดเชยวันพิเศษนี้ไปแล้วด้วยการบวก 1 เพิ่มไปในการแปลงปี ซึ่งจะทำให้ปีทั้งปีมีวันเพิ่มขึ้นไปหนึ่งวัน  แต่เนื่องจากวันพิเศษนี้คือ 29 ก.พ. ดังนั้นเดือนที่จะไม่ได้รับผลกระทบจากวันพิเศษนี้ก็คือเดือนม.ค.และก.พ. ดังนั้นเลยทำให้ในการแปลงเดือนของเดือนม.ค.และก.พ.ในปีที่เป็นอธิกสุรทินต้องมีการ -1 เพื่อชดเชยการชดเชยการแปลงปีตรงนี้ด้วย

และถ้าสังเกตให้ดีในการแปลงปี เมื่อครบ 12 ปี จะเป็นการ +1 แทน (365x12 + 1x3 = 4380 = 7x626 +1)
จะทำให้ได้วิธีจำง่ายๆว่า
2000 : 0
2012 : 1
2024 : 2
2036 : 3
2048 : 4

การคำนวน
วิธีการคำนวน ก็คือการแปลงวันที่ได้รับมาให้อยู่ในตัวเลขก่อน แล้วค่อยนำตัวเลขเหล่านั้นมาบวกกัน โดยใช้หลัก
วันที่ต้องการ = วันที่ + เดือน(แปลงแล้ว) + ปี(แปลงแล้ว)

ยกตัวอย่างเช่น
วันที่ 13 ต.ค. 2011
วันที่ : 13
เดือน : ต.ค. = 6
ปี : 2011 = ปีอธิกสุรทินใกล้สุดคือ 2008 + 3 = 3 + 3 = 6
ดังนั้นวันนั้นคือ วันที่ + เดือน + ปี = 13 + 6 + 6 = 25 = 7x3 + 4 = 4 = วันพฤหัส

ตัวอย่างที่ 2
วันที่ 1 ม.ค. 2000
วันที่ : 1
เดือน : ม.ค. = 6 แต่เป็นปีอธิกสุรทินจะต้อง -1 = 5
ปี : 2000 = 0
วันนั้นจะเป็นวัน 1 + 5 + 0 = 6 = เสาร์

และถ้าสังเกตดีๆ ตรงนี้นี่เองที่เป็นการบังคับว่ามกราคมต้องแทนด้วยเลข 6 ซึ่งส่งผลต่อเลขเดือนอื่นๆที่ต้องท่องจำด้วย  ก็เพราะวันที่ใช้อ้างอิงในสูตรนี้คือ 1 มกราคม 2000 ซึ่งเป็นวันเสาร์นั่นเอง

ตัวอย่างที่ 3
วันที่ 31 ธันวาคม ปี 2099
วันที่ : 31
เดือน : ธันวาคม = 4
ปี : 2099 = 2096 + 3 = (2000 + 12x8) + 3 = 8 + 3 = 11 = 7x1 + 4 = 4
ดังนั้นวันนั้นจะเป็นวัน 31 + 4 + 4 = 39 = 7x5 + 4 = 4 = วันพฤหัสบดีี

ลองเอาไปเล่นกันนะครับ  ^_^

UPDATE (23 ก.ย. 2555)
พอดีมีคนถามเรื่องการคิดถอยหลังไปในปีที่ตำกว่าปี 2000
เลยเขียนโพสต์เพิ่ม สำหรับการคำนวนที่ไม่อยู่ระหว่างปี 2000 - 2999
ติดตามอ่านได้ที่  วิธีคำนวนปฏิทินร้อยปีในใจ (พร้อมเหตุและผล) ภาค 2 สำหรับศตวรรษอื่น


No comments:

Post a Comment