プロジェクト

全般

プロフィール

Problem 64 » 履歴 » バージョン 3

Noppi, 2024/01/29 09:34

1 1 Noppi
[ホーム](https://redmine.noppi.jp) - [[Wiki|Project Euler]]
2
# [[Problem 64]]
3
4
## Odd Period Square Roots
5
All square roots are periodic when written as continued fractions and can be written in the form:
6
7
$\displaystyle \quad \quad \sqrt{N}=a_0+\frac 1 {a_1+\frac 1 {a_2+ \frac 1 {a3+ \dots}}}$
8
9
For example, let us consider $\sqrt{23}:$
10
11
$\quad \quad \sqrt{23}=4+\sqrt{23}-4=4+\frac 1 {\frac 1 {\sqrt{23}-4}}=4+\frac 1  {1+\frac{\sqrt{23}-3}7}$
12
13
If we continue we would get the following expansion:
14
15
$\displaystyle \quad \quad \sqrt{23}=4+\frac 1 {1+\frac 1 {3+ \frac 1 {1+\frac 1 {8+ \dots}}}}$
16
17
The process can be summarised as follows:
18
19
$\quad \quad a_0=4, \frac 1 {\sqrt{23}-4}=\frac {\sqrt{23}+4} 7=1+\frac {\sqrt{23}-3} 7$
20
$\quad \quad a_1=1, \frac 7 {\sqrt{23}-3}=\frac {7(\sqrt{23}+3)} {14}=3+\frac {\sqrt{23}-3} 2$
21
$\quad \quad a_2=3, \frac 2 {\sqrt{23}-3}=\frac {2(\sqrt{23}+3)} {14}=1+\frac {\sqrt{23}-4} 7$
22
$\quad \quad a_3=1, \frac 7 {\sqrt{23}-4}=\frac {7(\sqrt{23}+4)} 7=8+\sqrt{23}-4$
23
$\quad \quad a_4=8, \frac 1 {\sqrt{23}-4}=\frac {\sqrt{23}+4} 7=1+\frac {\sqrt{23}-3} 7$
24
$\quad \quad a_5=1, \frac 7 {\sqrt{23}-3}=\frac {7 (\sqrt{23}+3)} {14}=3+\frac {\sqrt{23}-3} 2$
25
$\quad \quad a_6=3, \frac 2 {\sqrt{23}-3}=\frac {2(\sqrt{23}+3)} {14}=1+\frac {\sqrt{23}-4} 7$
26
$\quad \quad a_7=1, \frac 7 {\sqrt{23}-4}=\frac {7(\sqrt{23}+4)} {7}=8+\sqrt{23}-4$
27
28
It can be seen that the sequence is repeating. For conciseness, we use the notation $\sqrt{23}=[4;(1,3,1,8)]$, to indicate that the block (1,3,1,8) repeats indefinitely.
29
30
The first ten continued fraction representations of (irrational) square roots are:
31
32
$\quad \quad \sqrt{2}=[1;(2)]$, period=$1$
33
$\quad \quad \sqrt{3}=[1;(1,2)]$, period=$2$
34
$\quad \quad \sqrt{5}=[2;(4)]$, period=$1$
35
$\quad \quad \sqrt{6}=[2;(2,4)]$, period=$2$
36
$\quad \quad \sqrt{7}=[2;(1,1,1,4)]$, period=$4$
37
$\quad \quad \sqrt{8}=[2;(1,4)]$, period=$2$
38
$\quad \quad \sqrt{10}=[3;(6)]$, period=$1$
39
$\quad \quad \sqrt{11}=[3;(3,6)]$, period=$2$
40
$\quad \quad \sqrt{12}=[3;(2,6)]$, period=$2$
41
$\quad \quad \sqrt{13}=[3;(1,1,1,1,6)]$, period=$5$
42
43
Exactly four continued fractions, for $N \le 13$, have an odd period.
44
45
How many continued fractions for $N \le 10\,000$ have an odd period?
46
47
## 奇数周期の平方根
48
平方根は連分数の形で表したときに周期的であり, 以下の形で書ける:
49
50 2 Noppi
√N = $a_0$ + 1 / ($a_1$ + 1 / ($a_2$ + 1 / ($a_3$ + ...)))
51 1 Noppi
52
例えば, √23を考えよう.
53
54
√23 = 4 + √23 - 4 = 4 + 1 / (1 / (√23 - 4)) = 4 + 1 / (1 + (√23 - 3) / 7)
55
56
となる.
57
58
この操作を続けていくと,
59
60
√23 = 4 + 1 / (1 + 1 / (3 + 1 / (1 + 1 / (8 + ...))))
61
62
を得る.
63
64
操作を纏めると以下になる:
65
66 2 Noppi
* $a_0$ = 4, 1/(√23-4) = (√23+4)/7 = 1 + (√23-3)/7
67
* $a_1$ = 1, 7/(√23-3) = 7(√23+3)/14 = 3 + (√23-3)/2
68
* $a_2$ = 3, 2/(√23-3) = 2(√23+3)/14 = 1 + (√23-4)/7
69
* $a_3$ = 1, 7/(√23-4) = 7(√23+4)/7 = 8 + (√23-4)
70
* $a_4$ = 8, 1/(√23-4) = (√23+4)/7 = 1 + (√23-3)/7
71
* $a_5$ = 1, 7/(√23-3) = 7(√23+3)/14 = 3 + (√23-3)/2
72
* $a_6$ = 3, 2/(√23-3) = 2(√23+3)/14 = 1 + (√23-4)/7
73
* $a_7$ = 1, 7/(√23-4) = 7(√23+4)/7 = 8 + (√23-4)
74 1 Noppi
75
よって, この操作は繰り返しになることが分かる. 表記を簡潔にするために, √23 = [4;(1,3,1,8)]と表す. (1,3,1,8)のブロックは無限に繰り返される項を表している.
76
77
最初の10個の無理数である平方根を連分数で表すと以下になる.
78
79
* √2=[1;(2)], period=1
80
* √3=[1;(1,2)], period=2
81
* √5=[2;(4)], period=1
82
* √6=[2;(2,4)], period=2
83
* √7=[2;(1,1,1,4)], period=4
84
* √8=[2;(1,4)], period=2
85
* √10=[3;(6)], period=1
86
* √11=[3;(3,6)], period=2
87
* √12= [3;(2,6)], period=2
88
* √13=[3;(1,1,1,1,6)], period=5
89
90
N ≤ 13で奇数の周期をもつ平方根は丁度4つある.
91
92
N ≤ 10000 について奇数の周期をもつ平方根が何個あるか答えよ.
93
94
```scheme
95 3 Noppi
(import (scheme base)
96
        (gauche base)
97
        (util match)
98
        (scheme inexact))
99
100
;;; a + (√b - c) / d → (a b c d)
101
;;;
102
;;; (√b - c) / d を有理化する →
103
;;; (d * (√b + c)) / (b - c^2)
104
;;;
105
;;; d / (b - c^2) を既約分数にして 1/q と置く →
106
;;; (√b + c) / q
107
(define (next-fraction lis)
108
  (assume (= (length lis) 4))
109
  (match-let1 (a b c d)
110
              lis
111
              (let-values ([(isqrt-b _) (exact-integer-sqrt b)])
112
                (if (<= d (- (sqrt b) c))
113
                  `(,(+ a (* d isqrt-b)) ,b ,(+ c isqrt-b) ,d)
114
                  (let* ([temp-frac (/ d
115
                                       (- b
116
                                          (* c c)))]
117
                         [q (denominator temp-frac)]
118
                         [next-a (div (+ isqrt-b
119
                                         c)
120
                                      q)]
121
                         [next-b b]
122
                         [next-c (- (* q next-a) c)]
123
                         [next-d q])
124
                    `(,next-a ,next-b ,next-c ,next-d))))))
125
126
(define (continued-fraction-list num)
127
  (assume (exact-integer? num))
128
  (assume (<= 2 num))
129
  (let* ([first-fraction (next-fraction `(0 ,num 0 1))]
130
         [first-int (car first-fraction)]
131
         [end-fraction (next-fraction first-fraction)]
132
         [result `(,(car end-fraction) ,first-int)])
133
    (let loop ([current-fraction (next-fraction end-fraction)]
134
               [result result])
135
      (if (equal? current-fraction end-fraction)
136
        (reverse result)
137
        (loop (next-fraction current-fraction)
138
              (cons (car current-fraction) result))))))
139
140
(define (non-square-num-list num)
141
  (filter (^n
142
            (let-values ([(_ b) (exact-integer-sqrt n)])
143
              (not (zero? b))))
144
          (iota (- num 1) 2)))
145
146
(define answer-64
147
  (length
148
    (filter (^[lis]
149
              (even? (length lis)))
150
            (map (^n
151
                   (continued-fraction-list n))
152
                 (non-square-num-list 10000)))))
153
154
(format #t "64: ~d~%" answer-64)
155 1 Noppi
```