Merge branch 'master' of git://projects.elasticdog.com/git/factor

db4
Slava Pestov 2009-04-08 04:47:51 -05:00
commit 05b915f8af
6 changed files with 113 additions and 23 deletions

View File

@ -17,9 +17,6 @@ IN: project-euler.007
! SOLUTION
! --------
: nth-prime ( n -- n )
1- lprimes lnth ;
: euler007 ( -- answer )
10001 nth-prime ;

View File

@ -0,0 +1,4 @@
USING: project-euler.069 tools.test ;
{ 510510 } [ euler069 ] unit-test
{ 510510 } [ euler069a ] unit-test

View File

@ -0,0 +1,87 @@
! Copyright (c) 2009 Aaron Schaefer.
! See http://factorcode.org/license.txt for BSD license.
USING: combinators fry kernel math math.primes math.primes.factors math.ranges
project-euler.common sequences ;
IN: project-euler.069
! http://projecteuler.net/index.php?section=problems&id=69
! DESCRIPTION
! -----------
! Euler's Totient function, φ(n) [sometimes called the phi function], is used
! to determine the number of numbers less than n which are relatively prime to
! n. For example, as 1, 2, 4, 5, 7, and 8, are all less than nine and
! relatively prime to nine, φ(9)=6.
! +----+------------------+------+-----------+
! | n | Relatively Prime | φ(n) | n / φ(n) |
! +----+------------------+------+-----------+
! | 2 | 1 | 1 | 2 |
! | 3 | 1,2 | 2 | 1.5 |
! | 4 | 1,3 | 2 | 2 |
! | 5 | 1,2,3,4 | 4 | 1.25 |
! | 6 | 1,5 | 2 | 3 |
! | 7 | 1,2,3,4,5,6 | 6 | 1.1666... |
! | 8 | 1,3,5,7 | 4 | 2 |
! | 9 | 1,2,4,5,7,8 | 6 | 1.5 |
! | 10 | 1,3,7,9 | 4 | 2.5 |
! +----+------------------+------+-----------+
! It can be seen that n = 6 produces a maximum n / φ(n) for n ≤ 10.
! Find the value of n ≤ 1,000,000 for which n / φ(n) is a maximum.
! SOLUTION
! --------
! Brute force
<PRIVATE
: totient-ratio ( n -- m )
dup totient / ;
PRIVATE>
: euler069 ( -- answer )
2 1000000 [a,b] [ totient-ratio ] map
[ supremum ] keep index 2 + ;
! [ euler069 ] 10 ave-time
! 25210 ms ave run time - 115.37 SD (10 trials)
! ALTERNATE SOLUTIONS
! -------------------
! In order to obtain maximum n / φ(n), φ(n) needs to be low and n needs to be
! high. Hence we need a number that has the most factors. A number with the
! most unique factors would have fewer relatively prime.
<PRIVATE
: primorial ( n -- m )
{
{ [ dup 0 = ] [ drop V{ 1 } ] }
{ [ dup 1 = ] [ drop V{ 2 } ] }
[ nth-prime primes-upto ]
} cond product ;
: (primorial-upto) ( count limit -- m )
'[ dup primorial _ <= ] [ 1+ dup primorial ] produce
nip penultimate ;
: primorial-upto ( limit -- m )
1 swap (primorial-upto) ;
PRIVATE>
: euler069a ( -- answer )
1000000 primorial-upto ;
! [ euler069a ] 100 ave-time
! 0 ms ave run time - 0.01 SD (100 trials)
SOLUTION: euler069a

View File

@ -32,13 +32,6 @@ IN: project-euler.071
! repeatedly until the denominator is as close to 1000000 as possible without
! going over.
<PRIVATE
: penultimate ( seq -- elt )
dup length 2 - swap nth ;
PRIVATE>
: euler071 ( -- answer )
2/5 [ dup denominator 1000000 <= ] [ 3/7 mediant dup ] produce
nip penultimate numerator ;

View File

@ -1,9 +1,10 @@
! Copyright (c) 2007-2008 Aaron Schaefer.
! Copyright (c) 2007-2009 Aaron Schaefer.
! See http://factorcode.org/license.txt for BSD license.
USING: arrays kernel make math math.functions math.matrices math.miller-rabin
math.order math.parser math.primes.factors math.ranges math.ratios
sequences sorting strings unicode.case parser accessors vocabs.parser
namespaces vocabs words quotations prettyprint ;
USING: accessors arrays kernel lists make math math.functions math.matrices
math.miller-rabin math.order math.parser math.primes.factors
math.primes.lists math.ranges math.ratios namespaces parser prettyprint
quotations sequences sorting strings unicode.case vocabs vocabs.parser
words ;
IN: project-euler.common
! A collection of words used by more than one Project Euler solution
@ -16,11 +17,13 @@ IN: project-euler.common
! log10 - #25, #134
! max-path - #18, #67
! mediant - #71, #73
! nth-prime - #7, #69
! nth-triangle - #12, #42
! number>digits - #16, #20, #30, #34, #35, #38, #43, #52, #55, #56, #92
! palindrome? - #4, #36, #55
! pandigital? - #32, #38
! pentagonal? - #44, #45
! penultimate - #69, #71
! propagate-all - #18, #67
! sum-proper-divisors - #21
! tau* - #12
@ -78,6 +81,9 @@ PRIVATE>
: number-length ( n -- m )
log10 floor 1+ >integer ;
: nth-prime ( n -- n )
1- lprimes lnth ;
: nth-triangle ( n -- n )
dup 1+ * 2 / ;
@ -90,6 +96,9 @@ PRIVATE>
: pentagonal? ( n -- ? )
dup 0 > [ 24 * 1+ sqrt 1+ 6 / 1 mod zero? ] [ drop f ] if ;
: penultimate ( seq -- elt )
dup length 2 - swap nth ;
! Not strictly needed, but it is nice to be able to dump the triangle after the
! propagation
: propagate-all ( triangle -- new-triangle )

View File

@ -1,4 +1,4 @@
! Copyright (c) 2007, 2008, 2009 Aaron Schaefer, Samuel Tardieu.
! Copyright (c) 2007-2009 Aaron Schaefer, Samuel Tardieu.
! See http://factorcode.org/license.txt for BSD license.
USING: definitions io io.files io.pathnames kernel math math.parser
prettyprint project-euler.ave-time sequences vocabs vocabs.loader
@ -16,13 +16,13 @@ USING: definitions io io.files io.pathnames kernel math math.parser
project-euler.045 project-euler.046 project-euler.047 project-euler.048
project-euler.049 project-euler.052 project-euler.053 project-euler.054
project-euler.055 project-euler.056 project-euler.057 project-euler.058
project-euler.059 project-euler.063 project-euler.067 project-euler.071
project-euler.073 project-euler.075 project-euler.076 project-euler.079
project-euler.092 project-euler.097 project-euler.099 project-euler.100
project-euler.116 project-euler.117 project-euler.134 project-euler.148
project-euler.150 project-euler.151 project-euler.164 project-euler.169
project-euler.173 project-euler.175 project-euler.186 project-euler.190
project-euler.203 project-euler.215 ;
project-euler.059 project-euler.063 project-euler.067 project-euler.069
project-euler.071 project-euler.073 project-euler.075 project-euler.076
project-euler.079 project-euler.092 project-euler.097 project-euler.099
project-euler.100 project-euler.116 project-euler.117 project-euler.134
project-euler.148 project-euler.150 project-euler.151 project-euler.164
project-euler.169 project-euler.173 project-euler.175 project-euler.186
project-euler.190 project-euler.203 project-euler.215 ;
IN: project-euler
<PRIVATE