問題141 Scheme での実装例

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