トップページに戻る
次のC#のサンプルへ
前のC#のサンプルへ
Cマガ電脳クラブ(第052回) ラマヌジャンを越えろ
問題
「どんな自然数も彼の親友である」といわれたインド生まれの数学者ラマヌジャン(1920年没)は,
あるとき1729という数を聞いて,
「ふたつの3乗数の和として2通りに表せる最小の自然数である」と即座に語ったそうだ
1729 = 1の3乗 + 12の3乗 = 9の3乗+10の3乗
続いて,4乗数でのこういうものを知っているかと尋ねられたラマヌジャンは,
しばらく考え,「答えはわからないが,それはものすごく大きくなるであろう」と語った。
ラマヌジャンに代わって,ふたつの4乗数の和として2通りに表せる最小の自然数を求めてほしい。
ソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
const int BaseJyougen = 160;
//const int Jyousuu = 3;
const int Jyousuu = 4;
static int CalcBekijyou(int pTarget)
{
int WillReturn = 1;
for (int I = 1; I <= Jyousuu; I++)
WillReturn *= pTarget;
return WillReturn;
}
static void Main()
{
Console.WriteLine("{0}の{1}乗である、", 160, Jyousuu);
Console.WriteLine("{0}以下の数同士の和で検証します。", CalcBekijyou(BaseJyougen));
Console.WriteLine();
int[] BekijyouArr = DeriveBekijyouArr();
var ResultDict = new Dictionary<int, List<string>>();
for (int I = 0; I <= BekijyouArr.GetUpperBound(0); I++) {
for (int J = I + 1; J <= BekijyouArr.GetUpperBound(0); J++) {
int KeyVal = BekijyouArr[I] + BekijyouArr[J];
string ProdExp = string.Format("{0,7} = {1,3}の{2}乗 + {3,3}の{2}乗",
KeyVal, I + 1, Jyousuu, J + 1);
if (ResultDict.ContainsKey(KeyVal) == false) {
ResultDict[KeyVal] = new List<string>() { ProdExp };
}
else ResultDict[KeyVal].Add(ProdExp);
}
}
var Query = ResultDict.Where(X => X.Value.Count == 2).OrderByDescending(X => X.Key);
foreach (var AnyPair in Query)
AnyPair.Value.ForEach(X => Console.WriteLine(X));
}
static int[] DeriveBekijyouArr()
{
var WillReturn = new List<int>();
for (int I = 1; I <= BaseJyougen; I++)
WillReturn.Add(CalcBekijyou(I));
return WillReturn.ToArray();
}
}
実行結果
160の4乗である、
655360000以下の数同士の和で検証します。
635318657 = 59の4乗 + 158の4乗
635318657 = 133の4乗 + 134の4乗
解説
べき乗のベースとなる数の上限を決めて、求めた解を検証してます。