『今週の問題』第108回 解答


【コメント】

この問題は奇数は全て先手必勝。
Y.M.Ojisanさんからのご指摘により,偶数での後手勝ちは
4,8,14,20,24,28,34,38,42,54,58,62・・・?
ではないかと思われますが,いまだ未解決です。
継続して解答を募集します。


◆東京都 ぱずきち さんからの解答(NEW!!)

必勝法はもうすこし時間がかかりそうなので,任意のパターンに対する判定法まで にしました。

 この問題は以前TV番組のなかで出てきたので考えたことがあります。
ある程度プログラムによる力まかせの方法を用いましたが,その結果をもとに考察した結果,非常に興味深い知見が得られました。
そして,ある数(現在204)以下の数の組み合わせからなる任意の状態に対して,比較的容易に先手必勝か後手必勝かを判定できる方法を見つけましたので,紹介いたします。

もう少し考察すれば,必勝法も得られるかもしれません。

1.準備

定義1. 状態(パターン)の表しかた

直線上に碁石を置いて行くと,碁石がおける領域が分断されていきます。
こうして碁石を置いていった途中の状態は,残った連続領域(個数R)の長さ
1,n2,...nrにより決まるパターンで表すことができます。

よって状態Aまたはそのパターンを
A={n1,n2,...nr}で表します。

 状態Aの性質はn1,n2,...nrの順序に依りませんので
{n1,n2,...nr}は集合に近いのですが,同じ値の要素を持つことができる点が異なります。

 また,パターンAが2つの部分パターンB,Cに分けることができる場合,すなわち
B={nb1,nb2,...nbr},
C={nc1,nc2,...ncs},
A={nb1,nb2,...nbr,nc1,nc2,...ncs}の時,
A=B+Cで表します。

 この定義からパターンの要素n1〜nrは本来自然数であるべきで,置く場所がない状態は空集合に相当する{ }で表されるべきです。

 しかし,要素として0や−1を許し,その領域には碁石を置けないとすると後の記述が簡単化されるので,形式的にそうします。

 そうすると,1つの状態に対応するパターンが一意に定まらなくなりますが,余り問題にはなりません。

定義2. 判定関数

パターンAが先手必勝か後手必勝かを表す関数f(A)を次のように定義します。

 f(A)=0           (Aが後手必勝の時)
 f(A)=1           (Aが先手必勝の時) 
 f({ })=f({0})=f({−1})=0 (便宜上)
命題1. 判定関数の性質1
(1.1) f(A+A)=0            (まね碁)
(1.2) f(A)=0ならばf(A+B)=f(B)
              (後手必勝のパターンは除去可能)
(1.3) f(A+B)=0,f(B+C)=0ならば,
      f(A+C)=0            (推移律)
(1.4) f({2n+1})=1
証明(説明)

(1.1)後手は先手のまねをする事で必ず勝つことができるので。

(1.2)
もし,f(B)=0ならば,もし先手が部分Aに置いたら後手はAの後手必勝手順を,先手が部分Bに置いたら後手はBの後手必勝手順を進めることで,必ず後手が勝つことができる。

もし,f(B)=1ならば,先手はBの先手必勝手順の1手目に置くことで
f(A)=0,f(B’)=0として,後手に手番を渡すことができるので先手必勝である。

以上よりf(A)=0ならばf(A+B)=f(B)が成立する。

(1.3)f(A+C)=f(A+C+A+B)=f(C+B)=0

(1.4)中央に置けば残るのは{n−1,n−1}であるから。

定義3,状態の同値関係

(1.1)(1.3)よりf(A+B)=0は同値関係を定めます。

よってf(A+B)=0ならば,AとBは判定関数fのもとで同値であると言い,
A≡B(f),または単にA≡Bで表します。

定義4,整数の同値関係

 A={na},B={nb}とすると
f({na,nb})=0ならば,{na}≡{nb}である。

このとき整数naとnbは判定関数fのもとで同値であると言い,
a≡nb(f),または単にna≡nbで表します。

定義5,同値類の値

定義4の同値関係により,0以上の整数を同値類に分類することができます。
(ここでは−1は除外して置きます)

そして,同値類をそれに含まれる最小の要素の値で表します。
nが含まれる同値類の値(則ち最小の要素の値)をg(n)で表します。
当然の事ながらn≡g(n)が成立します。

また,
A={n1,n2,...nr},
B={g(n1),g(n2),...g(nr)}
のとき,B=g(A)と表します。

命題2,判定関数の性質2

(2.1) A≡Bならばf(A)=f(B)
(2.2) f(A)=f(g(A))

証明

(2.1) f(A)=f(A+A+B)=f(B)

(2.2) 
 f(A+g(A))
=f({n1,g(n1),n2,g(n2),...g(nr)}
=f({n2,g(n2),...g(nr)}
=0

よりA≡g(A)が成り立つ。
よってf(A)=f(g(A))。

以上でやや面倒な準備が終わりました。

2.判定関数fの求め方(シラミ潰し)

 これまでの議論より判定関数fに対する幾つかの性質が明らかにされましたが,これだけでfの実際の値が求められるわけではありません。
しかし,これらの性質を用いることで判定を大幅に簡単化することができます。

fの実際の値を求める基本となるのは次の事実です。

 もし,先手がある場所に碁石を置いたとき,残ったパターンA’が後手必勝となるような手が存在するとき,もとのパターンAは先手必勝である。
そのような手が存在しないときは後手必勝である。

これは,漸化式

f(A)=1−Π
すべてのA’
f(A’)で表すことができます。

 Aのi番目の連続領域のjの位置に碁石を置いた時のA’は
Aの要素niを2つの要素(ni-j-1)と(j−2)で置き換えることにより得られます。

 したがって,漸化式は次のように表すことができます。

f(A)=1−Π
1≦i≦r,1≦j≦[(ni+1)/2]
f(A+{ni,ni-j-1,j−2})

ただし,[ ]はガウスの記号(整数部分)です。

 これと命題1を用い,初期値として
f({ })=f({0})=f({−1})=0,
を使えば,機械的にf(A)を求めることができます。

 さらに命題2を用いて

f(A)=1−Π
1≦i≦r,1≦j≦[(ni+1)/2]
f(g(A+{ni})+g({ni-j-1,j−2}))

とすれば計算を大幅に減らすことができます。

 このためには,Aの最大の要素以下整数についてg(n)を知って置く必要がありますが,
これにはf(n,m)が必要です。
そのまま適用すると無限再帰に陥りますので,
g(n)を求める時だけは一時的にg(n)=nとして漸化式を用います。

3.結果(シラミ潰し)

 2.の方法により204以下の整数に対して調べたところ,9つの同値類に分類されることが判りました。
その結果を以下に示します。
最初の同値類0の要素がゲームが後手必勝となる碁盤の長さです。

{0, 4, 8, 14, 20, 24, 28, 34, 38, 42, 54, 58, 62, 72, 76, 88, 92, 96, 106, 110, 122, 126, 130, 140, 144, 156, 160, 164, 174, 178, 190, 194, 198},

{1, 2, 6, 7, 21, 22, 26, 27, 35, 36, 40, 41, 55, 56, 60, 61, 69, 70, 74, 75,89, 90, 94, 95, 103, 104, 108, 109, 123, 124, 128, 129, 137, 138, 142, 143, 157, 158, 162, 163, 171, 172, 176, 177, 191, 192, 196, 197},

{3, 11, 12, 16, 17, 25, 31, 37, 45, 46, 51, 59, 71, 79, 80, 93, 105, 113, 114,127, 139, 147, 148, 161, 173, 181, 182, 195},

{5, 9, 10, 18, 19, 23, 39, 43, 44, 52, 53, 57, 65, 73, 77, 78, 86, 87, 91, 99,107, 111, 112, 120, 121, 125, 133, 141, 145, 146, 154, 155, 159, 167, 175, 179, 180, 188, 189, 193, 201},

{13, 29, 33, 47, 48, 63, 67, 81, 82, 97, 101, 115, 116, 131, 135, 149, 150, 165, 169, 183, 184, 199, 203},

{15, 30, 49, 50, 64, 83, 84, 98, 117, 118, 132, 151, 152, 166, 185, 186, 200},

{32, 66, 100, 134, 168, 202},

{68, 102, 136, 170, 204}, 

{85, 119, 153, 187}
 これをみるとg(n)はほぼ周期34の周期関数となっていることが判ります。
ほぼと言ったのは次の5カ所で
g(n)!=g(n−34)となっているからです。
 g(48)=13!= g(14)=0
 g(50)=15!= g(16)=3
 g(65)= 5!= g(31)=3
 g(68)=68!= g(34)=0
 g(85)=85!= g(51)=3
 それ以降は周期的に見えますが,ずっと続くかどうかは良く判りません。
なんだか,ちょっと気持ちわるいですね。
プログラムのミスではないと思っているのですが??。

4.同値類を用いた判定法

 同値類が上記9つのみであると仮定すると
(または10番目の同値類があらわれるnより小さな数のみで構成されるパターンに対して),
パターンが先手必勝か後手必勝かは次のように判定できます。

 命題2からパターンの中の整数nをg(n)で置き換えてもfの値は変わりません。
また,命題1よりこうして得られたパターンから0および同じ値の2つの要素を除去して考えることができます。
このことを用いてパターンを簡単化すると,その結果は
{1, 3, 5, 13, 15, 32, 68, 85}の部分集合として表されます。

 したがって,有限個(28)のパターンについて
f(A)が求められればよいことになります。
そして,力ずくで調べなくても以下のように判定できます。
(Aは既に上記の方法で簡略化されているものとします。)

Aの要素の数が0の場合は,f({ })=0 です。

Aの要素の数が1つの場合は,f(A)=1 です。
 (同値類0のみが後手必勝)

Aの要素の数が2つの場合も,f(A)=1 です。
 (同値関係の定義より)

Aの要素の数が3つの場合で,f(A)=0となるのは

{1,3,5},{1,13,15},{1,68,85},{3,15,32},{5,13,32}
の5通りだけです。
(これはシラミつぶしで調べました)。

 Aの要素の数が4以上の場合は,必ず

{1,3,5},{1,13,15},{1,68,85},{3,15,32},{5,13,32} 
のいずれかのパターンの2つの要素を含みます。

したがって

f({n1,n2,n3})=0ならば,
 f({n1,n2}+B)=f({n3}+B)

により要素の数が1つ少ない場合に変換できます。

これらを用いれば,要素の数がいくつであってもf(A)を求めることができます。

 この簡単化を逆に用いることにより要素数3つの後手必勝パターンから要素数4以上の後手必勝パターンを順次生成することができます。
その結果は以下のようになりました。

要素数4つの後手必勝パターンは

{1, 3, 13, 32},
{1, 5, 15, 32},
{3, 5, 13, 15},
{3, 5, 68, 85},
{13, 15, 68, 85}
の5通りだけです。

要素数5つの後手必勝パターンは

{3, 13, 32, 68, 85},
{5, 15, 32, 68, 85}
の2通りだけです。

要素数6つの後手必勝パターンは

{1, 3, 15, 32, 68, 85},
{1, 5, 13, 32, 68, 85}
の2通りだけです。

要素数7つの後手必勝パターンは

{1, 3, 5, 13, 15, 68, 85}
の1通りだけです。

要素数が8つ(則ち全部)の場合は先手必勝です。

したがって,空集合を除くと15パターンのみが後手必勝です。

 したがって,まず,Aに対してg(A)を求め,
g(A)のなかの0と同じ値の数の組を除いた結果が空集合か上記15パターンであれば後手必勝,
さもなければ先手必勝です。

 以上よりg(n)と15パターンを憶えておけば,計算や試行錯誤なしに任意のパターンが先手必勝か後手必勝かを判定できることが判りました。
 なお,g(n)には前述のようにほぼ周期的ですので,すべてを覚えておく必要はありません。


◆石川県 MJ さんからの解答

【問題1】

後手有利

先手1→後手3→終了
先手2→後手4→終了

【問題2】

先手有利

始めに先手が3を取ればよい
先手3→後手1→先手5→終了
先手3→後手5→先手1→終了

【問題3】

先手有利

始めに先手が1を取ればよい(6でもよい)
先手1→後手3→先手5→終了
先手1→後手4→先手6→終了
先手1→後手5→先手3→終了
先手1→後手6→先手3→終了

【問題4】

先手有利

始めに先手が2を取ればよい
先手2→後手4→先手6→終了
先手2→後手5→先手7→終了
先手2→後手6→先手4→終了
先手2→後手7→先手4→終了

【問題5】

後手有利

1→3→5or6→8→終了
   →7or8→5→終了

2→6→4→8→終了
   →8→4→終了

3→7→1→5→終了
   →5→1→終了

4→6→1or2→8→終了
   →8→1→終了
【問題6】

先手有利

始めに先手が5を取ればよい

5→1→7→3→9→終了
     →9→3→終了

5→2→8→終了

5→3→7→1→9→終了
     →9→1→終了
【問題7】

先手有利

始めに先手が1を取ればよい

1→3→5→7→9→終了
     →9→7→終了
     →8→10→終了
     →10→8→終了

1→4→8→6→10→終了
     →10→6→終了

1→5→9→3→7→終了
     →7→3→終了

1→6→8→3or4→10→終了
     →10→3→終了

1→7→3→5→9→終了
     →9or10→5→終了

1→8→4→6→10→終了
     →10→6→終了                

1→9→5→3→7→終了
     →7→3→終了

1→10→5→3→7→終了
      →7or8→3→終了

◆愛知県 Y.M.Ojisan さんからの解答

【問題1〜8】

N 1:先手必勝
0:後手必勝
必勝法初手
3 1 中央
4 0  
5 1 中央
6 1 端から2番目
7 1 中央
8 0  
9 1 中央
10 1 端から2番目
11 1 中央
12 1 端から4番目
13 1 中央
14 0  
15 1 中央
16 1 端から2番目
17 1 中央
18 1 端から5番目
19 1 中央
20 0  

【おまけ1】

奇数の場合は中央をとり,真似碁をすると先手必勝。

【おまけ2】

解答ではありません。

2手目ないし山が1〜2個から始めた場合の勝ち負けを下図に示します。
凡例は図中にあります。
緑のセルが初期のそれぞれの山の石の数です。
なおこれは 単に計算機によりしらみつぶしした結果です。

(4,4)および(14,14)を中心にした対称性がみられます。
なぜそうなるか分かりませんが,これを手がかりに簡単な必勝法がみつけられるかも。

14〜28領域のマゼンタの部分は現状のアルゴリズム+PCでは時間がかかりすぎて確認できない領域ですが,これがまた対称性から予測される後手必勝部と一致しており,後手有利と予測されます。

なお,(31,31)が更なる対称性の中心である兆候があります。


勝敗判定のプログラムに,簡単な経験則を入れ込んだら,
N=64まで簡単に判定がつく(500MHz)ようになり,
N=4,14,31中心の対称性の予測も確認できました。

判定ソフトは腕力計算アルゴなので,核の部分は非常にシンプルです。
バグなしの確認の意味もあって,それに表示等を追加して,対戦ソフトにしました。
64bit整数はANSI規格では無いので,{32以下 2山}の初期値ではじめるものを,送付いたします。
なお,C++ による Console /  DOS window用です。


 ◆ 問題へもどる

 ◆ 今週の問題

数学の部屋へもどる