読者です 読者をやめる 読者になる 読者になる

PEをMathematicaで

Project Eulerに挑戦してみよう

Project Euler 211 / 約数の2乗の和

正の整数 n に対して σ2(n) を約数の2乗の和とする。たとえば

σ2(10) = 1+4+25+100 = 130

0 < n < 64,000,000 で σ2(n) が平方数であるすべての n の和を求めよ。

Problem 211 - Project Euler


約数の2乗の和は DivisorSigma[2,n] で簡単に求められますが,平方数の判定で苦労しました。Mathematica には isSquareQ みたいな関数がありません。ない知恵をしぼって考えました。

  1. IntegerQ[Sqrt[n]]
  2. Floor[Sqrt[n]] == Sqrt[n]
  3. (Floor[Sqrt[n]])^2 == n

IntegerQ[Sqrt[n]] はコンパイルできず,激遅。

Floor[Sqrt[n]] == Sqrt[n] は大きな数の判定で間違う。N[ ] で桁数を増やしてもダメ。

(Floor[Sqrt[n]])^2 == n でなんとか正解しましたが,7分半もかかってしまいました。もっと数学的につめてからでないと,1分以内におさめるのは難しそうです。