今回も他人様の動画をネタにしています。よびのり(予備校のノリで学ぶ「大学の数学・物理」)さん、お世話になっています。
受験生のとき会いたかった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乗)が同じ数になっているのを見つけるというのが思いつきます。やってみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
public class Taxi { public Taxi() { } public Taxi(long a, long b) { A = a; B = b; Value = (long)Math.Pow(A, 3) + (long)Math.Pow(B, 3); } public long A { get; private set; } = 1; public long B { get; private set; } = 1; public long Value { private set; get; } } |
GetTaxiメソッドは単純にaの3乗とbの3乗を計算してTaxiオブジェクトのなかに格納します。TaxiオブジェクトをリストにしてValueが小さい順に並べ替え、foreach文のなかで同じValueが何回連続するかを数えています。n番目のタクシー数ならn回同じvalueが取得されるはずです。
第一引数は何番目のタクシー数を求めるか、第二引数は探す範囲です。
条件を満たしたらループを抜けます。条件を満たすことなくループを抜けたらnullを返します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
public partial class Form1 : Form { List<Taxi> GetTaxi(int num, int max) { List<Taxi> taxies = new List<Taxi>(); for(int a = 1; a <= max; a++) { for(int b = a; b <= max; b++) { taxies.Add(new Taxi(a, b)); } } taxies = taxies.OrderBy(x => x.Value).ToList(); List<Taxi> rets = new List<Taxi>(); foreach(var taxi in taxies) { if(rets.Count != 0 && rets[0].Value != taxi.Value) rets.Clear(); rets.Add(taxi); if(rets.Count == num) return rets; } return 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番目のタクシー数はないと言い切ることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class Form1 : Form { private void button1_Click(object sender, EventArgs e) { int num = 3; int max = 1000; List<Taxi> rets = GetTaxi(num, max); string ret = ""; if(rets != null) { foreach(Taxi tax in rets) ret += String.Format("{0}({1:#,0}) + {2}({3:#,0}) = {4:#,0}\n", tax.A, Math.Pow(tax.A, 3), tax.B, Math.Pow(tax.B, 3), tax.Value); } else { ret += "見つかりませんでした"; } richTextBox1.Text = ret; } } |
問題は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