プロジェクト

全般

プロフィール

Problem 66 » 履歴 » リビジョン 3

リビジョン 2 (Noppi, 2024/01/29 06:06) → リビジョン 3/4 (Noppi, 2024/01/29 06:09)

[ホーム](https://redmine.noppi.jp) - [[Wiki|Project Euler]] 
 # [[Problem 66]] 

 ## Diophantine Equation 
 Consider quadratic Diophantine equations of the form: 

 $$x^2 - Dy^2 = 1$$ 

 For example, when $D=13$, the minimal solution in $x$ is $649^2 - 13 \times 180^2 = 1$. 

 It can be assumed that there are no solutions in positive integers when $D$ is square. 

 <p>By finding minimal solutions in $x$ for $D = \{2, 3, 5, 6, 7\}$, we obtain the following:</p> 
 \begin{align} 
 3^2 - 2 \times 2^2 &amp;= 1\\ 
 2^2 - 3 \times 1^2 &amp;= 1\\ 
 {\color{red}{\mathbf 9}}^2 - 5 \times 4^2 &amp;= 1\\ 
 5^2 - 6 \times 2^2 &amp;= 1\\ 
 8^2 - 7 \times 3^2 &amp;= 1 
 \end{align} 

 Hence, by considering minimal solutions in $x$ for $D \le 7$, the largest $x$ is obtained when $D=5$. 

 Find the value of $D \le 1000$ in minimal solutions of $x$ for which the largest value of $x$ is obtained. 

 ## ディオファントス方程式 
 次の形式の, 2次のディオファントス方程式を考えよう: 

 $$x^2 - Dy^2 = 1$$ 

 たとえば D=13 のとき, x を最小にする解は 6492 - 131802 = 1 である. 

 D が平方数(square)のとき, 正整数のなかに解は存在しないと考えられる. 

 <p>D = {2, 3, 5, 6, 7} に対して x を最小にする解は次のようになる: 
 \begin{align} 
 3^2 - 2 \times 2^2 &amp;= 1\\ 
 2^2 - 3 \times 1^2 &amp;= 1\\ 
 {\color{red}{\mathbf 9}}^2 - 5 \times 4^2 &amp;= 1\\ 
 5^2 - 6 \times 2^2 &amp;= 1\\ 
 8^2 - 7 \times 3^2 &amp;= 1 
 \end{align} 
 </p> 

 したがって, D ≤ 7 に対して x を最小にする解を考えると, D=5 のとき x は最大である. 

 D ≤ 1000 に対する x を最小にする解で, x が最大になるような D の値を見つけよ. 

 ```scheme 
 ;;; 素直なアルゴリズムで書いたら止まらなくなったので 
 ;;; このやり方は使えない 

 (import (scheme base) 
         (gauche base)) 

 (define (d-list) 
   (filter (^n 
             (let-values ([(_ b) (exact-integer-sqrt n)]) 
               (not (zero? b)))) 
           (iota 999 2))) 

 (define (diophantine d) 
   (let loop ([y 1]) 
     (let ([dy2 (* d (square y))]) 
       (let-values ([(x-1 dif) (exact-integer-sqrt dy2)]) 
         (if (zero? dif) 
           (loop (+ y 1)) 
           (let ([x (+ x-1 1)]) 
             (if (= (- (square x) 
                       dy2) 
                    1) 
               `(,x ,y . ,d) 
               (loop (+ y 1))))))))) 

 ;;; D = 109 の時に死んだので連分数展開を使用した方法に切り替える必要がある 
 ;;; ちなみに、D = 109 の時の x と y の値は次の通りらしい… 
 ;;; x = 158070671986249, y = 15140424455100 
 ;;; (see https://ja.wikipedia.org/wiki/%E3%83%9A%E3%83%AB%E6%96%B9%E7%A8%8B%E5%BC%8F) 
 (define (diophantine-1000) 
   (map (cut diophantine <>) 
        (d-list))) 

 (define answer-66) 

 (format #t "66: ~d~%" answer-66) 
 ```