From f9dacfb16beacf534665174afcf1e63fd4b06ce4 Mon Sep 17 00:00:00 2001 From: Doug Coleman Date: Fri, 26 Dec 2008 17:13:20 -0600 Subject: [PATCH 1/6] more docs for pathnames --- core/io/pathnames/pathnames-docs.factor | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/io/pathnames/pathnames-docs.factor b/core/io/pathnames/pathnames-docs.factor index 020911e61f..a4f261391a 100644 --- a/core/io/pathnames/pathnames-docs.factor +++ b/core/io/pathnames/pathnames-docs.factor @@ -65,8 +65,15 @@ HELP: home { $values { "dir" string } } { $description "Outputs the user's home directory." } ; +ARTICLE: "pathname-normalization" "Pathname normalization" +"Words that take a pathname should normalize the pathname by calling " { $link normalize-path } ".When normalizing a pathname, the input pathname is either absolute or relative to the " { $link current-directory } ". If absolute, such as the root directories " { $snippet "/" } " or " { $snippet "c:\\" } ", the pathname is left alone, while if relative, the current directory is prepended to the pathname. If a pathname begins with the magic string " { $snippet "resource:" } ", this string is replaced with the Factor directory. On Windows, all pathnames, absolute and relative, are converted to Unicode pathamess." ; + ARTICLE: "io.pathnames" "Pathname manipulation" +{ $subsection "pathname-normalization" } +"Literal pathnames:" +{ $subsection POSTPONE: P" } "Pathname manipulation:" +{ $subsection normalize-path } { $subsection parent-directory } { $subsection file-name } { $subsection last-path-separator } From 0182a3430d00a2746fdd577b3d2345ea6b8b5c5b Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Sat, 27 Dec 2008 21:39:32 +0100 Subject: [PATCH 2/6] Allow sigma and friends to use the stack "sigma" used to use the stack to remember the current total. This prevented the use of quotations manipulating elements that were expecting to be on the stack. This patch hides the counter while executing the quotation, so that the latter can fully use the stack. --- core/sequences/sequences.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/sequences/sequences.factor b/core/sequences/sequences.factor index 31c7c8a4d7..40a8892e8b 100644 --- a/core/sequences/sequences.factor +++ b/core/sequences/sequences.factor @@ -828,7 +828,7 @@ PRIVATE> : supremum ( seq -- n ) dup first [ max ] reduce ; -: sigma ( seq quot -- n ) [ + ] compose 0 swap reduce ; inline +: sigma ( seq quot -- n ) 0 -rot [ rot slip + ] curry each ; inline : count ( seq quot -- n ) [ 1 0 ? ] compose sigma ; inline From 3fbb9f708179acf6f796c0be89062d9118565676 Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Sat, 27 Dec 2008 21:46:01 +0100 Subject: [PATCH 3/6] Project Euler - problem 57 --- extra/project-euler/057/057.factor | 43 ++++++++++++++++++++++++ extra/project-euler/project-euler.factor | 14 ++++---- 2 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 extra/project-euler/057/057.factor diff --git a/extra/project-euler/057/057.factor b/extra/project-euler/057/057.factor new file mode 100644 index 0000000000..53240b0ec1 --- /dev/null +++ b/extra/project-euler/057/057.factor @@ -0,0 +1,43 @@ +! Copyright (c) 2008 Samuel Tardieu +! See http://factorcode.org/license.txt for BSD license. +USING: kernel math math.functions math.parser sequences ; +IN: project-euler.057 + +! http://projecteuler.net/index.php?section=problems&id=57 + +! DESCRIPTION +! ----------- + +! It is possible to show that the square root of two can be expressed +! as an infinite continued fraction. + +! √ 2 = 1 + 1/(2 + 1/(2 + 1/(2 + ... ))) = 1.414213... + +! By expanding this for the first four iterations, we get: + +! 1 + 1/2 = 3/2 = 1.5 +! 1 + 1/(2 + 1/2) = 7/5 = 1.4 +! 1 + 1/(2 + 1/(2 + 1/2)) = 17/12 = 1.41666... +! 1 + 1/(2 + 1/(2 + 1/(2 + 1/2))) = 41/29 = 1.41379... + +! The next three expansions are 99/70, 239/169, and 577/408, but the +! eighth expansion, 1393/985, is the first example where the number of +! digits in the numerator exceeds the number of digits in the +! denominator. + +! In the first one-thousand expansions, how many fractions contain a +! numerator with more digits than denominator? + +! SOLUTION +! -------- + +: longer-numerator? ( seq -- ? ) + >fraction [ number>string length ] bi@ > ; inline + +: euler057 ( -- answer ) + 0 1000 [ drop 2 + recip dup 1+ longer-numerator? ] count nip ; + +! [ euler057 ] time +! 3.375118 seconds + +MAIN: euler057 diff --git a/extra/project-euler/project-euler.factor b/extra/project-euler/project-euler.factor index f9fa0f4f18..318cf8a2bb 100644 --- a/extra/project-euler/project-euler.factor +++ b/extra/project-euler/project-euler.factor @@ -15,13 +15,13 @@ USING: definitions io io.files io.pathnames kernel math math.parser project-euler.041 project-euler.042 project-euler.043 project-euler.044 project-euler.045 project-euler.046 project-euler.047 project-euler.048 project-euler.052 project-euler.053 project-euler.055 project-euler.056 - project-euler.059 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.057 project-euler.059 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 ; IN: project-euler Date: Sat, 27 Dec 2008 23:13:03 +0100 Subject: [PATCH 4/6] Remove useless with-scope and unneeded uses --- basis/math/miller-rabin/miller-rabin.factor | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/basis/math/miller-rabin/miller-rabin.factor b/basis/math/miller-rabin/miller-rabin.factor index 374616ba40..8c237d0dc3 100755 --- a/basis/math/miller-rabin/miller-rabin.factor +++ b/basis/math/miller-rabin/miller-rabin.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2008 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. -USING: combinators io locals kernel math math.functions -math.ranges namespaces random sequences hashtables sets ; +USING: combinators kernel locals math math.functions math.ranges +random sequences sets ; IN: math.miller-rabin { [ dup 1 <= ] [ 3drop f ] } { [ dup 2 = ] [ 3drop t ] } { [ dup even? ] [ 3drop f ] } - [ [ drop (miller-rabin) ] with-scope ] + [ drop (miller-rabin) ] } cond ; : miller-rabin ( n -- ? ) 10 miller-rabin* ; From a843113326ec49f81f6fa7874e21c49a24899ba7 Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Sun, 28 Dec 2008 11:43:13 +0100 Subject: [PATCH 5/6] Optimize erato sieve We started crossing the numbers at 3*n, while we can start at n^2. --- extra/math/primes/erato/erato.factor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extra/math/primes/erato/erato.factor b/extra/math/primes/erato/erato.factor index f4409038bb..effcd7b135 100644 --- a/extra/math/primes/erato/erato.factor +++ b/extra/math/primes/erato/erato.factor @@ -8,7 +8,7 @@ IN: math.primes.erato 2 * 3 + ; inline : mark-multiples ( i arr -- ) - [ dup index> [ + ] keep ] dip + [ index> [ sq >index ] keep ] dip [ length 1 - swap f swap ] keep [ set-nth ] curry with each ; From ca0f3659e4f7fab7503e6b26c79211245f2b4b8f Mon Sep 17 00:00:00 2001 From: Samuel Tardieu Date: Sun, 28 Dec 2008 11:43:13 +0100 Subject: [PATCH 6/6] Optimize primes-between Rather than having primes-between return a slice of primes-upto, make primes-upto use primes-between. Also, those two words cannot be marked as foldable as their output is mutable. --- extra/math/primes/primes.factor | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/extra/math/primes/primes.factor b/extra/math/primes/primes.factor index c8f398863f..fa42d7385a 100644 --- a/extra/math/primes/primes.factor +++ b/extra/math/primes/primes.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2007 Samuel Tardieu. ! See http://factorcode.org/license.txt for BSD license. -USING: binary-search combinators kernel lists.lazy math math.functions -math.miller-rabin math.primes.erato math.ranges sequences ; +USING: combinators kernel lists.lazy math math.functions +math.miller-rabin math.order math.primes.erato math.ranges sequences ; IN: math.primes : lprimes-from ( n -- list ) dup 3 < [ drop lprimes ] [ 1- next-prime [ next-prime ] lfrom-by ] if ; -: primes-upto ( n -- seq ) - dup 2 < [ - drop V{ } - ] [ - 3 swap 2 [ prime? ] filter 2 prefix - ] if ; foldable - : primes-between ( low high -- seq ) - primes-upto [ 1- next-prime ] dip - [ natural-search drop ] [ length ] [ ] tri ; foldable + [ dup 3 max dup even? [ 1 + ] when ] dip + 2 [ prime? ] filter + swap 3 < [ 2 prefix ] when ; + +: primes-upto ( n -- seq ) 2 swap primes-between ; : coprime? ( a b -- ? ) gcd nip 1 = ; foldable