たかが掛け算,されど掛け算

ことの始まり

2002年3月のある日,お友達のお友達のサイトに書かれていた日記に,こんな記述があった.

午後は外資系コンサル会社の筆記試験へ。
はじめて受けるタイプ。グラフや表を読みとる問題が多かったです。
あと国語の問題と規則性を見つける問題など。
わたしは規則性を見つける問題が苦手なようで、2問ほどわかりませんでした。
下記の問題を、どなたか解いて答を教えて下さい。

77 49 36 18 □
の数列の□に入る数字を答えよ。

――Maiko7」 2002年3月17日の日記より

答はおそらく「8」だと思う.一応解説しておくと,それぞれの桁の数を掛け算した答が次の数字になるというわけだ.(ひょっとしたら8じゃないかもしれないが,それなら何が入るのか,筋の通った説明があったら教えてほしい.ともかく,このページでは8が答だとしないと話が進まないので答は8としておく.)

さて,この問題を見た瞬間(正確には問題が解けた瞬間),一つの疑問がわいてきた.「同じことをすべての2桁の数について考えたとき,1桁の数に収束するまでの計算回数が一番多くなるのってどれだろう?直感的には問題に出ている『77』(計算回数4回)のような気がするけど,実際は?」

というわけで実際に計算してみたその結果が,このページの内容というわけである.

まずは頭で考えてみる

どの2桁の数が一番長く計算できるか,とりあえず暗算で考えてみることにした.

10〜19は1回で計算が終わってしまうということはすぐにわかる.20〜29も,掛け算した結果の十の位が(あるとすれば)「1」にしかならないから,最大でも2回の計算で終わることもすぐにわかる(1×何かになるわけだから).同様に30台も,1回計算した後の十の位が「0〜2」だから最大でも3回の計算.

ここまでは簡単なのだが,40台以降も同じように考えるのは面倒だ.それに,元の数が大きくなったほうが計算回数が増えるいうほど単純なものでもないから,結局全部の数について考えるしかないような気がする.

ということで,プログラムを書いてしまうのであった.

こういうことはコンピュータにやらせよう

手順を確認すると,次のようになる.

  1. 2桁の数を一の位と十の位にわける
  2. それぞれの数を掛け算
  3. 掛け算の答が1桁になったら終了,2桁ならその数について再び計算

プログラミングのリハビリを兼ねて,Cとperlとawkで書いてみた.とはいえ,アルゴリズムが単純だから,言語による違いなんてほとんどどこにも現れない.(ついでに言うと,入力行のないperlやawkのプログラムってあまり意味がない.)以下awkバージョンのコード:

BEGIN {
  for (i=10; i<100; i++) {
    count = 0;
    multi = i;

    printf("%d", i);

    do {
      count++;
      resolve(multi,n);
      multi = printResult(n);
    } while (multi >= 10);

    printf(" : %d\n", count);
  }
}

function resolve(orig, n) {
  n[1]  = orig%10;
  n[10] = int(orig/10);
}

function printResult(n) {
  printf(" > %d", n[1]*n[10]);
  return n[1]*n[10];
}

で,出力はこんな感じ.「:」の後の数が計算回数である.(結果を全部見る.)

70 > 0 : 1
71 > 7 : 1
72 > 14 > 4 : 2
73 > 21 > 2 : 2
74 > 28 > 16 > 6 : 3
75 > 35 > 15 > 5 : 3
76 > 42 > 8 : 2
77 > 49 > 36 > 18 > 8 : 4
78 > 56 > 30 > 0 : 3
79 > 63 > 18 > 8 : 3

考察その1:収束するまでの計算回数

さて,結果が出たところで,まずは収束するまでの計算回数から見ることにしよう.例えばこんな具合:

>./multi.awk | awk '{print $NF}' | sort | uniq -c | awk '{print $2, $1}'

1 32
2 34
3 23
4 1

1列目が計算回数で,2列目がその計算回数になる2桁の数の総数である.つまり,4回計算して収束する2桁の数は1個しかないということがわかる.それは言うまでもなく「77」だ.直感どおり,めでたしめでたし.

考察その2:収束先の数

さて今度は,0〜9までのそれぞれの数に,どれだけの数が収束するのかを見てみることにした.プログラムの出力の各行最後から3つ目の列が収束した最終的な数だから,こんな具合で,えいっ:

>./multi.awk | awk '{print $(NF-2)}' | sort | uniq -c | awk '{print $2, $1}'

0 24
1 1
2 8
3 2
4 9
5 6
6 13
7 2
8 22
9 3

いやほんと,CUIも便利だなー,ってそういうことではない.1列目が収束先の1桁の数,2列目がその1桁の数に収束する2桁の数の総数である.一番多いのは「0」に収束する場合で,「1」に収束するのは「11」の場合しかないことがわかる.

ちょっと考えてみれば「0」に収束するのが多いのはわかる.つまり,10とか20とかちょうど10の倍数の数はもちろん0だし,一の位でも十の位でも「5」があればかなりの割合で「0」になってしまうからだ.さらに,スタートの段階に限らず,途中の段階で「10の倍数」か「5がつく数」になってしまっても同じことだから,結果として「0」に収束する数が多くなるということなのだろう.とはいえ,他の数についてはなんとも考察しようがないのだが.「8」に22個も収束することに,何か直感的にわかりやすい説明があるのかな?

考察その3:樹形図

収束先の数がわかったのだから,その1桁の数へ収束するように元の2桁の数をたどることができるはずだ.というわけで樹形図を作ってみた.8の場合は以下のような感じになる.(樹形図を全部見る.)

8 -- 18 -- 29
  |     |- 36 -- 49 -- 77
  |     |     |- 66
  |     |     |- 94
  |     |- 63 -- 79
  |     |     |- 97
  |     |- 92
  |- 24 -- 38
  |     |- 46
  |     |- 64 -- 88
  |     |- 83
  |- 42 -- 67
  |     |- 76
  |- 81 -- 99

だから何っていうことはないのだが,美しいと思わない?

最後に

ここまで大げさに話を膨らませてみたけど,果たしてこれって面白いのだろうか?いや,もちろん僕には面白いし,面白かったから(忘れたくなかったから)こうやってまとめてみたんだけど.これって群論とか整数論とかに関係するのかな?しないよなあ.

最初を3桁の数で始めたらどうなるか,とか,果たして(収束する数の多さに)何かの規則性があるのか,とか,気になることはまだまだあるけど,とりあえず今回はこれで終了.気になる方はぜひ計算して結果を教えてください.

ネタを提供してくださったMaikoさんと,ミスドでこの話に付き合ってくれていろいろ有意義な提案をしてくれたU君に感謝します.