マガジン

チェスの「手の数」はなぜ宇宙の原子より多いと言われるのか

遊びを見つける

執筆にClaudeを使用しています。

二つのチェス盤のキングを、赤い光と白い光で対比した終局のイメージ
記事のテーマをもとに制作したAI生成イラスト。

「チェスの手の数は、宇宙の原子の数より多い」という言い方をよく見かけます。最初に押さえておきたいのは、この「手の数」が盤面の種類ではなく、始めから終わりまでの対局の流れ(手順)の総数を指していることです。数字としては10の120乗がよく挙がります。観測できる宇宙の原子は10の80乗前後と言われるので、桁にして40桁違います。 10の120乗の出どころは、情報理論の創始者として知られるクロード・シャノンが1950年に発表した、チェスをコンピューターに指させる方法についての論文です。そこで示されたのは、細かく数え上げた結果ではなく、掛け算による見積もりでした。この記事では、その見積もりを分解し、比喩がどこまで正しいかを確かめます。さらに、読者が自分の手で確かめられる方法も示します。

この記事の目次
  1. 数えているのは「局面」ではなく「手順」
  2. 10の120乗はどう組み立てられるか
  3. 原子との比較は何を伝え、何を伝えないか
  4. 小さなゲームで「手順の爆発」を確かめる
  5. 「灯りのチェス」で一手あたりの選択肢を数える
  6. 設計から読み取れること
  7. 次の行動
  8. 参考資料

数えているのは「局面」ではなく「手順」

チェスの数を語るときは、次の二つを区別する必要があります。

  • 局面の数:駒がどこに並んでいるかという、盤面の種類の数です。一般には10の44乗から47乗程度と見積もられています。
  • 手順の数:最初の並びから終局までの、指し手の列の数です。10の120乗という数字はこちらです。

手順のほうが圧倒的に多いのは、同じ局面に別の順番でたどり着けるからです。たとえばナイトを動かしてからポーンを進めても、ポーンを進めてからナイトを動かしても、同じ並びになります。局面は一つでも、手順は二つ数えられます。手順の数はこうした経路の重なりをすべて別々に数えるので、局面の数よりずっと大きくなります。

10の44乗の局面でも、桁としてはすでに途方もない数です。ただ、宇宙の原子との比較に使われるのは、10の120乗という手順の数のほうです。

10の120乗はどう組み立てられるか

見積もりの考え方は単純です。一つの局面で指せる手の数(合法手の数)の平均を、対局の長さの分だけ掛け合わせます。

チェスでは、白と黒が一手ずつ指した組を「1手」、片方だけの一手を「半手」と数えます。シャノンの見積もりは、おおまかに次の前提に立っています。

  1. 一つの局面での合法手は平均で30前後です。
  2. 1手(白黒の2半手)で選択肢は約30×30=900通りで、これを約10の3乗とみなします。
  3. 一局を約40手(80半手)とみなします。

すると、10の3乗を40回掛けて10の120乗になります。論文の趣旨は、全部を調べ尽くすのは不可能だと示すことにありました。ですから、この数字は厳密な総数ではなく、桁を知るための目安として読むのが正確です。

前提を少し動かすと、結果はこう変わります。半手80回で計算した値です。

  • 20通り、80半手後の手順数の目安:10の104乗ほど
  • 30通り、80半手後の手順数の目安:10の118乗ほど
  • 35通り、80半手後の手順数の目安:10の123.5乗ほど
  • 40通り、80半手後の手順数の目安:10の128乗ほど

平均を20に下げても、10の104乗です。10の80乗を大きく超えます。長さを縮めても同じです。30通りの場合、10の80乗を超えるのに必要なのは約54半手で、1手で言えば27手ほどです。つまり、手順の数が宇宙の原子の数を上回るという結論は、前提を多少変えても揺らぎません。

原子との比較は何を伝え、何を伝えないか

観測可能な宇宙の原子の数は、10の78乗から82乗あたりと推定されており、10の80乗が目安としてよく使われます。この推定そのものに幅があるので、比較は「桁が違う」という感覚をつかむためのものです。

仮定を置いた計算をしてみます。1秒に10億局を数えられる機械を、宇宙の年齢(約138億年、約4×10の17乗秒)の間ずっと動かしたとします。数えられるのはせいぜい10の27乗局ほどで、10の120乗にはまだ93桁足りません。全手順を調べる方法は、原理的にも成り立たないことになります。

一方で、この比較から読み取ってはいけないこともあります。

  • 「チェスには10の120乗通りの面白い対局がある」とは言えません。大半は意味のない手の連なりです。
  • 「人間やコンピューターは10の120乗を調べている」わけでもありません。強い指し手は、有望でない枝を早く捨てることで成り立っています。
  • 10の120乗は目安であり、正確な総数ではありません。

小さなゲームで「手順の爆発」を確かめる

仕組みを体感するには、小さなゲームで手順を全部数えるのが近道です。三目並べは、手順と局面の差が小さな規模で見えます。次のコードは単独で動く最小構成です。HTMLファイルとして保存し、ブラウザで開くだけです。

html
<script>
const lines=[[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]];
function winner(b){
  for(const [a,c,d] of lines){
    if(b[a]&&b[a]===b[c]&&b[a]===b[d]) return b[a];
  }
  return null;
}
let games=0;
const seen=new Set();
function walk(b,turn){
  seen.add(b.join(''));
  if(winner(b)||b.every(x=>x)){games++;return;}
  for(let i=0;i<9;i++){
    if(!b[i]){
      b[i]=turn;
      walk(b,turn==='X'?'O':'X');
      b[i]=0;
    }
  }
}
walk(Array(9).fill(0),'X');
let out='手順(ゲーム)の数 '+games+' / 局面の数 '+seen.size;
for(const n of [20,30,35,40]){
  out+='\n'+n+'通り×80半手 → 10の'+(80*Math.log10(n)).toFixed(1)+'乗';
}
document.body.innerHTML='<pre>'+out+'</pre>';
</script>

三目並べについて一般に知られている値は、手順が255,168通り、到達できる局面が5,478です(空の盤面を含みます)。表示された数がこれと合うかを確かめてください。合っていれば、コードが正しく手順と局面を区別して数えられています。局面は数千なのに、手順は25万を超えています。この比率が、チェスでは10の44乗に対して10の120乗という開きに膨らみます。

下半分は、前の節の表を自分で再計算するための部分です。数字を書き換えて、平均や長さに対する結果の動きを見てください。

「灯りのチェス」で一手あたりの選択肢を数える

見積もりの核は「平均で何通りから選べるか」です。ここは自分の対局で調べられます。「灯りのチェス」には、駒の動き方ガイド、全棋譜の表示、同じ画面でのふたり対局があります。ガイドの表示の細かい仕様は、作品を開いて確かめてください。

問い

自分が実際に指す対局では、各手番で合法手が平均何通りあるでしょうか。それを使うと、手順の数の目安はどう変わるでしょうか。

準備

  • 灯りのチェス(ひとり対局でもふたり対局でも構いません)
  • 記録用の紙か表計算ソフト

手順

  1. 開始局面で、白の合法手を数えます。ポーン16通りとナイト4通りで、合計20通りになるはずです。この確認で、数え方の感覚をそろえます。
  2. 対局を進め、自分の手番ごとに「合法手の総数」を記録します。全部を毎回数えるのが大変なら、5手番ごとなど間隔を決めて数えてもかまいません。
  3. 同じ対局の最後に、全棋譜から半手の総数を読み取って記録します。
  4. 3局以上、できれば相手の強さや序盤の進め方を変えて繰り返します。

記録の単位

1行に「局の番号、半手の番号、合法手の数」を記録します。最後に、局ごとの総半手数も書き添えます。

結果の読み方

  • 平均がどの値でも、「平均の合法手数 × 80回」の10の何乗かを前の表と見比べてください。20通りなら10の104乗、40通りなら10の128乗ほどです。
  • 自分の局の長さで計算し直すと、実際の対局の短さや長さが桁にどう響くかが分かります。長さが半分になれば、指数も半分です。

起こりやすい誤り

  • 序盤だけを数えると、合法手が少なめに出ます。中盤の数も入れてください。
  • 見かけの動きと合法手を混同しがちです。王手を受けているときや、駒が王を守る位置で動けないときは、動ける手が減ります。
  • ポーンの昇格は、選ぶ駒ごとに別の手です。昇格の選択肢をまとめて1通りと数えないようにしてください。
  • 数えた手は、あくまで自分の対局に偏った標本です。結論は「自分の対局ではこうだった」にとどめてください。

設計から読み取れること

「灯りのチェス」の確認済みの仕様から言えることを整理します。

  • 判定エンジンとしてchess.jsを同梱し、キャスリング、アンパッサン、選択式の昇格、標準の終局判定に対応しています。これらは合法手の数え方に関わる規則で、昇格を選ぶ手が選択肢として分かれる設計は、先ほど挙げた数え方の注意と重なります。
  • CPUの思考時間は約450msに制限されています。10の120乗の手順を調べ尽くせない以上、短い時間で選ぶには、すべてを見ずに範囲を絞るしかないと読み取れます。どのように絞っているかは確認済みの範囲外なので、作品を開いて、強さを変えたときの応手の違いから確かめてください。
  • 取った駒の表示と全棋譜の表示があるため、半手の総数や、駒が減るにつれて選択肢がどう変わるかを、自分の対局から読み取れます。

次の行動

まず上のコードを動かして、三目並べの手順と局面の差を確かめてください。次に「灯りのチェス」で3局指し、各手番の合法手の数を記録して、自分の平均から手順数の目安を計算し直してみてください。

参考資料

  • Claude E. Shannon, "Programming a Computer for Playing Chess"(1950年の論文)
  • chess.js 公式ドキュメント