問題概略
辺の長さが , , , の 4 つの直角三角形はすべて隣辺(直角に隣接する辺)として長さ 12 の辺をもっている。
長さ 12 の隣辺をもつ整数辺の直角三角形はこれら 4 つだけである。47547 個の整数辺の直角三角形の隣辺になる最小の整数を求めよ。
解説の pdf も作りました。きれいなレイアウトで読みたい方はこちらをどうぞ。
n の約数の個数の条件
直角三角形の3辺を , , とおきます。 が斜辺です。 から
に対応する三角形の個数を とおきます。
は上の方程式の自然数解の個数で,要するにこの問題で聞いていることは「 を積の形に直す方法は何通りありますか?」です。
, の条件は「」かつ「 の偶奇が一致する」です。
以下, の約数の個数を であらわします。
n が奇数のとき
は奇数なので は両方とも奇数です。
の約数のうち の 1 個を除外してから を考えて 2 で割ります。
のとき
n が偶数のとき
は偶数なので の偶奇が一致するとき は両方とも偶数です。
, とおくと になります。 が奇数の場合と同様に考えると
のとき
n の素因数分解
を素数として をその指数とします。
のとき の約数の個数は 個です。
(1)(2)から次のことがわかります。
- に使う素数は 5 個
- などより指数は 2, 3, 5, 6, 9
最小の を求めたいので「素数は 2 または 3 からはじまる連続する 5 個」「小さな素数の指数は大きい」もわかります。
求める の候補は次の 2 つです。
- が奇数のとき
- が偶数のとき
最小値は が偶数のときの値です。
桁数の大きな電卓アプリならそのまま計算できそうな値ですが,project euler の精神にのっとって mathematica で解きました。計算時間は約 0.00005 秒です。
- の指数のリスト powerList を作る
- powerList の長さをもとに素数のリスト primesEven, primesOdd を作る
- の候補 2 つのうち小さい方が答え
powerList = (First@# - 1)/2 & /@ Reverse@FactorInteger[47547*2 + 1]; len = Length@powerList; primesEven = Prime@Range@len; primesOdd = Prime@Range[2, len + 1]; numOdd = Inner[Power, primesOdd, powerList, Times]; numEven = 2*Inner[Power, primesEven, powerList, Times]; ans = Min[numOdd, numEven]