003.scm 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. ;; https://projecteuler.net/problem=3
  2. ;; Largest prime factor
  3. ;; Problem 3
  4. ;; The prime factors of 13195 are 5, 7, 13 and 29.
  5. ;; What is the largest prime factor of the number 600851475143 ?
  6. (import
  7. (except (rnrs base) let-values)
  8. (only (guile)
  9. ;; lambda forms
  10. lambda* λ
  11. sqrt)
  12. (srfi srfi-1))
  13. (define even?
  14. (λ (num)
  15. (= (remainder num 2) 0)))
  16. (define divides?
  17. (λ (num div)
  18. (= (remainder num div) 0)))
  19. ;; The biggest potential factor of a number is at maximum
  20. ;; its square root. Since we are looking for integer
  21. ;; factors, we also floor the square root. If it is even, we
  22. ;; substract 1, because even numbers cannot be prime
  23. ;; factors, except for 2.
  24. (define biggest-potential-factor
  25. (λ (num)
  26. (let ([near-sqrt (inexact->exact (floor (sqrt num)))])
  27. (cond
  28. [(= near-sqrt 2) near-sqrt]
  29. [(even? near-sqrt) (- near-sqrt 1)]
  30. [else near-sqrt]))))
  31. (define prime?
  32. (λ (num)
  33. (if (= num 1)
  34. #f
  35. (= (biggest-prime-factor num) 1))))
  36. (define biggest-prime-factor
  37. (λ (num)
  38. (let iter ([fac (biggest-potential-factor num)])
  39. (cond
  40. ;; Stop looking for factors when reaching 1. This
  41. ;; prevents the search from going into negative
  42. ;; numbers towards negative infinity.
  43. [(= fac 1) 1]
  44. ;; If the number fac is really a factor of num and it
  45. ;; is prime, then that is the result.
  46. [(and (divides? num fac) (prime? fac)) fac]
  47. ;; 2 is the only even prime factor. If we reach 3, we
  48. ;; need to decrease by 1 only, so that we also test 2
  49. ;; as a prime factor.
  50. [(<= fac 3) (iter (- fac 1))]
  51. ;; Decrease by 2, to skip even numbers.
  52. [else (iter (- fac 2))]))))
  53. (simple-format
  54. (current-output-port)
  55. "~a\n"
  56. (biggest-prime-factor 600851475143))