今回も他人様の動画をネタにしています。よびのり(予備校のノリで学ぶ「大学の数学・物理」)さん、お世話になっています。

受験生のとき会いたかったYouTuber

できれば受験生のとき会いたかった。鈴木貫太郎さんも。そうすれば落ちこぼれずに済んだんだけどな。もっともインターネットもなかった時代なんだけど。

予備校のノリで学ぶ「大学の数学・物理」

鈴木貫太郎さんのチャンネル ネイピア数と複素数の解説は天下一品です。

このふたつは登録しておいて損はありません。

さて、本題に戻します。タクシー数とはどのようなものなのでしょうか?

これは タクシー数 – Wikipediaからの引用ですが、

n番目のタクシー数(Ta(n)もしくはTaxicab(n)と表記される)とは、2つの立方数の和として n 通りに表される最小の正の整数と定義される。

たとえば1729は 2番目のタクシー数です。

1729は(1の3乗)+(12の3乗)であるとともに(9の3乗)+(10の3乗)にもなっています。
計算してみると1729に一致することがわかります。

では1番目のタクシー数は何でしょうか? (Xの3乗)+(Yの3乗)で与えられる最小の正の整数。それは
(1の3乗)+(1の3乗)= 2 です。

ではさっそくそれ以外のタクシー数を探してみましょう。

タクシー数を探すには?

(Aの3乗)と(Bの3乗)を手当たり次第つくって複数の(Aの3乗)と(Bの3乗)が同じ数になっているのを見つけるというのが思いつきます。やってみましょう。

GetTaxiメソッドは単純にaの3乗とbの3乗を計算してTaxiオブジェクトのなかに格納します。TaxiオブジェクトをリストにしてValueが小さい順に並べ替え、foreach文のなかで同じValueが何回連続するかを数えています。n番目のタクシー数ならn回同じvalueが取得されるはずです。

第一引数は何番目のタクシー数を求めるか、第二引数は探す範囲です。

条件を満たしたらループを抜けます。条件を満たすことなくループを抜けたらnullを返します。

ボタンをクリックしたら計算を開始します。3番目のタクシー数を求めたいので、引数には3と1000を渡しました。1000の根拠は特にありません。実行結果は以下のようになります。

167(4,657,463) + 436(82,881,856) = 87,539,319
228(11,852,352) + 423(75,686,967) = 87,539,319
255(16,581,375) + 414(70,957,944) = 87,539,319

1000の3乗は87,539,319を超えます。そのため87,539,319よりも小さい3番目のタクシー数はないと言い切ることができます。

問題は4番目のタクシー数です。8000くらいの値を指定しても見つかりません。10,000以上の値を指定したら途中でハングアップしてしまいます。

カンニングの結果、4番目のタクシー数は6,963,472,309,248でした。タクシー数 – Wikipediaより。

2,421(14,190,064,461) + 19,083(6,949,282,244,787) = 6,963,472,309,248
5,436(160,634,321,856) + 18,948(6,802,837,987,392) = 6,963,472,309,248
10,200(1,061,208,000,000) + 18,072(5,902,264,309,248) = 6,963,472,309,248
13,322(2,364,331,062,248) + 16,630(4,599,141,247,000) = 6,963,472,309,248