Tổng quát
NIM là một trò chơi toán học về chiến
lược, trong đó hai đấu thủ thay phiên lấy
đi các quân trên các hàng riêng rẽ. Mỗi lượt phải
lấy đi ít nhất một quân hay có thể nhiều
quân với điều kiện chúng phải ở trên cùng một
hàng. Tên hiện nay của trò chơi là do Charles L. Bouton thuộc Đại Học Harvard đặt
ra. Có hai qui ước chơi:
Misère mode: ai bị buộc
phải lấy quân sau cùng sẽ thua;
Normal mode: ai lấy quân
sau cùng sẽ thắng
Ví dụ bên dưới là cuộc so tài giữa hai
đấu thủ giả tưởng Nam và Bắc trên sân
đấu có ba hàng với ba quân số 3, 4, và 5.
Lý thuyết toán học
1. Chiến lược
từng bước là luôn luôn để
lại những cặp 1, 2, và 4, nếu có. 1, 2, và 4 ở
đây chính là những lũy thừa của 2 (distinct powers
of 2). Bất kỳ con số nào cũng là tổng số của
những lũy thừa nầy. Ví dụ: 5 là tổng số
của 22 0 20 = 4 0 1 = 5.
Quân số ở
các hàng
A B C
|
Phiên đi
|
Chiến
lược cặp
|
Ghi chú
|
3 4 5
1 4 5
1 4 2
1 3 2
1 2 2
0 2 2
0 1 2
0 1 1
0 0 1
|
Nam lấy 2 ở A và để lại 1 4 5
Bắc lấy 3 ở C và để lại 1 4 2
Nam lấy 1 ở B và để lại 1 3 2
Bắc lấy 1 ở C và để lại 1 2 2
Nam lấy hết A và để lại 0 2 2
Bắc lấy 1 ở B và để lại 0 1 2
Nam lấy 1 ở C và để lại 0 1 1
Bắc lấy 1 ở B và để lại 0 0 1
Nam lấy hết C và thắng
|
1 cặp 4 và 1 cặp 1
Không cặp
1 cặp 2 và 1 cặp 1
1 cặp 2 và một 1 lẻ
2 cặp 2
Không cặp
>>>>>>>>>>>>>>
1 cặp 1
Không cặp
|
Nếu theo luật misère thì Nam sẽ lấy
2 ở C và để lại (0, 1, 0)
|
2. Chìa khóa lý thuyết của
trò chơi là tổng số nhị phân (binary digital sum) của
kích thước quân số các hàng quân, nghĩa là, phép cộng
nhị phân nhưng không giữ (carries), nghĩa là cột
nào biết cột đó, như 5 5 = 10 thì kết quả
là 0, thế thôi, không giữ 1 cho cột bên trái. Nếu hai hạng
số giống nhau thì tổng bằng 0, ngược lại
thì bằng 1. Phép tính còn có tên là XOR với dấu vi
tính là ^ hay ⊕. Tổng số
của phép tính đó thường được gọi là
NIM SUM (như x ⊕ y để
phân biệt với x y).
Hàng
|
Thập phân
(Decimal)
|
Nhị phân
(Binary)
|
Ghi chú
|
A
|
3
|
011
|
|
B
|
4
|
100
|
|
C
|
5
|
101
|
|
Nim Sum
|
2
|
010
|
Nim-Sum của A, B, và C
= 3 ⊕ 4 ⊕ 5 = 2
|
Về Nim-Sum nầy, có một phép tính tương ứng
thường dễ tính nhẩm hơn; đó là diễn tả
quân số các hàng như là tổng số những lũy thừa
của 2 (distinct powers of 2) như đề cập bên trên,
sau đó bỏ hết những cặp lũy thừa bằng
nhau và cộng gộp những gì còn lại. Ví dụ:
Quân số các hàng
|
Những lũy thừa của 2
|
Những cặp lũy thừa giống nhau
|
Ghi chú
|
3
|
0 2 1 (0 21 20)
|
2 1
|
Sau khi bỏ hai cặp lũy thừa giống
nhau 4 và 1, tổng còn lại là 2, y hệt kết quả vừa
tìm được với phép tính nhị phân ở trên.
|
4
|
4 0 0 (22 0 0)
|
4
|
5
|
4 0 1 (22 0 20)
|
4
1
|
Nim Sum: 2
|
|
0
2 0
|
Theo Normal mode, muốn thắng,
mỗi lượt đi phải để lại một Nim-Sum = 0. Chiến lược nầy luôn luôn có thể thực hiện nếu Nim-Sum hiện có khác 0. Ngược lại, nếu
Nim-Sum hiện có bằng 0 thì đấu
thủ sắp đi sẽ thua nếu đối
phương không mắc phải sai lầm. Phép đi
đúng là kết quả của những tính toán sau đây;
- Cho X bằng Nim-Sum của các quân số hiện có
- XOR X với quân số
mỗi hàng và tìm xem quân số nào bị giảm bớt và
ghi nhận kết quả bị giảm
- Lấy quân ở
hàng đó sao cho quân số bằng với kết quả vừa
ghi nhận. Ví dụ:
A ⊕ X = 3 ⊕ 2 = 1 [vì (011) ⊕ (010) = 001 ]
B ⊕ X = 4 ⊕ 2 = 6
C ⊕ X = 5 ⊕ 2 = 7
Hàng duy nhất bị
giảm quân là A, nên phải giảm quân của A xuống
còn 1 (bằng cách lấy đi 2 quân).
Trong trường hợp
đặc biệt, nếu chỉ còn hai hàng thì chiến
lược là giảm quân số trong hàng lớn hơn xuống
bằng hàng kia. Sau đó, bất luận đối thủ
của bạn có đi nước nào thi bạn vẫn có
thể áp dụng chiến thuật trên ở hàng kia.
Theo Misère mode: chiến
lược nầy chỉ khác normal mode bắt đầu
khi đấu thủ giảm quân ở mọi hàng xuống
tối đa bằng 1 (Bước màu đỏ trong bảng
bên dưới). Trong trường hợp đó, muốn thắng
phải chừa lại một số lẻ những hàng có
một quân (ngược với normal mode chừa lại một
số chẵn nhưng hàng như thế.) Ví dụ:
Quân số ở
các hàng
A B C
|
Lượt
đi
|
Ghi chú
|
3 4 5 (0102)
= 210
1 4 5 (0002)
= 010
1 4 3 (1102)
= 610
1 2 3 (0002)
= 010
1 2 2 (0012)
= 110
0 2 2 (0002)
= 010
0 2 1 (0112)
= 310
0 0 1 (0102)
= 110
|
Nam lấy 2 ở A và để lại tổng
000 để thắng
Bắc lấy 2 ở C và để lại 111
Nam lấy 2 ở C và để lại 000
Bắc lấy 1 ở C và để lại 001
Nam lấy 1 ở A và để lại 000
Bắc lấy 1 ở C và để lại 021
Nam lấy hết B và để lại
một số lẻ những hàng có 1 quân
Bắc lấy 1 ở C và thua
|
Nếu theo normal mode thì Nam sẽ lấy 1 ở
B và để lại một số chẵn những hàng
có 1 quân.
|
Định lý: Trong một trò
chơi NIM, đấu thủ nào đi trước đều
có cơ hội thắng, chỉ với điều kiện
là tổng quân số các hàng theo định nghĩa Nim-Sum khác 0. Bằng không đối
phương sẽ thắng.
(In a normal Nim game, the player making
the first move has a winning strategy if and only if the nim-sum
of the sizes of the heaps is nonzero. Otherwise, the second player has a
winning strategy.)
Chứng minh: Xin nhớ rằng
Nim-sum (⊕) tuân theo luật chuyển cụm (associativity) và
chuyển trị (commutativity), đồng
thời thỏa mãn đặc tính x ⊕ x = 0.
[Associativity: a (bc) = (ab)c.
Commutativity: a b = b a]
Cho x1, ..., xn là những quân số của các hàng trước khi lấy
quân, và y1, ..., yn
là những quân số
tương ứng sau khi lấy quân. Cho s = x1 ⊕ ... ⊕ xn và t = y1 ⊕ ... ⊕ yn. Giả sử quân được
lấy từ hàng k thì chúng
ta có xi = yi
với tất cả
i ≠ k, and xk > yk. Theo những đặc
tính của ⊕ nói trên, chúng ta
có
t = 0 ⊕ t
= s ⊕ s ⊕ t [ 0 = s ⊕s]
= s ⊕ (x1 ⊕ ... ⊕ xn)
⊕ (y1 ⊕ ... ⊕ yn) [ s = ⊕ of x; t= ⊕ of y]
= s ⊕ (x1 ⊕ y1) ⊕ ... ⊕ (xn
⊕ yn) [Associativity]
= s ⊕ 0 ⊕ ... ⊕ 0 ⊕ (xk
⊕ yk)
⊕ 0 ⊕ ... ⊕ 0 [x ⊕ x = x ⊕ y=0; và (xk ⊕ yk) ≠ 0]
= s ⊕ xk ⊕ yk
Nghĩa là
(*) t = s ⊕ xk ⊕ yk.
Kết quả này sẽ được hai bổ
đề dưới đây chứng minh là chiến lược
đúng theo quy nạp.
Bổ đề
1: Nếu s = 0 thì t
≠ 0 bất
luận nước là gì. (If s = 0, then t ≠ 0 no
matter what move is made.)
Chứng minh: Khi s = 0 và nếu không còn nước
đi, thì theo qui ước normal, đối
phương đương nhiên thua. Ngược lại, bất
kỳ động thái nào trong hàng k cũng sẽ cho t = xk ⊕ yk theo kết quả từ (*),
nghĩa là t ≠ 0 vì xk ≠ yk.
Bổ đề
2: Nếu s ≠
0, thì có thể đi sao cho t = 0. (If s ≠ 0, it is possible to make a move so that t
= 0.)
Chứng minh: Giả sử d là vị
trí của bit cực trái khác
0 (lớn nhất) theo biểu thị nhị phân của Nim-sum s, và thử
chọn hàng quân k sao cho bit ở vị thứ d của s trong hàng k (xk ) cũng khác 0. (Một hàng k như thế phải có vì nếu không trị nhị
phân lớn nhất của s
sẽ bằng 0.) Nếu đặt quân số còn lại
trong hàng k tức yk
bằng XOR của s (s ⊕ xk) với quân số của
hàng k của s nghĩa là yk = s ⊕ xk, chúng ta nói rằng yk < xk:
tất cả những bits
bên trái của bit d đều
giống nhau trong xk và yk nhưng bit d mất đi một trị bằng 2d và xuống còn 0); (và bất kỳ thay
đổi nào trong những bits
còn lại của Nim-sum cũng tối
đa bằng 2d−1.) Như thế ai
đi trước có thể lấy một số quân bằng
xk − yk trong hàng k, và:
t = s ⊕ xk
⊕ yk (theo (*))
= s ⊕ xk ⊕ (s ⊕ xk) [Associativity và s ⊕ s = 0]
= 0.
= 0.
Reference: http://en.wikipedia.org/wiki/Nim#Mathematical_theory
Ví dụ:
Hàng
|
Thập phân
|
Nhị phân
|
Ghi chú
|
A
|
3
|
0 1 1
|
s = Nim-Sum
ban đầu = 2 (0 1 0) ; d ở vị trí số 1 đỏ
trên A và Nim-sum s;
k là A;
xk
= 3 (0 1 1); yk = s ⊕ xk
= (0 1
0) ⊕ (0 1 1) = 1; quân lấy đi: 3-1=2
t = yk ⊕ B ⊕ C = (0 0 1) ⊕ (1 0 0) ⊕ (1 0 1) = 0
t = 0
|
B
|
4
|
1 0 0
|
C
|
5
|
1 0 1
|
Nim Sum
|
2
|
0 1 0
|