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

62 lines
1.9 KiB
Factor
Raw Normal View History

! Copyright (c) 2008 Aaron Schaefer.
2008-01-02 18:57:57 -05:00
! See http://factorcode.org/license.txt for BSD license.
2008-10-30 22:04:44 -04:00
USING: kernel math math.ranges project-euler.common sequences sets sorting ;
2008-01-02 18:57:57 -05:00
IN: project-euler.023
! http://projecteuler.net/index.php?section=problems&id=23
! DESCRIPTION
! -----------
! A perfect number is a number for which the sum of its proper divisors is
! exactly equal to the number. For example, the sum of the proper divisors of
! 28 would be 1 + 2 + 4 + 7 + 14 = 28, which means that 28 is a perfect number.
! A number whose proper divisors are less than the number is called deficient
! and a number whose proper divisors exceed the number is called abundant.
! As 12 is the smallest abundant number, 1 + 2 + 3 + 4 + 6 = 16, the smallest
! number that can be written as the sum of two abundant numbers is 24. By
! mathematical analysis, it can be shown that all integers greater than 28123
! can be written as the sum of two abundant numbers. However, this upper limit
! cannot be reduced any further by analysis even though it is known that the
! greatest number that cannot be expressed as the sum of two abundant numbers
! is less than this limit.
! Find the sum of all the positive integers which cannot be written as the sum
! of two abundant numbers.
! SOLUTION
! --------
! The upper limit can be dropped to 20161 which reduces our search space
! and every even number > 46 can be expressed as a sum of two abundants
2008-01-03 01:49:46 -05:00
<PRIVATE
2008-01-02 18:57:57 -05:00
: source-023 ( -- seq )
46 [1,b] 47 20161 2 <range> append ;
2008-01-03 01:49:46 -05:00
: abundants-upto ( n -- seq )
[1,b] [ abundant? ] filter ;
2008-01-02 18:57:57 -05:00
: possible-sums ( seq -- seq )
dup { } -rot [
2008-01-03 01:49:46 -05:00
dupd [ + ] curry map
rot append prune swap rest
2008-01-02 18:57:57 -05:00
] each drop natural-sort ;
PRIVATE>
: euler023 ( -- answer )
source-023
20161 abundants-upto possible-sums diff sum ;
2008-01-03 01:49:46 -05:00
! TODO: solution is still too slow, although it takes under 1 minute
2008-01-02 18:57:57 -05:00
! [ euler023 ] time
! 52780 ms run / 3839 ms GC
MAIN: euler023