Problem 58 - 対角線の中に現れる素数
50問を目前に解ける問題が少なくなってきた。全然解けそうな感じの問題が無い。
1から初めて, 以下のように反時計回りに数字を並べていくと, 辺の長さが7の渦巻きが形成される.
(図)
面白いことに, 奇平方数が右下の対角線上に出現する. もっと面白いことには, 対角線上の13個の数字のうち, 8個が素数である. ここで割合は8/13 ≈ 62%である.
渦巻きに新しい層を付け加えよう. すると辺の長さが9の渦巻きが出来る. 以下, この操作を繰り返していく. 対角線上の素数の割合が10%未満に落ちる最初の辺の長さを求めよ.
凄く興味深い。
確か前にも対角線の問題があったので参考にしてみた。
(define (prime? n) (letrec ((trial-divisor (lambda (t) (or (< n (* t t)) (and (not (zero? (remainder n t))) (trial-divisor (+ t 2))))))) (and (> n 1) (or (= n 2) (and (odd? n) (trial-divisor 3)))))) (define (problem58 x) (letrec ((primers-filter (lambda (n) (filter prime? (map (lambda (x) (- (* n n) (* x (- n 1)))) '(1 2 3))))) (iter (lambda (n acc) (let* ((res (append (primers-filter n) acc)) (len (length res)) (p (/ len (+ (* (quotient n 2) 4) 1)))) (if (< p x) n (iter (+ n 2) res)))))) (iter 3 '()))) (problem58 0.2) ; 309 (problem58 0.1) ; 26241
そろそろ試し割り素数判定はやばくなってきた。
10%への道が長すぎだよ。