私は Project Euler の問題のリストをゆっくりと調べていて、解決方法を知っている問題にたどり着きましたが、それはできないようです (私の解決策が書かれた方法を考えると)。
私はこれを行うために Common Lisp を使用しており、私のスクリプトは 24 時間以上実行されています (1 分間の目標をはるかに超えています)。
簡潔にするために、これが私の解決策です(ネタバレですが、非常に高速なプロセッサを持っている場合のみ):
(defun square? (num)
(if (integerp (sqrt num)) T))
(defun factors (num)
(let ((l '()))
(do ((current 1 (1+ current)))
((> current (/ num current)))
(if (= 0 (mod num current))
(if (= current (/ num current))
(setf l (append l (list current)))
(setf l (append l (list current (/ num current)))))))
(sort l #'< )))
(defun o_2 (n)
(reduce #'+ (mapcar (lambda (x) (* x x)) (factors n))))
(defun sum-divisor-squares (limit)
(loop for i from 1 to limit when (square? (o_2 i)) summing i))
(defun euler-211 ()
(sum-divisor-squares 64000000))
より小さく、より親しみやすいテスト引数を使用して問題を解決するのに必要な時間は、指数関数的よりも大きくなるようです...これは実際の問題です。
それは取った:
- 100 を解くのに 0.007 秒
- 1000 を解くのに 0.107 秒
- 10000 を解くのに 2.020 秒
- 100000 を解くのに 56.61 秒
- 1000000 を解くのに 1835.385 秒
- 64000000 の解決に 24 時間以上
スクリプトのどの部分が非常に時間がかかる原因になっているのかを突き止めようとしています。因子関数をメモ化することについていくつか考えましたが、実際にそれを実装する方法について途方に暮れています。
問題自体を調べたい人は、ここにあります。
このことをより速くする方法についてのアイデアは大歓迎です。
**スポイラーである場合は申し訳ありませんが、意図したものではありません....しかし、これを適切な時間で実行するための計算能力があれば、より多くのパワーが得られます.