/extra/project-euler/023/023.factor

http://github.com/abeaumont/factor · Factor · 58 lines · 16 code · 17 blank · 25 comment · 0 complexity · c1403af2f1d0fab354e07ad1c5f9539e MD5 · raw file

  1. ! Copyright (c) 2008 Aaron Schaefer.
  2. ! See http://factorcode.org/license.txt for BSD license.
  3. USING: kernel math math.ranges project-euler.common sequences sets sorting assocs fry ;
  4. IN: project-euler.023
  5. ! http://projecteuler.net/index.php?section=problems&id=23
  6. ! DESCRIPTION
  7. ! -----------
  8. ! A perfect number is a number for which the sum of its proper divisors is
  9. ! exactly equal to the number. For example, the sum of the proper divisors of
  10. ! 28 would be 1 + 2 + 4 + 7 + 14 = 28, which means that 28 is a perfect number.
  11. ! A number whose proper divisors are less than the number is called deficient
  12. ! and a number whose proper divisors exceed the number is called abundant.
  13. ! As 12 is the smallest abundant number, 1 + 2 + 3 + 4 + 6 = 16, the smallest
  14. ! number that can be written as the sum of two abundant numbers is 24. By
  15. ! mathematical analysis, it can be shown that all integers greater than 28123
  16. ! can be written as the sum of two abundant numbers. However, this upper limit
  17. ! cannot be reduced any further by analysis even though it is known that the
  18. ! greatest number that cannot be expressed as the sum of two abundant numbers
  19. ! is less than this limit.
  20. ! Find the sum of all the positive integers which cannot be written as the sum
  21. ! of two abundant numbers.
  22. ! SOLUTION
  23. ! --------
  24. ! The upper limit can be dropped to 20161 which reduces our search space
  25. ! and every even number > 46 can be expressed as a sum of two abundants
  26. <PRIVATE
  27. : source-023 ( -- seq )
  28. 46 [1,b] 47 20161 2 <range> append ;
  29. : abundants-upto ( n -- seq )
  30. [1,b] [ abundant? ] filter ;
  31. : possible-sums ( seq -- seq )
  32. H{ } clone
  33. [ dupd '[ _ [ + _ conjoin ] with each ] each ]
  34. keep keys ;
  35. PRIVATE>
  36. : euler023 ( -- answer )
  37. source-023
  38. 20161 abundants-upto possible-sums diff sum ;
  39. ! [ euler023 ] time
  40. ! 2.15542 seconds
  41. SOLUTION: euler023