他人にもっと自分のことを話したいけど、僕がありのまま自分が思ったこと感じたことを話すと、性格の悪い人はバカにしそうだし、といって性格の良い人は普通に引いたり怒ったりしそうだから、難しいんだよな
だから性格が悪いけど僕にだけめちゃくちゃ優しい友達がほしい…(どうしようもない)

C++.

#include <string>

class Widget {
private:
    std::string m_str;
public:
    explicit Widget(const std::string& str) : m_str(str) {};
};

こういうコードを書くとわたしの CLion (エディタ) が次のようなメッセージを出してくる.

Clang-Tidy: Pass by value and use std::move

なおす.

#include <string>

class Widget {
private:
    std::string m_str;
public:
    explicit Widget(std::string str) : m_str(std::move(str)) {};
};

こうすると特にメッセージ出ないのでこっちのほうがいい…, のかな.
むずかしい.

NOB. NUMBERと, 数の“珍しさ”について

816192=6661661161

これはパズル作家の芦ヶ原伸行氏が発見した式です. つまり, 6661661161は2種類の数字だけから構成された平方数なのです. 氏にちなんで81619のことをNOB. NUMBERと呼ぶとかなんとか.

同じような式として, 382=1444や31142=9696996などがあります. このような, 2乗すると2種類の数字から構成された数になるような正整数 (ただし,102=100や2002=40000のような0で終わる数は除く) は, 3桁以下では19個あるが, 4桁以上では3114と81619の2種類しか見つかっていないといいます.

これだけ見ると, このような数がもっとあっても良いような気もするし, 21個もあるだけで十分すごいような気もします. そこで本記事では, 「2種類の数字だけから構成された平方数 (0で終わる数除く)」というのはどの程度“珍しい”のかについて, 定量的に検討してみます.

まず, n≧2を固定して, n桁の整数が2種類の数字だけから構成された平方数になるのがどの程度“珍しい”のかを考えましょう.

n桁の数というのは, 10n-1以上10n未満の整数のことですから, 10n-10n-1個あります.

次に, n桁の平方数について考えます. n桁の平方数というのは, k2 (kは10(n-1)/2以上10n/2未満の整数) という形をしているので, だいたい 10n/2-10(n-1)/2 個あることになります.

最後に, n桁の数のうち, 「2種類の数字だけから構成された数」について考えます. まず, 「2種類の数字」を 0〜9 までの10個の数字から選ぶやりかたは, 10×9/2=45 通りあります. 次に, この選んだ数字のうちを各 n 桁に並べていくやり方は, 2n 通りあります. なので, だいたい 45×2n
個ある訳ですが, ここから 7777777 のように1種類の数字だけから構成された数や, 0200222 のように 0 から始まる数は省かねばなりませんから, そのへんをきちんと計算すると, 40.5×(2n-2)=81×(2n-1-1) 個あることがわかります.

さて, 今, 一様ランダムにn桁の整数を選びだすことを考えてみます. すると,

  • それが平方数である確率はだいたい$\frac{10^{n/2}-10^{(n-1)/2}}{10^n-10^{n-1}}=\frac{10-\sqrt{10}}{9\cdot 10^{n/2}}$
  • 「2種類の数字だけから構成された数」である確率は$\frac{81\cdot(2^{n-1}-1)}{10^n-10^{n-1}}=\frac{45\cdot (2^n-2)}{10^n}$

となります.

ここで, あるn桁の数が平方数であるか否かと, 「2種類の数字だけから構成された数」であるか否かとが独立であると仮定します. (もちろん, これはあくまで“珍しさ”を見積もることを目的とした, ほぼありえない仮定です.) そうすると, あるn桁の数が「2種類の数字だけから構成された平方数」である確率は, 積をとって

$\frac{10-\sqrt{10}}{9\cdot 10^{n/2}}\cdot\frac{45\cdot (2^n-2)}{10^n}=\frac{5(10-\sqrt{10})\cdot (2^n-2)}{10^{3n/2}}$

となります.

この値を小さいnに関して計算してみると次のようになります.

n (桁数)2345678910
確率6.8×10-26.5×10-34.8×10-43.2×10-52.1×10-61.4×10-78.7×10-95.5×10-103.5×10-11

確率がどんどん小さくなっていくことがわかります.

冒頭で816192=6661661161という式を紹介しましたが, これは10桁の値ですので, 表のn=10のところを見ると, なんと確率3.5×10-11! よって6661661161はすごく“珍しい”数であることがわかります.

しかし冷静に考えてみると, 珍しいといっても, 10桁の数というのはいっぱいあるので, その中にはそういう数も1つくらいあるのでは? という気もしてきます. その意味では, 今考えるべきはn桁の数のうち「2種類の数字だけから構成された平方数」であるものの期待値でしょう. 期待値は, 上で求めた計算式に, n桁の数の個数10n-10n-1をかけて
$\frac{45(10-\sqrt{10})\cdot (2^n-2)}{10^{n/2+1}}$
となります. こちらも計算してみると次のような表ができます.

n (桁数)234567891011
期待値6.25.84.32.91.91.20.780.500.310.20

n=10の期待値は0.31. これを見ると, まあ珍しいというほどでもないかな…という感じもします.

(※なお, 話がややこしくなるのを防ぐため, ここまでの議論では最初にあった「0で終わる数は除く」という条件を無視しました. 実際には102m,4×102m, 9×102mのような「2種類の数字だけから構成された平方数」というのもあるのですが, その辺はおいておきます.)

ここで, 「2種類の数字だけから構成された平方数 (0で終わる数除く)」の実際の個数も上の表に加えてみましょう. するとこうなります.

n (桁数)234567891011
実際の個数6625010010
期待値6.25.84.32.91.91.20.780.500.310.20

こうしてみると, 5桁だけやたらと多かったりしますが, 大体期待値に近い値をとっていることがわかります.

ところで, A018884 - OEISによれば, 1041以下ではこのような平方数はこれ以上ないことが確認されており, さらにThe sequence is probably finite.つまり, 「おそらくこのような平方数は有限個しかないであろう」と推測されています. このような推測は, さきほど計算した期待値からも可能です. つまり, 先程の期待値の無限和

$\sum_{n=2}^\infty \frac{45(10-\sqrt{10})\cdot (2^n-2)}{10^{n/2+1}}$

を考えるのです. これは等比数列の和の公式を用いれば簡単に計算することができ,

$\frac{45}{5-\sqrt{10}}\fallingdotseq 24.5$

に収束します. つまり, 自然数全体のうちこのような数は24.5個くらいしかないだろうと期待されるということです. なるほど確かに, The sequence is probably finite.という気がしてきますね. 実際にはこのような数は21個見つかっているので, 期待値としてはまあいい線をいっているのではないでしょうか.

話が散らかってきたため強引にまとめますが, 個人的に言いたかったのは2種類の数字だけから構成された平方数 (0で終わる数除く) 「(少なくとも期待値的には) 高々有限個っぽいという点で, “珍しい”といえるのではないか」というようなことです.

本当はこの後, このような考え方を元に他の数の“珍しさ”について考えていくつもりだったのですが, 疲れたので一旦おしまい.