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* ; 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 } 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 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 ; 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 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