今さら森博嗣「笑わない数学者」のビリヤードの問題を解く(6)～答え合わせ編

# 0. はじめに

前回の記事までにビリヤードの問題は「ゴロム分度器」または「魔円陣」として古くから知られる数学の問題であることが分かった。今回，「魔円陣」を主題にした書籍（参考文献参照）を入手したので答え合わせを行いたい。

- [今さら森博嗣「笑わない数学者」のビリヤードの問題を解く(1)～導入編 - Qiita](https://qiita.com/TETSURO1999/items/fa1db203d48858c607f1)
- [今さら森博嗣「笑わない数学者」のビリヤードの問題を解く(2)～計算機を使う - Qiita](https://qiita.com/TETSURO1999/items/be4a8b460a690a48236b)
- [今さら森博嗣「笑わない数学者」のビリヤードの問題を解く(3)～計算量オーダーを考える - Qiita](https://qiita.com/TETSURO1999/items/bcd0cceb66a3b6d5964f)
- [今さら森博嗣「笑わない数学者」のビリヤードの問題を解く(4)～世界記録に挑む - Qiita](https://qiita.com/TETSURO1999/items/eefbec683a26cc221a57)
- [今さら森博嗣「笑わない数学者」のビリヤードの問題を解く(5)～未解決問題に挑む - Qiita](https://qiita.com/TETSURO1999/items/78345dadd089c6c90c76)

# 1. ボールの個数と解の個数の関係

参考文献の書籍にビリヤード問題の解の個数の公式がまんま書いてあった。

素数 $p$，自然数 $m$ として，ボールの個数 $n = 1 + p^m$ の場合の解の個数 $s$ は次のようになる。

```math
s = \frac{\phi\left( p^{2m} + p^m + 1 \right)}{6m} \tag{1}
```

ここで $\phi(x)$ はオイラーの φ 関数といい，$x$ 以下で $x$ と互いに素な自然数の個数を返す。

自然数 $x$ が素数 $p_1, p_2, p_3, \cdots , p_q$ のべき乗数の積として以下のように定義する。

```math
\begin{aligned}
x &= p_1^{k_1} \times p_2^{k_2} \times p_3^{k_3} \times \cdots \times p_q^{k_q} \\
&= \prod_{i = 1}^{q} p_i^{k_i}
\end{aligned} \tag{2}
```

このときオイラーの φ 関数 $\phi(x)$ は次のように定義される。

```math
\begin{aligned}
\phi(x) &= x \times \left( 1 - \frac{1}{p_1} \right) \times \left( 1 - \frac{1}{p_2} \right) \times \left( 1 - \frac{1}{p_3} \right) \times \cdots \times \left( 1 - \frac{1}{p_q} \right) \\
&= x \prod_{i = 1}^{q} \left( 1 - \frac{1}{p_i} \right)
\end{aligned} \tag{3}
```

とくに $x$ が素数の場合は $\phi(x) = x - 1$ となる。

ボールの個数 $n = 1 + p^m$ に対し，ボールの数値の総和 $\sigma = n(n - 1) + 1$ とおくと，式$(1)$は，

```math
s = \frac{\phi(n(n - 1) + 1)}{6m} = \frac{\phi(\sigma)}{6m} \tag{4}
```

とも書ける。これまでボールの個数 $n$ が増えると概ね解の個数 $s$ も増える傾向が見られたが，不規則に増減を繰り返してもいるようにも見えた。ボールの数値の総和 $\sigma$ が素数か否かによって解の個数が変化していたことが分かる。


オイラー φ 関数の JavaScript によるサンプルコードを以下に示す。

```javascript:オイラー φ 関数
function euler_totient(n) {
	var	r = n;
	for(var i = 2; i * i <= n; i++) {
		if(n % i != 0) continue;
		while(n % i == 0) n /= i;
		r -= r / i;
	}
	if(n > 1) r -= r / n;
	return r;
}
```

この公式を使ってボールの個数 129 個以下における解の個数を計算してみると，見事に自作プログラムで求めた結果と一致した。ついでにボールの個数 988 個の場合の解の個数も計算してみると 162,526 個である。コチラも十万個近くあると予想していたのでまあ正解である。

なお厳密に言うなら式 $(1)$ は「有限体の射影平面」を用いて得た場合の公式であるとのこと。おそらく，トリボナッチ数列を用いて完全差集合から求める手法も「有限体の射影平面」に基づいた手法と数学的に等価なのだろう。

<table>
<caption>表１　ボールの個数と解の個数の関係</caption>
<thead>
<tr><th style="text-align:center">ボールの個数 $n$</th>
    <th style="text-align:center">素数 $p$</th>
    <th style="text-align:center">指数 $m$</th>
    <th style="text-align:center">総和 $\sigma$</th>
    <th style="text-align:center">解の個数 $s$</th></tr>
</thead>
<tbody>
<tr><td style="text-align:right">3</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">1</td></tr>
<tr><td style="text-align:right">4</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">2</td></tr>
<tr><td style="text-align:right">5</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">3×7</td>
    <td style="text-align:right">1</td></tr>
<tr><td style="text-align:right">6</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">31</td>
    <td style="text-align:right">5</td></tr>
<tr><td style="text-align:right">8</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3×19</td>
    <td style="text-align:right">6</td></tr>
<tr><td style="text-align:right">9</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">73</td>
    <td style="text-align:right">4</td></tr>
<tr><td style="text-align:right">10</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">7×13</td>
    <td style="text-align:right">6</td></tr>
<tr><td style="text-align:right">12</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">7×19</td>
    <td style="text-align:right">18</td></tr>
<tr><td style="text-align:right">14</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3×61</td>
    <td style="text-align:right">20</td></tr>
<tr><td style="text-align:right">17</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">3×7×13</td>
    <td style="text-align:right">6</td></tr>
<tr><td style="text-align:right">18</td>
    <td style="text-align:right">17</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">307</td>
    <td style="text-align:right">51</td></tr>
<tr><td style="text-align:right">20</td>
    <td style="text-align:right">19</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3×127</td>
    <td style="text-align:right">42</td></tr>
<tr><td style="text-align:right">24</td>
    <td style="text-align:right">23</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">7×79</td>
    <td style="text-align:right">78</td></tr>
<tr><td style="text-align:right">26</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">3×7×31</td>
    <td style="text-align:right">30</td></tr>
<tr><td style="text-align:right">28</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">757</td>
    <td style="text-align:right">42</td></tr>
<tr><td style="text-align:right">30</td>
    <td style="text-align:right">29</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">13×67</td>
    <td style="text-align:right">132</td></tr>
<tr><td style="text-align:right">32</td>
    <td style="text-align:right">31</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3×331</td>
    <td style="text-align:right">110</td></tr>
<tr><td style="text-align:right">33</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">7×151</td>
    <td style="text-align:right">30</td></tr>
<tr><td style="text-align:right">38</td>
    <td style="text-align:right">37</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3×7×67</td>
    <td style="text-align:right">132</td></tr>
<tr><td style="text-align:right">42</td>
    <td style="text-align:right">41</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">1,723</td>
    <td style="text-align:right">287</td></tr>
<tr><td style="text-align:right">44</td>
    <td style="text-align:right">43</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3×631</td>
    <td style="text-align:right">210</td></tr>
<tr><td style="text-align:right">48</td>
    <td style="text-align:right">47</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">37×61</td>
    <td style="text-align:right">360</td></tr>
<tr><td style="text-align:right">50</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">3×19×43</td>
    <td style="text-align:right">126</td></tr>
<tr><td style="text-align:right">54</td>
    <td style="text-align:right">53</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">7×409</td>
    <td style="text-align:right">408</td></tr>
<tr><td style="text-align:right">60</td>
    <td style="text-align:right">59</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3,541</td>
    <td style="text-align:right">590</td></tr>
<tr><td style="text-align:right">62</td>
    <td style="text-align:right">61</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3×13×97</td>
    <td style="text-align:right">384</td></tr>
<tr><td style="text-align:right">65</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">3×19×73</td>
    <td style="text-align:right">72</td></tr>
<tr><td style="text-align:right">68</td>
    <td style="text-align:right">67</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3×7²×31</td>
    <td style="text-align:right">420</td></tr>
<tr><td style="text-align:right">72</td>
    <td style="text-align:right">71</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">5,113</td>
    <td style="text-align:right">852</td></tr>
<tr><td style="text-align:right">74</td>
    <td style="text-align:right">73</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3×1,801</td>
    <td style="text-align:right">600</td></tr>
<tr><td style="text-align:right">80</td>
    <td style="text-align:right">79</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3×7²×43</td>
    <td style="text-align:right">588</td></tr>
<tr><td style="text-align:right">82</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">7×13×73</td>
    <td style="text-align:right">216</td></tr>
<tr><td style="text-align:right">84</td>
    <td style="text-align:right">83</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">19×367</td>
    <td style="text-align:right">1,098</td></tr>
<tr><td style="text-align:right">90</td>
    <td style="text-align:right">89</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">8,011</td>
    <td style="text-align:right">1,335</td></tr>
<tr><td style="text-align:right">98</td>
    <td style="text-align:right">97</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3×3,169</td>
    <td style="text-align:right">1,056</td></tr>
<tr><td style="text-align:right">102</td>
    <td style="text-align:right">101</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">10,303</td>
    <td style="text-align:right">1,717</td></tr>
<tr><td style="text-align:right">104</td>
    <td style="text-align:right">103</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3×3,571</td>
    <td style="text-align:right">1,190</td></tr>
<tr><td style="text-align:right">108</td>
    <td style="text-align:right">107</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">7×13×127</td>
    <td style="text-align:right">1,512</td></tr>
<tr><td style="text-align:right">110</td>
    <td style="text-align:right">109</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3×7×571</td>
    <td style="text-align:right">1,140</td></tr>
<tr><td style="text-align:right">114</td>
    <td style="text-align:right">113</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">13×991</td>
    <td style="text-align:right">1,980</td></tr>
<tr><td style="text-align:right">122</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">3×7×19×37</td>
    <td style="text-align:right">648</td></tr>
<tr><td style="text-align:right">126</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">19×829</td>
    <td style="text-align:right">828</td></tr>
<tr><td style="text-align:right">128</td>
    <td style="text-align:right">127</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3×5,419</td>
    <td style="text-align:right">1,806</td></tr>
<tr><td style="text-align:right">129</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">7²×337</td>
    <td style="text-align:right">336</td></tr>
<tr><td style="text-align:right">988</td>
    <td style="text-align:right">987</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">975,157</td>
    <td style="text-align:right">162,526</td></tr>
</tbody>
</table>

:::note
ボールの数値の総和 $\sigma$ が素数の場合はそのまま，合成数の場合は素因数分解して示している。以前作成した素因数分解プログラムが役に立った。
:::

# 2. 他の解の導き方

これもまた参考文献の書籍に書いてある。一つでも解を導くことができれば，他の解も簡単に導ける。これは全パラメータを網羅して探索する場合に有効であろう。最初の解を発見出来たらプログラムを終了し，他の解は本章の手法を用いて探したほうが効率的である。全探索する場合，ボールの個数 $n$ に対して計算量は $O(10^n)$ だったり，良くても $O(n^5)$ だったりするが，本手法は $O(n^3)$ 程度で済むからだ。

ボールの個数 $n = 4$ のときの解の一つ $b_i = \lbrace 1, 2, 6, 4 \rbrace$ で具体例を示そう。ボールの数値の総和 $\sigma = n(n - 1) + 1 = 13$ である。

まず，ボールの配置 $b_i$ を完全差集合 $c_i$ に変換する。完全差集合 $c_i$ はボールの配置 $b_i$ の積算値であり，$c_i = \lbrace 0, 1, 3, 9, 13 \rbrace$ となる。

次に完全差集合の各要素 $c_i$ を $m$（$1 \le m < \sigma$）倍して $\sigma$ で割った剰余を求め，各要素を昇順にソートする。

<table>
<caption>表２　ボールの個数 $n = 4$ のとき：$(m \times c_i) \bmod \sigma$</caption>
<tr><th style="text-align:center">$m$</th>
    <th colspan=5 style="text-align:center">ソート前</th>
    <th rowspan=14>$\Longrightarrow$</th>
    <th style="text-align:center">$m$</th>
    <th colspan=5 style="text-align:center">ソート後</th></tr>
<tr></tr>
<tr><td style="text-align:right">1</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">13</td></tr>
<tr><td style="text-align:right">2</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">13</td></tr>
<tr><td style="text-align:right">3</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">13</td></tr>
<tr><td style="text-align:right">4</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">13</td></tr>
<tr><td style="text-align:right">5</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">13</td></tr>
<tr><td style="text-align:right">6</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">13</td></tr>
<tr><td style="text-align:right">7</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">13</td></tr>
<tr><td style="text-align:right">8</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">13</td></tr>
<tr><td style="text-align:right">9</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">13</td></tr>
<tr><td style="text-align:right">10</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">13</td></tr>
<tr><td style="text-align:right">11</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">13</td></tr>
<tr><td style="text-align:right">12</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">13</td></tr>
</table>

ソート後の各要素に対して差分を取り，ボール配置に戻してやる。回転対称形と左右対称形を除くようボール配置を正規化すると，別解 $b_i = \lbrace 1, 3, 2, 7 \rbrace$ が現れる。

<table>
<caption>表３　ボールの個数 $n = 4$ のとき：ボール配置</caption>
<tr><th style="text-align:center">$m$</th>
    <th colspan=4 style="text-align:center">正規化前</th>
    <th rowspan=14>$\Longrightarrow$</th>
    <th style="text-align:center">$m$</th>
    <th colspan=4 style="text-align:center">正規化後</th></tr>
<tr></tr>
<tr><td style="text-align:right">1</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">4</td></tr>
<tr><td style="text-align:right">2</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">7</td></tr>
<tr><td style="text-align:right">3</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">4</td></tr>
<tr><td style="text-align:right">4</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">4</td></tr>
<tr><td style="text-align:right">5</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">7</td></tr>
<tr><td style="text-align:right">6</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">7</td></tr>
<tr><td style="text-align:right">7</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">7</td></tr>
<tr><td style="text-align:right">8</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">7</td></tr>
<tr><td style="text-align:right">9</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">4</td></tr>
<tr><td style="text-align:right">10</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">4</td></tr>
<tr><td style="text-align:right">11</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">7</td></tr>
<tr><td style="text-align:right">12</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">4</td></tr>
</table>

このケースでは全ての $m$ に対して重複解を含めて正しい解が得られたが，一般的にはそうとは限らない。例えばボールの個数 $n = 5$ のときの唯一解 $b_i = \lbrace 1, 3, 10, 2, 5 \rbrace$ について同様に行ってみる。ボールの数値の総和 $\sigma = n(n - 1) + 1 = 21$ となる。

完全差集合 $c_i = \lbrace 0, 1, 4, 14, 16, 21 \rbrace$ に対して，各要素 $c_i$ を $m$（$1 \le m < \sigma$）倍して $\sigma$ で割った剰余を求め，各要素を昇順にソートする。

<table>
<caption>表４　ボールの個数 $n = 5$ のとき：$(m \times c_i) \bmod \sigma$</caption>
<tr><th style="text-align:center">$m$</th>
    <th colspan=6 style="text-align:center">ソート前</th>
    <th rowspan=22>$\Longrightarrow$</th>
    <th style="text-align:center">$m$</th>
    <th colspan=6 style="text-align:center">ソート後</th></tr>
<tr></tr>
<tr><td style="text-align:right">1</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">16</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">16</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">2</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">3</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">4</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">16</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">16</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">5</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">20</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">17</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">17</td>
    <td style="text-align:right">20</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">6</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">7</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">8</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">9</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">15</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">18</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">15</td>
    <td style="text-align:right">18</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">10</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">19</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">19</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">11</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">12</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">13</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">19</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">19</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">14</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">15</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">15</td>
    <td style="text-align:right">18</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">15</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">15</td>
    <td style="text-align:right">18</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">16</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">16</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">16</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">16</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">17</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">17</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">20</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">17</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">17</td>
    <td style="text-align:right">20</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">18</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">18</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">15</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">18</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">15</td>
    <td style="text-align:right">18</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">19</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">19</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">19</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">14</td>
    <td style="text-align:right">19</td>
    <td style="text-align:right">21</td></tr>
<tr><td style="text-align:right">20</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">20</td>
    <td style="text-align:right">17</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">21</td>
    <td style="text-align:right">20</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">17</td>
    <td style="text-align:right">20</td>
    <td style="text-align:right">21</td></tr>
</table>

ソート後の各要素に対して差分を取り，ボール配置に戻してやる。ただし，ボール配置を正規化するため１の玉を探そうとしても見つからないNGケースが８個ある。NGにならない，すなわち重複解も含めて解が得られるケースは１２個あるが，おそらくこれは $\phi(21) = 12$ だからだと考えられる。ちなみに先のケースも $\phi(13) = 12$ だったので全てのケースで解が得られたのだろう。

<table>
<caption>表５　ボールの個数 $n = 5$ のとき：ボール配置</caption>
<tr><th style="text-align:center">$m$</th>
    <th colspan=5 style="text-align:center">正規化前</th>
    <th rowspan=22>$\Longrightarrow$</th>
    <th style="text-align:center">$m$</th>
    <th colspan=5 style="text-align:center">正規化後</th>
<tr></tr>
<tr><td style="text-align:right">1</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td></tr>
<tr><td style="text-align:right">2</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td></tr>
<tr><td style="text-align:right">3</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">3</td>
    <td colspan=5 style="text-align:center">NG</td></tr>
<tr><td style="text-align:right">4</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td></tr>
<tr><td style="text-align:right">5</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td></tr>
<tr><td style="text-align:right">6</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">6</td>
    <td colspan=5 style="text-align:center">NG</td></tr>
<tr><td style="text-align:right">7</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">7</td>
    <td colspan=5 style="text-align:center">NG</td></tr>
<tr><td style="text-align:right">8</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td></tr>
<tr><td style="text-align:right">9</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">9</td>
    <td colspan=5 style="text-align:center">NG</td></tr>
<tr><td style="text-align:right">10</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td></tr>
<tr><td style="text-align:right">11</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td></tr>
<tr><td style="text-align:right">12</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">12</td>
    <td colspan=5 style="text-align:center">NG</td></tr>
<tr><td style="text-align:right">13</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">13</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td></tr>
<tr><td style="text-align:right">14</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">14</td>
    <td colspan=5 style="text-align:center">NG</td></tr>
<tr><td style="text-align:right">15</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">15</td>
    <td colspan=5 style="text-align:center">NG</td></tr>
<tr><td style="text-align:right">16</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">16</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td></tr>
<tr><td style="text-align:right">17</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">17</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td></tr>
<tr><td style="text-align:right">18</td>
    <td style="text-align:right">0</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">18</td>
    <td colspan=5 style="text-align:center">NG</td></tr>
<tr><td style="text-align:right">19</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">19</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td></tr>
<tr><td style="text-align:right">20</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">20</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">5</td></tr>
</table>

どんな $m$ をかけても解が得られるという訳ではないことが分かったと思う。正しくは「有限体の生成元」をかければ良いらしいが，その値を求めるよりも「$m = 2, 3, 4, 5, \cdots $ と順に試したほうが案外早く見つかる」と参考文献にも書いてある。

:::note
ボールの数値の総和 $\sigma$ が素数の場合，すべての $m$ が生成元になり得るが，合成数の場合，約数とその倍数は生成元になり得ないような感じである。たとえば $\sigma = 21$ のとき，$m$ が３の倍数と７の倍数のときは解を得られていない。
:::

実装コードを以下に示す。今回も JavaScript（WSH）で組んでみた。

```javascript:AnotherSolver.JS
var	args = WScript.Arguments.Unnamed;
var	ret = main(args)
try {
	WScript.Quit(ret);
} catch(e) {
	/* 何もしない */
}
//------------------------------------------------------------------------------
// メイン関数
//------------------------------------------------------------------------------
function main(args) {
	//--------------------------------------------------------------------------
	// ヘルプメッセージ
	//--------------------------------------------------------------------------
	if(args.Count == 0) {
		WScript.Echo("Usage: AnotherSolver(.js) (option) [ball-position] ...");
		return false;
	}
	//--------------------------------------------------------------------------
	// コマンドライン解析
	//--------------------------------------------------------------------------
	var	ball = [];
	for(var i = 0; i < args.Count; i++) {
		var	n = parseInt(args(i));
		ball.push(n);
	}
	//--------------------------------------------------------------------------
	// ボール配置のチェック
	//--------------------------------------------------------------------------
	if(!check(ball)) {
		WScript.Echo("ボール配置が不正です!!");
		return false;
	}
	//--------------------------------------------------------------------------
	// ボール配置を完全差集合に変換する
	//--------------------------------------------------------------------------
	var	pcds = [];
	for(var i = 0, n = 0; i < ball.length; i++) {
		pcds.push(n);
		n += ball[i];
	}
	var	ball_sum = n;
	//--------------------------------------------------------------------------
	// 別解を探す
	//--------------------------------------------------------------------------
	var	d = [];
	for(var m = 1; m < ball_sum; m++) {
		//----------------------------------------------------------------------
		// 差集合を生成
		//----------------------------------------------------------------------
		var	s = [];
		for(var i = 0; i < pcds.length; i++) {
			var	n = pcds[i] * m % ball_sum; 
			s.push(n);
		}
		s.push(ball_sum);
		s.sort(function(a, b) {
			return a - b;
		});
		//----------------------------------------------------------------------
		// ボール配置に変換
		//----------------------------------------------------------------------
		var	t = [];
		for(var i = 1; i < s.length; i++)
			t.push(s[i] - s[i - 1]);
		//----------------------------------------------------------------------
		// 回転対称形を除く（１のボールを頭出し）
		//----------------------------------------------------------------------
		for(var i = 0; i < t.length; i++)
			if(t[i] == 1) break;
		if(i >= t.length) continue;
		var	u = [];
		for(var j = i, k = 0; k < t.length; k++) {
			u.push(t[j]);
			if(++j >= t.length) j = 0;
		}
		//----------------------------------------------------------------------
		// 左右対称形を除く
		//----------------------------------------------------------------------
		u.push(1);
		if(u[1] > u[u.length -2]) u.reverse();
		u.pop();
		//----------------------------------------------------------------------
		// ボール配置のチェック＆重複するボール配置を除く
		//----------------------------------------------------------------------
		if(check(u)) {
			var	v = u.join(" ");
			if(d[v] == null) d[v] = m;
		}
	}
	//--------------------------------------------------------------------------
	// ボール配置をソートして出力する
	//--------------------------------------------------------------------------
	var	e = [];
	for(var v in d)
		e.push({ key:d[v], val:v, arr:v.split(" ") });
	e.sort(function(a, b) {
		for(var i = 0; i < a.arr.length; i++)
			if(a.arr[i] != b.arr[i]) return a.arr[i] - b.arr[i];
		return 0;
	});
	for(var i = 0; i < e.length; i++)
		WScript.Echo([e[i].key, e[i].val].join("\t"));
	//--------------------------------------------------------------------------
	// 解の個数を出力する
	//--------------------------------------------------------------------------
	WScript.Echo(e.length);
	return true;
}
//------------------------------------------------------------------------------
// ボール配置のチェック
//------------------------------------------------------------------------------
function check(ball) {
	var	num = ball.length;
	var	sum = num * (num -  1) + 1;
	for(var i = 0, s = 0; i < ball.length; i++)
		s += ball[i];
	if(sum != s) return false;
	var	flag = [];
	for(var i = 0; i <= sum; i++)
		flag.push(false);
	for(var i = 0; i < ball.length - 1; i++) {
		for(var j = 0, s = 0; i + j >= 0; j--) {
			s += ball[i + j];
			if(flag[s] || flag[sum - s]) return false;
			flag[s] = true;
			flag[sum - s] = true;
		}
	}
	return true;
}
```

実行例を以下に示す。ボールの個数 $n = 17$ のときの解の一つを与えると，その解を含めたすべての解を求めることができる。各行一つ目の数値は倍数の $m$ であり，続く数列がボールの配置である。最後の行の 6 は解の個数である。

```:実行例
anothersolver 1 2 4 8 16 32 27 26 11 9 45 13 10 29 5 17 18
1       1 2 4 8 16 32 27 26 11 9 45 13 10 29 5 17 18
23      1 3 12 10 31 7 27 2 6 5 19 20 62 14 9 28 17
29      1 7 3 15 33 5 24 68 2 14 6 17 4 9 19 12 34
19      1 7 12 44 25 41 9 17 4 6 22 33 13 2 3 11 23
5       1 7 31 2 11 3 9 36 17 4 22 6 18 72 5 10 19
11      1 21 11 50 39 13 6 4 14 16 25 26 3 2 7 8 27
6
```

:::note alert
上記のスクリプトはボールの個数 100 個前後であれば問題ないが，1000 個くらいになると内部メモリがオーバーフローして異常終了してしまうので注意されたい。
:::

# 3. まとめ

最後に残された謎について書こうと思ったのだが，本記事は長くなり過ぎたので次回にする。

https://qiita.com/TETSURO1999/items/f6d0839aec49692a03e0

# 4. 参考文献

魔円陣を主題にした書籍は少ないので貴重である。

https://gihyo.jp/book/2018/978-4-7741-9748-7

オイラーの φ 関数の定義と解説はコチラ

https://ja.wikipedia.org/wiki/%E3%82%AA%E3%82%A4%E3%83%A9%E3%83%BC%E3%81%AE%CF%86%E9%96%A2%E6%95%B0