Problem 44 » 履歴 » バージョン 1
Noppi, 2024/01/16 08:16
| 1 | 1 | Noppi | [ホーム](https://redmine.noppi.jp) - [[Wiki|Project Euler]] |
|---|---|---|---|
| 2 | # [[Problem 44]] |
||
| 3 | |||
| 4 | ## Pentagon Numbers |
||
| 5 | Pentagonal numbers are generated by the formula, $P_n=n(3n-1)/2$. The first ten pentagonal numbers are: |
||
| 6 | |||
| 7 | $$1, 5, 12, 22, 35, 51, 70, 92, 117, 145, \dots$$ |
||
| 8 | |||
| 9 | It can be seen that $P_4 + P_7 = 22 + 70 = 92 = P_8$. However, their difference, $70 - 22 = 48$, is not pentagonal. |
||
| 10 | |||
| 11 | Find the pair of pentagonal numbers, $P_j$ and $P_k$, for which their sum and difference are pentagonal and $D = |P_k - P_j|$ is minimised; what is the value of $D$? |
||
| 12 | |||
| 13 | ## 五角数 |
||
| 14 | 五角数は $P_n=n(3n-1)/2$ で生成される. 最初の10項は |
||
| 15 | |||
| 16 | $$1, 5, 12, 22, 35, 51, 70, 92, 117, 145, \dots$$ |
||
| 17 | |||
| 18 | である. |
||
| 19 | |||
| 20 | $P_4 + P_7 = 22 + 70 = 92 = P_8$ である. しかし差 $70 - 22 = 48$ は五角数ではない. |
||
| 21 | |||
| 22 | 五角数のペア $P_j$ と $P_k$ について, 差と和が五角数になるものを考える. 差を $D = |P_k - P_j|$ と書く. 差 $D$ の最小値を求めよ. |
||
| 23 | |||
| 24 | ```scheme |
||
| 25 | (import (scheme base) |
||
| 26 | (gauche base) |
||
| 27 | (scheme vector)) |
||
| 28 | |||
| 29 | (define pentagonal-num |
||
| 30 | (list->vector |
||
| 31 | (cdr |
||
| 32 | (map (^n |
||
| 33 | (/ (* n |
||
| 34 | (- (* n 3) 1)) |
||
| 35 | 2)) |
||
| 36 | (iota 10002))))) |
||
| 37 | |||
| 38 | (define (pentagonal-num? n) |
||
| 39 | (vector-binary-search |
||
| 40 | pentagonal-num |
||
| 41 | n |
||
| 42 | (^[a b] (- a b)))) |
||
| 43 | |||
| 44 | (define find-pentagonal-pair |
||
| 45 | (let loop1 ([k 1]) |
||
| 46 | ; 10000 まで生成した時、7070 + 7071 までは値が範囲を超えなかった |
||
| 47 | (if (< 7071 k) |
||
| 48 | (errorf "解が見つかりませんでした~%") |
||
| 49 | (let ([p_k (vector-ref pentagonal-num k)]) |
||
| 50 | (let loop2 ([j (- k 1)]) |
||
| 51 | (if (negative? j) |
||
| 52 | (loop1 (+ k 1)) |
||
| 53 | (let ([p_j (vector-ref pentagonal-num j)]) |
||
| 54 | (if (and (pentagonal-num? (- p_k p_j)) |
||
| 55 | (pentagonal-num? (+ p_k p_j))) |
||
| 56 | `(,p_j . ,p_k) |
||
| 57 | (loop2 (- j 1)))))))))) |
||
| 58 | |||
| 59 | (define answer-44 |
||
| 60 | (- (cdr find-pentagonal-pair) |
||
| 61 | (car find-pentagonal-pair))) |
||
| 62 | |||
| 63 | (format #t "44: ~d~%" answer-44) |
||
| 64 | ``` |