Scheme で書いてみた。ロジックは先日書いた通りで、単にプログラムを起こしただけです。
(define (problem-141 limit) (let ((lim (expt limit (/ 1 4)))) (define (iter-k q p k sum) (let ((nn (* (+ (* k p p p) q) k q))) (if (>= nn limit) sum (iter-k q p (+ k 1) (+ sum (if (integer? (sqrt nn)) nn 0)))))) (define (iter-p q p sum) (if (>= (* (+ (* p p p) q) q) limit) sum (iter-p q (+ p 1) (if (= (gcd p q) 1) (+ sum (iter-k q p 1 0)) sum)))) (define (iter-q q sum) (if (>= q lim) sum (iter-q (+ q 1) (+ sum (iter-p q (+ q 1) 0))))) (iter-q 1 0)))
実行してみます。
gosh> (time (problem-141 1e12)) ;(time (problem-141 1.0e12)) ; real 1.835 ; user 1.812 ; sys 0.015 878454337159