현재 ProjectEuler 사이트의 일부 문제를 해결하여 LISP를 배우고 있습니다. 13,195있는 5, 7, 13, 29프라임 팩터가 너무 느리거나 충돌이 발생했습니다.
번호 600851475143의 가장 큰 주요 요인은 무엇입니까의
소인수 : 문제 중 하나는이 요청?
이 작업을 수행하는 Lisp 코드를 함께 스크랩했습니다. 그러나 9 자리 이상의 숫자의 경우 매우 느립니다. 대부분의 경우 솔루션을 얻지 못했지만 8 자리 숫자는 약 4-5 초가 걸렸습니다. 더 많은 것은 인 무엇, 때때로 나는 "HEAP 초과했다"과실을 얻는다.
내 질문에 내가 코드를 실행하는 측면에서 뭔가 잘못하고 있는거야 (Aquamacs 사용)? 이 코드를 현재 작업에 더 잘 맞도록 최적화 할 수있는 방법은 무엇입니까? 더 중요한 것은, "초과 힙"충돌을 피할 수있는 방법은 무엇입니까?
코드 :
(defun potential-factors (number)
(loop for x from 1 to (ceiling (/ number 2))
for y = x
collect y))
(defun factors (number)
(let (prime-factors '())
(loop for x in (potential-factors number)
do (if (= (mod number x) 0)
(setq prime-factors (cons x prime-factors))))
prime-factors))
(defun is-prime (n &optional (d (- n 1)))
(if (/= n 1)
(or (= d 1)
(and (/= (rem n d) 0)
(is-prime n (- d 1))))()))
(defun problem-3 (number)
(last (sort (remove-if-not #'is-prime (factors number) :from-end t) #'<)))
구글 "소수의 목록을 만드는 방법 에라 토 스테 네스의 시브 (Sieve of Eratosthenes)". 그렇다면 각 잠재 요인에 대해 이러한 값 비싼 검색을 수행 할 필요가 없습니다. – Barmar
@Barmar 매우 좋습니다! 고맙습니다! – MadPhysicist