Thut toán Doomsday
Để biết mt ngày nào đó trong năm là th my thì bn làm thế
nào? Có l bn s cn mt quyn lch để dò tìm. Tuy nhiên,
không cn đến lch, tôi vn có th tính được th ca bt k ngày
nào trong bt c năm nào.
Gii thiu:
Để biết mt ngày nào đó trong năm là th my thì bn
làm thế nào? Có l bn s cn mt quyn lch để dò tìm.
Tuy nhiên, không cn đến lch, tôi vn có th tính được th ca bt k ngày nào trong
bt c năm nào. Bn có nghĩ tôi “xo” không ? Bn hãy theo dõi cách tính th ca mt
ngày bt k theo phương pháp ca tiến sĩ John Horton Conway (1), mt nhà toán hc
ni tiếng, ri bn s thy nhng gì tôi nói trên là không sai. Cách tính này do tiến sĩ
Conway phát minh vào nhng năm 1970, được coi là phương pháp đơn gin và d nh
nht so vi các cách tính th khác (2).
Doomsday ca mt năm là gì?:
Trước tiên, bn cn biết v khái nim Doomsday. Doomsday ca mt năm là ngày cui
cùng ca tháng hai, tc là ngày 28/2 năm thường và 29/2 năm nhun (3). Ví d
như Doomsday ca năm 2004 (năm nhun) là ch nht 29/2.
Khi biết được Doomsday, bn s tính được th ca các ngày khác trong tháng hai bng
cách ly Doomsday làm mc và tính ngược li tng tun. Chng hn như để biết ngày
14/2/2004 là th my, bn làm như sau: 29-7=22, 22-7=15, ngày 22/2 và 15/2 đều là
ch nht, như vy 14/2 là th by.
Cách tính đối vi nhng tháng chn:
Bn đã tính được th ca các ngày trong tháng hai, còn nhng tháng khác thì sao?
Trước tiên, chúng ta nói v nhng tháng chn (các tháng 4, 6, 8, 10, 12). Đối vi các
tháng chn này, các ngày sau s có th trùng vi Doomsday: 4/4, 6/6, 8/8, 10/10,
12/12. Tht d nh phi không bn? Trong năm 2004, các ngày trên đều là ch nht
(trùng vi th ca ngày 29/2). Áp dng cách tính ging tháng hai, bn s tính được th
ca bt c ngày nào trong các tháng chn.
Cách tính đối vi nhng tháng l:
Đối vi nhng tháng l thì tính như thế nào? Cách tính cũng tương t như trên, tuy
nhiên chúng ta cn nh mt ngày trong tháng có th trùng vi Doomsday. Trước hết
chúng ta xét các tháng 5, 7, 9, 11. Các ngày 9/5, 5/9, 11/7, 7/11 s có th trùng
vi Doomsday.
Còn tháng ba thì sao? Doomsday (28/2 hoc 29/2) có th coi là ngày 0/3. Vì vy ngày
7/3 s có th trùng vi Doomsday.
Có mt cách giúp bn nh các ngày trên ca các tháng l (tr tháng 1). Đối vi nhng
tháng 3, 5, 7 là nhng tháng dài (31 ngày), bn ly tháng đó cng thêm 4 s ra ngày
cn nh (tháng 3: 3+4=7 => ngày 7/3; tháng 5: 5+4=9 => ngày 9/5; tháng 7:
7+4=11 => ngày 11/7), Đối vi nhng tháng 9, 11 là nhng tháng ngn (30 ngày),
bn ly tháng đó tr đi 4 s ra ngày cn nh (tháng 9: 9-4=5 => ngày 5/9; tháng 11:
11-4=7 => ngày 7/11).
Tháng mt thì hơi đặc bit. Vi năm thường, ngày 31/1 s có th trùng vi Doomsday
(28 ngày sau ngày 31/1 là ngày 28/2 chính là Doomsday). Vi năm nhun, Doomsday
là ngày 29/2 nên ngày 1/2 (coi như là ngày 32/1) có th trùng vi Doomsday, do vy
ngày 31/1 có th trước Doomsday mt ngày. Bn cn chú ý đim đặc bit này để tính
cho chính xác.
Sau khi đọc cách tính trong tháng mt ca tiến sĩ Conway, mt độc gi tên Bob
Goddard đã đề ngh mt ngày khác d nh hơn đối vi tháng mt. Đó là ngày 3/1
trong năm thường và ngày 4/1 trong năm nhun. Các ngày này có th trùng vi
Doomsday. Để d nh, ta liên tưởng s 3 là 3 năm thường trong chu k 4 năm s
năm nhun, còn s 4 gi ý đến năm nhun vì năm nhun chia hết cho 4.
Doomsday ca các năm trong thế k 20:
Mun tính th ca bt k ngày nào trong mt năm, bn cn biết Doomsday ca năm
đó. Doomsday ca năm 2004 là ch nht 29/2, vy Doomsday ca năm 2003 là th
my? Xin tr li bn là th sáu. Bi vì năm 2004 là năm nhun có 366 ngày, 366 chia 7
dư 2, vì vy Doomsday ca năm 2003 có th trước Doomsday ca năm 2004 hai ngày
nên là th sáu. Tương t, Doomsday ca năm 2002 là th năm vì năm 2003 có 365
ngày, 365 chia 7 dư 1. Như vy, để tính Doomsday ca mt năm trước năm thường,
bn lùi 1 ngày, để tính Doomsday ca mt năm trước năm nhun, bn lùi 2 ngày. (Bn
lưu ý là năm nhun dư ra 1 ngày thì ngày này nh hưởng đến năm trước đó ch không
phi năm sau nó vì Doomsday ca năm nhun là ngày 29/2 ch không phi 28/2). Áp
dng cách này, biết Doomsday ca mt năm nào đó, ta tính được Doomsday ca
nhng năm khác.
Bng bên là Doomsday ca nhng năm trong thế k 20 (năm in đậm là năm nhun).
Phn ln chúng ta sinh ra và sng trong thế k 20 nên có l bng này s được dùng
nhiu. Tuy nhiên, tht khó để nh được mi chi tiết trong bng. Nhưng có mt cách
tính khác giúp bn biết được Doomsday ca tng năm trong thế k 20.
Trước hết bn cn ghi nh Doomsday ca năm 1900 là th tư. C 4 năm thì có mt
năm nhun, vì vy Doomsday mi 4 năm cách nhau 5 ngày. Tương t, Doomsday mi
8 năm cách nhau 10 ngày, hay là 3 ngày (10 chia 7 dư 3), Doomsday mi 12 năm cách
nhau 15 ngày, hay là 1 ngày. Ta s ghi nh chu k 12 năm này (tin li vì con s chênh
lch ch là 1 ngày) để tính nhanh Doomsday ca mt năm. Chng hn như ta tính được
Doomsday ca năm 1914 là th by, bi vì Doomsday ca năm 1900 là th tư nên
Doomsday ca năm 1912 (12 năm sau) là th năm nên Doomsday ca năm 1914 là th
by.
Đối vi mt năm bt k trong thế k 20 (19YY), bn tính Doomsday theo quy tc sau:
- a là thương s ca phép chia YY cho 12
- b là s dư ca phép chia YY cho 12
- c là thương s ca phép chia b cho 4 (biết s năm nhun để tính s ngày cng thêm)
- d=a+b+c
- e là s dư phép chia d cho 7
- Doomsday ca năm 19YY s có th sau Doomsday ca năm 1900 (th tư) e ngày.
Ví d: Doomsday ca năm 1929 là th my?
Tr li: a = 29 div 12 = 2; b = 29 mod 12 = 5; c = b div 4 = 5 div 4 = 1; d = a+b+c =
2+5+1 = 8; e = d mod 7 = 8 mod 7 = 1. Sau th tư 1 ngày (e=1) là th năm. Như vy
Doomsday ca năm 1929 là th năm.
Doomsday ca năm đầu trong mt s thế k:
Đối vi nhng thế k khác, cách tính Doomsday cũng tương t như đối vi thế k 20.
Vn đề đây là bn cn biết Doomsday ca năm đầu tiên ca thế k. Bng dưới đây
cung cp cho bn Doomsday ca năm đầu ca mt s thế k. Để nhó bng này cũng
không quá khó.
ng dng:
Nếu bn có kh năng nh và tính toán tương đối nhanh thì cách tính trên (cũng không
quá phc tp để nh) giúp bn có th tính nhm th ca bt k ngày nào. Điu này
khiến bn chng khác gì mt “quyn lch sng”. Tht n tượng phi không bn? Các
bn lp trình có th áp dng cách tính trên vào chương trình ca mình. Ch vi mt s
dòng lnh tương đối đơn gin, bn đã có mt b lch “liên thế k”, đối vi nhng
chương trình cn tra ngày tháng, bn s không tn công lưu tr lch để tra cu… Tôi
nghĩ phương pháp trên rt hay, hu dng và hy vng nó cũng s mang li ích li gì đó
cho bn.
Bn có th ti chương trình Doomsday có s dng cách tính trên để kham tho.
Chương trình viết bng Visual Basic, nhm minh ha cách “tin hc hóa” thut toán
Doomsday, có th tính th mt ngày bt k và in ra lch ca các năm. (Thc ra vi kh
năng tính ca máy tính thì không cn s dng thut toán Doomsday cũng tính được
th ca mt ngày bt k. Ví d như biết rng hôm nay là th năm 7/10/2004 thì đơn
thun chúng ta ch cn đếm ngược li hoc đếm lên để tính th mt ngày bt k.)