5
未解決問題議論
文献あり

「くどー問題」再び

374
2
$$\newcommand{all}[1]{\left\langle#1\right\rangle} \newcommand{blr}[1]{\left[#1\right]} \newcommand{car}[1]{\left\{#1\right\}} \newcommand{di}[0]{\displaystyle} \newcommand{fr}[2]{\frac{#1}{#2}} \newcommand{lr}[1]{\left(#1\right)} \newcommand{ma}[1]{\(\di{#1}\)} \newcommand{slashed}[1]{\centernot{#1}} \newcommand{test}[0]{\oalign{{X}\crcr{Y}}} \newcommand{thline}[0]{\noalign{\hrule height 0.1pt}} $$

くどー問題とその数値計算

Mathlogでくどーさんがとある数学の問題を記事にされています:

そろそろ誰かに解いてほしい自作問題(未解決)

私はこれを「くどー問題」と呼んでいます。問題の内容は上記記事を見ていただくのがよいと思いますが、一応引用させていただきます:

$1$から$n(\ge 3)$までの整数が書かれたカードが1枚ずつある。この時、以下の条件を満たしながらカードを$1$枚ずつ取り除いていくことを考える。
${}$
$\hspace{0.5cm}\underline{\mathrm{条件}}$

  1. どの時点においても「カードに書かれた数の$3$乗和」が「カードに書かれた数の和」で割り切れる
  2. $1$$n$のカードは最後の$2$枚になるまで残す
    ${}$

この時、条件を満たしながらカードがなくなるまで取り除くことができるような$n$は無数に存在するか?

くどーさんは条件を満たす$n$として$3,6$を見つけています。また$n\le 10$では条件を満たす$n$は存在しないことを数値計算で確かめてもらった記憶がある、と述べています。

これに関し私は以前数値計算を行いました: 「くどー問題」の数値計算

この記事では$3\le n\le 500$の範囲で数値計算を行い条件を満たす数を探索しましたが、$3,6$以外見つけることはできませんでした。

今回はJuliaというコンピュータ言語を用いて$3\le n\le 5000$までの範囲の殆どの数(※20個を除く)に関して検証を行いました。結果は以下です:

$3\le n\le 5000$において$3,6$以外条件を満たす数はみつかっていない
(※そのうち20個の$n$に関しては条件を満たすか否か判明していない)

本記事ではこれに関して説明します。前回同様、今回も整数論的考察はないです。また前回の記事は読まなくても大丈夫です。

用語の定義

まず議論に必要な用語を定義します。

議論に必要な用語
  1. 以下$n$は最大のカードの番号を表す

  2. 以下$m$はカードを取り除く枚数を表す。取り除くことを以下「削除」と呼ぶ。各$n$に対し$m$$1\le m\le n-2 \ (m\in\mathbb{N})$の値を取る

  3. 番号の削除の列を$[a_1,a_2,a_3,\ldots,a_m]$のように四角カッコで表すことにする。ここで$a_1,\ldots,a_m$$2$から$n-1$のどれかの数字(重複はない)であり、左の数字から初期のカードの集合$\{1,2,\ldots,n\}$の対応する要素を削除していく。
    以下の条件を満たすとき$[a_1,a_2,a_3,\ldots,a_m]$を「可能な削除列」と呼ぶことにする:
    $---$
    $[a_1,a_2,a_3,\ldots,a_m]$に含まれる数字を$\{1,2,\ldots,n\}$から削除した数字の集合を$M$として、$\sum_{i\in M}i^3$$\sum_{i\in M}i$で割り切れる。さらに$1\le l\le m$を満たすすべての整数$l$に対して$[a_1,\ldots,a_l]$も同様の条件:「$[a_1,\ldots,a_l]$に含まれる数字を$\{1,2,\ldots,n\}$から削除した数字の集合を$M$として、$\sum_{i\in M}i^3$$\sum_{i\in M}i$で割り切れる」を満たす
    $---$
    例えば$n=6$の場合、可能な削除列は各$m$で以下のようになる:

    $m$可能な削除列
    $1$$[3]$
    $2$$[3,4]$
    $3$$[3,4,5]$
    $4$$[3,4,5,2]$

    $n=6$では削除の各段階で1通りしか可能な削除列が存在しないが、一般には複数存在する。

  4. $\mathrm{Delete}(n;m)$を「$n$枚のカードから$m$枚を削除するときの可能な削除列の集合」とする。$n=6,m=4$なら上記のとおり
    \begin{align} \mathrm{Delete}(6;4)=\{[3,4,5,2]\} \end{align}
    である。もっと非自明な例として、$n=19,m=15$の場合は
    \begin{align} \mathrm{Delete}(19;15)=\{ [15, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 2, 18],\\ [15, 4, 5, 6, 7, 8, 9, 16, 18, 12, 3, 17, 10, 11, 13],\\ [15, 4, 5, 6, 7, 8, 9, 16, 18, 12, 3, 17, 10, 11, 14],\\ [15, 4, 5, 6, 7, 8, 9, 16, 18, 12, 3, 17, 10, 14, 11],\\ [15, 4, 5, 6, 7, 8, 9, 16, 18, 12, 10, 17, 3, 11, 13],\\ [15, 4, 5, 6, 7, 8, 9, 16, 18, 12, 10, 17, 3, 11, 14],\\ [15, 4, 5, 6, 7, 8, 9, 16, 18, 12, 10, 17, 3, 14, 11],\\ [15, 4, 5, 6, 7, 9, 8, 10, 11, 12, 13, 14, 16, 2, 18],\\ [15, 4, 5, 6, 7, 9, 8, 16, 18, 12, 3, 17, 10, 11, 13],\\ [15, 4, 5, 6, 7, 9, 8, 16, 18, 12, 3, 17, 10, 11, 14],\\ [15, 4, 5, 6, 7, 9, 8, 16, 18, 12, 3, 17, 10, 14, 11],\\ [15, 4, 5, 6, 7, 9, 8, 16, 18, 12, 10, 17, 3, 11, 13],\\ [15, 4, 5, 6, 7, 9, 8, 16, 18, 12, 10, 17, 3, 11, 14],\\ [15, 4, 5, 6, 7, 9, 8, 16, 18, 12, 10, 17, 3, 14, 11] \} \end{align}
    である。

  5. $\mathrm{Remain}(n;m)$を「$n$枚のカードから$m$枚を取り除いたときに可能な残りのカードの組み合わせの集合」とする。例えば$n=19,m=15$の場合
    \begin{align} \mathrm{Remain}(19;15)=\{ \{1, 3, 17, 19\}, \{1, 2, 14, 19\}, \{1, 2, 13, 19\}\} \end{align}
    である(残ったカードに関してはその数字の並び方は重要ではないので集合の記号$\{ \}$で表す)。

  6. $|A|$$A$は有限集合)は$A$の要素の数を表す:$|\mathrm{Delete}(6;4)|=1, \ |\mathrm{Delete}(19;15)|=14, \ |\mathrm{Remain}(19;15)|= 3$

  7. $\mathrm{mmax}(n)$を「ある$n$に対し$|\mathrm{Remain}(n,m)|\ge 1$を満たす最大の$m$」とする($|\mathrm{Remain}(n,1)|=0$の場合$\mathrm{mmax}(n)=0$とする)。例えば
    \begin{align} \mathrm{mmax}(3)=1, \ \mathrm{mmax}(4)=0, \ \mathrm{mmax}(5)=0, \mathrm{mmax}(6)=4,\ldots \end{align}
    となる。これは「可能な削除列が存在する最大の$m$」である。$\mathrm{mmax}(n)=n-2$なら最後までカードを削除できる。

以上からくどーさんの提示した問題は

$\mathrm{mmax}(n)=n-2$となる$n$は無限に存在するか?」

と言えます。

数値計算の概要

計算アルゴリズムは単純です。集合$\{1,2,\ldots,n\}$から要素を1つづつ取り除いて条件を満たすか確認し、$\mathrm{Remain}(n;m)$を各$m$で逐一構成することで$\mathrm{mmax}(n)$を計算します。

前回の記事ではすべての$\mathrm{Delete}(n;m)$を計算しました。しかしそれだと計算量が膨大になります(前章の$\mathrm{Delete}(19;15)$$\mathrm{Remain}(19;15)$を比較してみてください)。そこで今回は基本的に$\mathrm{Remain}(n;m)$のみ計算し、そこに至るまでの経路($=\mathrm{Delete}(n;m)$)は必要な場合だけ計算しました。 

結果

$\mathrm{mmax}(n)$$n$依存性

まず$\mathrm{mmax}(n)$$n$に対してプロットしてみます。

!FORMULA[100][1749414206][0]と!FORMULA[101][38042][0]の関係 $\mathrm{mmax}$$n$の関係

図1は各$n$に対する$\mathrm{mmax}$のグラフです。青の点が$\mathrm{mmax}(n)$、緑の線は$\mathrm{mmax}(n)=n-2$のグラフです。この線に青点が乗れば、その$n$は最後までカードを削除できる数字です。オレンジの上向き三角形は探索が終了していない$n$に対する$\mathrm{mmax}$の下限を示しています。つまりこれらの$n$では$\mathrm{mmax}$はこれより大きいことしか判明していません。

図1の詳細は下のリンクのグラフからアクセスすることができます:

インタラクティブなグラフ(図1)

このグラフは拡大・縮小することができ、かつ各データポイントにカーソルを重ねればそのデータの$(n,\mathrm{mmax}(n))$が表示されます(計算の終わってないデータでは$(n,\inf(\mathrm{mmax}(n)))$が表示される)。

これらより以下がわかります:

  1. いまのところ$3,6$以外で条件を満たす数は見つかっていない。特に$7\le n\le 1331$には条件を満たす数は存在しない
  2. 多くの$n$$\mathrm{mmax}$$0$または$2$である。ある程度大きな$n$では$\mathrm{mmax}$$n$に対し$0,0,2,2,0,0,2,2,\ldots$のように0と2がそれぞれ2回づつ繰り返される傾向が見られる
  3. $\mathrm{mmax}(n)= n/2$付近に$\mathrm{mmax}$が存在する一連の$n$が存在する。ある程度大きな$n$に対する$\mathrm{mmax}$は0付近または$n/2$付近以上に存在し、「ギャップ」が見られる

これに関してコメントです:


  • 1.に関して

    $7\le n\le 5000$の間では以下の20個の$n$(図1のオレンジ三角):

    $1322,1456,1567,1586,1979,2203,2261,2522,2639,2882,3135,3266,3503,3535,3551,3699,3799,3815,4562,4928$

    を除き、条件を満たす数字は存在しないことがわかっています。上記の$n$では多くの削除のパターンが存在するため計算量が非常に大きくなり探索が完了していません。

  • 2.に関して

    以下に$\mathrm{mmax}=0,0,2,2,\ldots$の繰り返しが起こる典型的な図を示します:

!FORMULA[134][-1207803673][0]の構造を持つ部分の拡大図 $\mathrm{mmax}=0,0,2,2,\ldots$の構造を持つ部分の拡大図

このような周期的な変化は、$n$がある程度大きくなれば普遍的に現れます。よろしければインタラクティブな図を拡大して確認してみてください。

  • 3.に関して
  • $\mathrm{mmax}=n/2$付近に存在する$n$は、$|\mathrm{Remain}(n;m)|$および$\mathrm{Delete}(n;m)$も特徴的な性質を持ちます。これに関しては次章で述べます。
    ギャップに関しては、探索が終了していない$n$$\mathrm{mmax}$が0から$n/2$の中間付近の値を持つ可能性はあり、そうであればギャップはそれほど明確ではなくなります。しかしながら、探索の終了していない$n$$|\mathrm{Remain}(n;m)|$がある$m$から指数的に大きくなり、経験的にはその場合$n/2$より有意に小さな$\mathrm{mmax}$をもつことはないです。なのでギャップの存在はロバストであるように思います。あくまで予想ではありますが。

2.3.は何らかの理論的背景を持つと思うのですが、いまのところよくわかりません。

「カードの削除数」と「残りのカードの可能な組み合わせの数」の関係

次に$m$$|\mathrm{Remain}(n;m)|$の関係を見てみます。すなわち各$n$における「カードの削除数」と「残りのカードの可能な組み合わせの数」との関係を調べてみます。

$n$がある程度大きい時、$m$ vs $|\mathrm{Remain}(n;m)|$は次の4つのパターンに分けられます:

  1. $\mathrm{mmax}=0,1,2,3$程度で終わるため、$|\mathrm{Remain}(n;m)|$$m$依存性を見る意味があまりない
  2. $\mathrm{mmax}=n/2$付近に$\mathrm{mmax}$を持ち、$|\mathrm{Remain}(n;m)|$はずっと$1$程度
  3. $\mathrm{mmax}= n/2$の線より有意に大きい$\mathrm{mmax}$を持ち、$|\mathrm{Remain}(n;m)|$はずっと$1$程度
  4. $\mathrm{mmax}= n/2$の線より有意に大きい$\mathrm{mmax}$を持ち、$|\mathrm{Remain}(n;m)|$はある$m$まで$1$程度であり、その後指数的に大きくなる

1.は図1の$\mathrm{mmax}\simeq 0$に存在する点です。殆どの$n$はこれに分類されます。
2.の典型的な$n$は例えば$n=4407$$\mathrm{mmax}=2146$)であり、$m$ vs $\mathrm{Remain}(4407;m)$をプロットすると次の図のようになります:
!FORMULA[177][-1046181974][0]における!FORMULA[178][38011][0] vs !FORMULA[179][-788139588][0] $n=4407$における$m$ vs $|\mathrm{Remain}(n;m)|$
図3のように殆どの$m$に対して$\mathrm{Remain}(4407,m)$$1$、時に$2$になることがあり、そしてそのような小さい値を保ったまま最終的にゼロになります(※ゼロの点は示されていません。一番右側の点が$\mathrm{mmax}=2146$)。

$\mathrm{mmax}=n/2$より有意に大きな$\mathrm{mmax}$をもつ$n$の場合、2.と同様に$\mathrm{Remain}$が小さい値を保ったままゼロになる場合と、途中で指数的に大きくなる場合の2つに分けられます。3.は前者であり、例えば$n=1035,1961$はその例です。$n=1961$の図をプロットすると以下のようになります:
!FORMULA[191][-1048798002][0]における!FORMULA[192][38011][0] vs !FORMULA[193][-788139588][0] $n=1961$における$m$ vs $|\mathrm{Remain}(n;m)|$

これは図3と同様の振る舞いです。$n=4407$よりは$|\mathrm{Remain}|$が2になる回数は多いですが、結局小さい値を保ったままゼロになります。

一方4.の例は$n=703,735,799,839,935,1203,1379,3959,4255$などです。この場合$\mathrm{mmax}$が指数関数的に増加したのちにゼロになるまでの振る舞いに違いがあります。そのうち典型的な$n=703,1203,4255$を図示します($y$軸logプロットです):

!FORMULA[200][797621789][0]における!FORMULA[201][38011][0] vs !FORMULA[202][-788139588][0] (!FORMULA[203][38383][0]軸 log scale) $n=703$における$m$ vs $|\mathrm{Remain}(n;m)|$ ($y$軸 log scale)
!FORMULA[204][-1049012243][0]における!FORMULA[205][38011][0] vs !FORMULA[206][-788139588][0] (!FORMULA[207][38383][0]軸 log scale) $n=1203$における$m$ vs $|\mathrm{Remain}(n;m)|$ ($y$軸 log scale)
!FORMULA[208][-1046236813][0]における!FORMULA[209][38011][0] vs !FORMULA[210][-788139588][0] (!FORMULA[211][38383][0]軸 log scale) $n=4255$における$m$ vs $|\mathrm{Remain}(n;m)|$ ($y$軸 log scale)

図5,6,7に対応するインタラクティブなグラフへのリンクも貼っておきます:

$n=703$では指数的増加ののちすぐに$\mathrm{mmax}$がゼロになります。$n=1203$では一度小さくなってからもしばらくある程度の値を保ち、そして最後は急激に小さくなってゼロになります。$n=4255$では指数増加する領域が2つあり、小さくなってからもある程度の値を保つ領域を経てゼロになります。

exponentの計算

ここで指数的増加のexponentを求めてみます。指数的増加を示す領域において2点をとりexponent $b$$\sim e^{bm}$で振る舞う)を計算します。そのような領域が複数存在する場合はそれぞれの領域で別々に$b$を求めます。さらに$\alpha:=e^b$とすると、$\alpha$$m$に対する$|\mathrm{Remain}(n;m)|$の平均的な増加率:$|\mathrm{Remain}(n;m+1)|/|\mathrm{Remain}(n;m)|$の指標となります。 以下の表が$b,\alpha$の計算結果です:

\begin{array}{cccccc} n & \mathrm{region} & (m_1,|\mathrm{Remain}(n;m_1)|) & (m_2,|\mathrm{Remain}(n;m_2)|) & b & \alpha\\ \hline 703 & & (100,53) & (318,83938) & 0.03380 & 1.034\\ \hdashline 935 & 1 & (421,34262) & (442,63172) & 0.02913 & 1.030\\ &2 & (445,35519) & (469,57558) & 0.02011 & 1.020\\ &3& (469,57558) & (498,98108) & 0.01839 & 1.019\\ \hdashline 1203 & &(498,48) & (560,393) & 0.03391 & 1.034\\ \hdashline 3959 &1 & (1810,27) & (1868,89) & 0.02057 & 1.021\\ &2 & (2017,160) & (2120,689) & 0.01418 & 1.014\\ \hdashline 4255 &1& (1900,100) & (2070,1373) & 0.01541 & 1.016\\ &2& (2204,3108) & (2382,33128) & 0.01329 & 1.013 \end{array}

$b,\alpha$を求めるのに2点$(m_1,|\mathrm{Remain}(n;m_1))$$(m_2,|\mathrm{Remain}(n;m_2))$を用いています。"region"は指数的増加領域が複数ある場合の各領域を示しています。$\alpha$の値より、指数増加領域では$m$が1増えるとき$|\mathrm{Remain}(n;m)|$は平均してだいたい1から3%程度増加することがわかります。

注意してほしいのは、この増加率は$|\mathrm{Delete}(n;m)|$の増加率とは違うことです。前回の記事で調べた$n$の範囲($n\le 500$)では$|\mathrm{Delete}(n;m+1)|/|\mathrm{Delete}(n;m)|$は1.2から1.4程度でした。今回はちゃんと計算していませんが、$n$$1000$から$5000$くらいでもおそらく同じようなものだと思います。これが示しているのは、違う$\mathrm{Remain}(n;m)$の要素の違う数字の削除が同じ$\mathrm{Remain}(n;m+1)$の要素をもたらすことがけっこうある、ということです。実際今回の数値計算において$\mathrm{Remain}(n;m)$の要素に対して削除作業をすると同じ$\mathrm{Remain}(n;m+1)$の要素に行き着くものが多くあるので、そのredundancyを取り除く作業をしています(「定義1」の4.と5.に示した$\mathrm{Remain}(19;15)$$\mathrm{Delete}(19;15)$を比較してみてください)。

$\mathrm{Delete}(n;m)$$m$依存性

これは前回の計算でもわかっていたのですが、$\mathrm{mmax}$がある程度大きくなるような$n$では$\mathrm{Delete}(n;m)$は非常に特徴的な振る舞いをします。言葉で言うより$\mathrm{Delete}(n;m)$を見たほうが早いので、幾つか具体的に例を示してみます。まず$n=19,59,119$$m=\mathrm{mmax}$における$\mathrm{Delete}(n;\mathrm{mmax})$(の一部)を示します:

      - n=19, m=14(=mmax):
[15, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 2, 18] 
[15, 4, 5, 6, 7, 8, 9, 16, 18, 12, 3, 17, 10, 11, 13] 
[15, 4, 5, 6, 7, 8, 9, 16, 18, 12, 3, 17, 10, 11, 14]
[15, 4, 5, 6, 7, 8, 9, 16, 18, 12, 3, 17, 10, 14, 11]
[15, 4, 5, 6, 7, 8, 9, 16, 18, 12, 10, 17, 3, 11, 13]
[15, 4, 5, 6, 7, 8, 9, 16, 18, 12, 10, 17, 3, 11, 14]
[15, 4, 5, 6, 7, 8, 9, 16, 18, 12, 10, 17, 3, 14, 11]
[15, 4, 5, 6, 7, 9, 8, 10, 11, 12, 13, 14, 16, 2, 18]
[15, 4, 5, 6, 7, 9, 8, 16, 18, 12, 3, 17, 10, 11, 13]
[15, 4, 5, 6, 7, 9, 8, 16, 18, 12, 3, 17, 10, 11, 14]
[15, 4, 5, 6, 7, 9, 8, 16, 18, 12, 3, 17, 10, 14, 11]
[15, 4, 5, 6, 7, 9, 8, 16, 18, 12, 10, 17, 3, 11, 13]
[15, 4, 5, 6, 7, 9, 8, 16, 18, 12, 10, 17, 3, 11, 14]
[15, 4, 5, 6, 7, 9, 8, 16, 18, 12, 10, 17, 3, 14, 11]

 - n=59 m=21(=mmax)
[30, 29, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28] 
[30, 29, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 53] 
[30, 29, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 26, 28] 
[30, 29, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 26, 53] 
[30, 29, 10, 11, 52, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28] 
[30, 29, 10, 11, 52, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 38] 
[30, 29, 10, 11, 52, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 32, 58, 57, 56, 55] 
[30, 29, 10, 11, 52, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 54, 42, 57, 55, 44] 
[30, 29, 10, 11, 52, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 54, 42, 57, 55, 56] 
[30, 29, 10, 11, 52, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 54, 42, 57, 56, 43] 
...

- n=119, m=51(=mmax)
[60, 10, 11, 12, 13, ..., 56, 57, 58, 59] 
[60, 10, 11, 12, 13, ..., 56, 57, 58, 94] 
[60, 10, 11, 12, 13, ..., 37, 38, 39, 94, ..., 56, 57, 58, 40]
...
    

$n=19$ではすべての$\mathrm{Delete}(n;\mathrm{mmax})$$n=59,119$では一部の$\mathrm{Delete}(n;\mathrm{mmax})$を示しました。これをみると

最初1つ(または2つ)の削除可能な数字があり、その次から連続した整数が並ぶ。最初に削除可能な数字は$n$が大きいと$n/2$に近い。

という特徴があることがわかります。

次に$\mathrm{Delete}(n;m)$$m$依存性を$m$が小さな領域で見てみます。例えば$\mathrm{mmax}\simeq n/2$上に存在する$n$である$n=1239$に関してこれを見てみると以下のようになります:
\begin{align} &\hspace{1cm}m=1: \mathrm{Delete}(1239;1)=\{[620]\}\\ &\hspace{1cm}m=2: \mathrm{Delete}(1239;2)=\{[620,31]\}\\ &\hspace{1cm}m=3: \mathrm{Delete}(1239;3)=\{[620,31,32]\}\\ &\hspace{1cm}m=4: \mathrm{Delete}(1239;4)=\{[620,31,32,33]\}\\ &\hspace{1cm}\hspace{1cm}\vdots\\ &\hspace{1cm}m=275: \mathrm{Delete}(1239;275)=\{[620,31,32,33,\ldots,303,304]\}\\ &\hspace{1cm}m=276: \mathrm{Delete}(1239;276)=\{[620,31,32,33,\ldots,303,304,305],[620,31,32,33,\ldots,303,304,1015]\}\\ &\hspace{1cm}\hspace{1cm}\vdots \end{align}
これも最初の削除可能な数字が$620\simeq 1239/2$であり、次に$31,32,...$と続き、実に$m=275$まで連続した数字が並びます。しかも$m=275$までは可能な削除列は1つだけであり、$m=276$になって初めて2つ現れます。

これらの傾向は$\mathrm{mmax}$が大きくなる$n$に関してかなり普遍的に当てはまります。またこれはなんとなくなのですが、そのような$n$は一桁目が$9$$7$であることが多いように見えます(インタラクティブなグラフで確認してみてください)。

まとめ

くどーさんのご提案された問題: そろそろ誰かに解いてほしい自作問題(未解決) をJuliaによる数値計算により調べました。その結果以下の結果を得ました:

  • $3\le n\le 5000$の範囲でくどー条件を満たす数は見つからなかった(※20個だけ条件を満たすか判明していない数が存在する)
  • 多くの$n$$\mathrm{mmax}$は0または2。ある程度大きな$n$において、$\mathrm{mmax}(n)$$n$に対し0,0,2,2,0,0,2,2,...のように0と2がそれぞれ2回づつ繰り返される振る舞いをもつ
  • $\mathrm{mmax}(n)=n/2$付近に$\mathrm{mmax}$をもつ一連の$n$が存在する。ある程度大きな$n$$\mathrm{mmax}$$0$付近または$n/2$付近以上に存在し、ギャップが見られる
  • ある程度$\mathrm{mmax}(n)$が大きくなる$n$における$|\mathrm{Remain}(n;m)|$$m$に対する振る舞いは、ずっと1のオーダーでそのままゼロになるか、またはある$m$から指数的に大きくなるかの2つに大きく分類される。そのうち指数的に増加する場合、その指数的増加領域における$|\mathrm{Remain}(n;m+1)|/|\mathrm{Remain}(n;m)|$はだいたい$1.01$から$1.03$である。
  • $\mathrm{mmax}$が大きくなる$n$$\mathrm{Delete}(n;m)$は、その要素の削除列を見ると、連続した整数が出現する。削除列の最初の数は$n$が大きい時ほぼ$n/2$

これらの現象の理論的背景はいまのところわかりません。

くどーさんのオリジナルの問題「条件を満たしながらカードがなくなるまで取り除くことができるような𝑛は無数に存在するか?」ですが、これに関しても今のところ何も言えないです。数値計算でこれにアプローチするには、条件を満たす$n$を数多く求め、ある$n$までで条件を満たす数の出現頻度を求めることが必要かと思います。また条件を満たす数の何らかのルールを見出すことが重要です。しかし今のところ3,6以外で条件を満たす数が求まっていないです。まずは6より大きな数で条件を満たすものを見つけるのが目標かと思います。ただ数値計算では、アルゴリズムに何らかの根本的な工夫をするか、または大規模計算機を使わないとこれ以上はなかなか厳しいかもしれません。

あと逆方向に探索することもできることを付記しておきます。これは$\{1,n\}$のカードの集合にカードを付け加えながら3乗和が1乗和で割り切れるか調べ、最終的に集合が$1$から$n$のカードすべてを持つかどうかを確認する探索法です。前回の記事ではこれを行ったのですが、非常に多くのパターンが現れるため数値計算が重くなりあまり有効ではありませんでした。ただ、前回は違う「付け加え」で結局同じ状態に行き着く場合の重複を除かずに計算していたので、これを取り除くと計算が軽くなるかもしれません。計算が非常に重くなる$n$に対しては、両方向から計算し、$m\simeq n/2$のところで両者を比較することで完全なカードの取り除きが可能か調べるのもよいかもしれません。

個人的な感想ですが、この問題が何らかの物理系と対応がつくと面白いように思います。テキトーな話ですが、「割り算の余り」と関係するといえば磁場中の量子系のエネルギー準位が思い浮かびます。Aharanov=Bohm効果、Diracの量子化条件のように、磁場中の半古典的な量子化条件では「割り切れる」ことが重要です。また量子ホール効果のエネルギー準位にも「余り」が登場します。しかしながら、$1$から$n$の3乗和が現れ、それを1乗和で割った余りがエネルギー準位や量子化条件等に現れるような物理系は存在するでしょうか...。

おしまい。${}_\blacksquare$

${}$

Appendix

Juliaのコード

Juliaは2012年に最初のバージョンがローンチされた比較的新しいコンピュータ言語ですjulia。Pythonと似通った言語でありながらCやfortranに匹敵するほど計算が高速であるという特徴を持ちます。Pythonを使える人ならJuliaもすぐに使えるようになると思います。

参考までに今回使用したコードをGistにアップロードしましたjulia_code。使い方を以下に説明します

コードおよびパラメータの設定に関する説明

本コードは与えられた$n$に対して$\mathrm{Remain}(n;m)$を計算します。計算量が大きくなる場合を想定し、$m$にも範囲を設け、その範囲で計算して結果をファイルに出力します。そしてファイルから結果を読み出すことで計算を途中から再開できるようにしてあります。

本コードには5つのパラメータを入力する必要があります:

  1. $\verb|n_threads|$: スレッド並列の並列数
  2. $\verb|n|$: 本文の$n$(カードの枚数)
  3. $\verb|mmin_file|$: 読み取りファイルのファイル名に記載されている$m$の最小値 (ファイルがない場合1にする)
  4. $\verb|mmax_file|$: 読み取りファイルのファイル名に記載されている$m$の最大値 (ファイルがない場合1にする)
  5. $\verb|mmax|$: 計算する$m$の最大値(※本文における$\mathrm{mmax}$とは関係ないことに注意)

1.はマシンの環境等に合わせて設定してください。2.5.は説明の必要はないと思います。
3.4.は説明が必要です。例えば$n=703$$m$$1$から$100$まで計算したいとします。初めて計算する場合
$\hspace{1cm}\verb|n_threads|=4$ ※これはご自身の環境に合わせて設定してください
$\hspace{1cm}\verb|n|=703$
$\hspace{1cm}\verb|mmin_file|=1$
$\hspace{1cm}\verb|mmax_file|=1$
$\hspace{1cm}\verb|mmax|=100$
とします。$\verb|mmin_file|=\verb|mmax_file|=1$とすると、ファイルからデータを読み出さず、最初から($m=1$から)計算を行います。計算が終わると
$\hspace{1cm}\verb|KudoProb_n-703_mmin-1_mmax-100.dat|$
というファイルが作成されると思います。
この結果を用いて$n=703$$m$$101$から$200$まで計算したいとします。その場合は上記ファイル名の1と100を$\verb|mmin_file|$$\verb|mmax_file|$に設定してください:
$\hspace{1cm}\verb|n_threads|=4$
$\hspace{1cm}\verb|n|=703$
$\hspace{1cm}\verb|mmin_file|=1$
$\hspace{1cm}\verb|mmax_file|=100$
$\hspace{1cm}\verb|mmax|=200$
このときコードは$\verb|KudoProb_n-703_mmin-1_mmax-100.dat|$から$m=100$における計算結果を読み出し、$m=101$から計算を開始し、$m=200$まで計算します。
設定した$\verb|mmax|$までで計算が終了した場合(すなわち本文の$\mathrm{mmax}$がパラメータ名の$\verb|mmax|$よりも小さいとき)、ファイル名に"$\verb|_finished|$"が添付されます。例えば$n=1000$の場合、$\mathrm{mmax}=1$(※本文の$\mathrm{mmax}$)なので
$\hspace{1cm}\verb|n_threads|=4$
$\hspace{1cm}\verb|n|=1000$
$\hspace{1cm}\verb|mmin_file|=1$
$\hspace{1cm}\verb|mmin_file|=1$
$\hspace{1cm}\verb|mmax|=100$
とすると計算は$m=2$までで終了します。このとき作成されるファイルは
$\hspace{1cm}\verb|KudoProb_n-1000_mmin-1_mmax-100_finished.dat|$
という名前になります。

アウトプットファイルの中身

アウトプットファイルはHDF5という形式で作成されます。Juliaでなくとも扱えるファイル形式かと思います。
juliaのREPLというインタラクティブなモードでファイルの構造を見てみます($n=27$、最初に"using HDF5"というコマンドを実行しておく):

      julia> file_open = h5open("KudoProb_n-27_mmin-1_mmax-100_finished.dat","r")
🗂️ HDF5.File: (read-only) KudoProb_n-27_mmin-1_mmax-100_finished.dat
├─ 🔢 list_length_pos_list
└─ 🔢 m_final
    

list_length_pos_listには、各$m$に対する$|\mathrm{Remain(n;m)}|$が記されています:

      julia> list_length_pos_list = read(file_open,"list_length_pos_list")
2×9 Matrix{Int64}:
1  2  3  4  5  6  7  8  9
1  1  1  2  1  1  1  1  0
    

データは行列の形で保存されており、1行目が$m$、2行目がその$m$に対応する$|\mathrm{Remain(n;m)}|$です。m_finalは初めて$|\mathrm{Remain(n;m)}|=0$となる$m$であり、つまりは$\mathrm{mmax}+1$です:

      julia> m_final = read(file_open,"m_final")
9
    

計算が終わらなかった場合は以下のような構造を持つファイルが出力されます:

      julia> file_open2=h5open("KudoProb_n-143_mmin-1_mmax-100.dat","r")
🗂️ HDF5.File: (read-only) KudoProb_n-143_mmin-1_mmax-100.dat
├─ 🔢 list_length_pos_list
├─ 🔢 m_final
└─ 🔢 pos_list
    

計算が終わらなかった場合はm_finalには入力した$\verb|mmax|$が代入されます。またこの場合、$m=\verb|mmax|$における$\mathrm{Remain(n;m)}$もpos_listという名前で保存されます。このファイルは時にかなり大きなサイズになるので(今回計算した範囲だと1GB程度になることもある)ご注意ください。

ソースファイルで修正を施すべき箇所

ソースファイルで変更するべき場所は2箇所(以下でDirectInput()を有効化した場合は144-152行目も)です。

1箇所目

166,167,168行のうち1つを有効化します(=どれかひとつだけコメントアウト記号#を外す)

  • DirectInput()を有効化した場合、インプットパラメータとしてソースファイル中の144-152行に記述されたものを読み取ります。よってこの場合144-152行のインプットパラメータを書き換えてください。
  • ArgInput()を有効化した場合、インプットパラメータをjuliaコマンドに与えられた値から読み取ります。juliaコマンドへ引数を渡すには以下のようにします:
      julia calc_KudoProb_parallel.jl (n_threadの値) (nの値) (mmin_fileの値) (mmax_fileの値) (mmaxの値)
    
  • StandardInput()をactivateした場合、インプットパラメータはコード実行時に標準入力から入力します。この場合、コードを実行してから指示に従ってこれらの値を入力してください。

多くの$n$に対して計算を行う場合はArgInput()を有効化し、juliaコマンドを様々なパラメータに対してシェルスクリプトに記述し、そのシェルスクリプトを実行するのがよいと思います(プロセス並列もできるし)。

2箇所目

170行目のpath_fileを設定します。この変数にデータファイルを保存するディレクトリを指定します。

基本的にはこれ以外の部分を変更する必要はないです。

その他注意

  1. スレッド並列化しています。でもそれほど速くはなりません(4スレッド、8スレッドでも倍の速さにはならない)。たぶんもっとよい並列化の方法があると思います。またGoogle Colaboratoryで計算していると時折segmentation faultにより計算がダウンします。おそらく並列化の影響だと思うのですがよくわかっていません(スタック領域の問題?)。Colaboratoryでも計算は他のマシンでのJuliaによる計算結果およびPythonでの計算結果を再現しているので信用できると思いますが、完全な保証はできませんのでご注意ください。
  2. 特定の$n$では取り除きのパターンが非常に多くなり計算が大変重くなります。そのため保存ファイルの大きさが1GB近くになる場合があるのでご注意ください。
  3. リストの要素は基本Int16で扱っています。よって扱える$n$の上限は$2^{15}-1=32,767$ですのでご注意ください(1乗和・3乗和の計算では精度をInt64に変換しています)。Int32やInt64にすればもっと大きな$n$まで扱えますが、その場合使用メモリも保存されたデータファイルも大きくなります。
  4. ある意味重要)ソースコードは単純です。本質は"Kudo_prob_ver06Apr2024"という関数の12行目だけです。ある程度知識がある方は、ご自身で使いやすいように書き換えてもらうのがよいと思います。

参考文献

投稿日:428
更新日:430

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。

投稿者

bisaitama
bisaitama
133
54213

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中