From 9f46b534e91523b79e118245ae6f6af76dccb81c Mon Sep 17 00:00:00 2001 From: Eric Mertens Date: Tue, 15 Apr 2008 01:00:37 -0700 Subject: [PATCH 1/2] export in random.blum-blum-shub --- extra/project-euler/164/164.factor | 2 +- extra/random/blum-blum-shub/blum-blum-shub.factor | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/extra/project-euler/164/164.factor b/extra/project-euler/164/164.factor index 67397593bd..bf1f5dcf9b 100644 --- a/extra/project-euler/164/164.factor +++ b/extra/project-euler/164/164.factor @@ -30,4 +30,4 @@ IN: project-euler.164 PRIVATE> : euler164 ( -- n ) - init-table 19 [ next-table ] times values sum ; \ No newline at end of file + init-table 19 [ next-table ] times values sum ; diff --git a/extra/random/blum-blum-shub/blum-blum-shub.factor b/extra/random/blum-blum-shub/blum-blum-shub.factor index db8fe540e5..e60990075c 100755 --- a/extra/random/blum-blum-shub/blum-blum-shub.factor +++ b/extra/random/blum-blum-shub/blum-blum-shub.factor @@ -12,17 +12,16 @@ TUPLE: blum-blum-shub x n ; : generate-bbs-primes ( numbits -- p q ) [ [ random-prime ] curry [ 4 mod 3 = ] generate ] dup bi ; +: next-bbs-bit ( bbs -- bit ) + [ [ x>> 2 ] [ n>> ] bi ^mod dup ] keep (>>x) 1 bitand ; + +PRIVATE> + : ( numbits -- blum-blum-shub ) generate-bbs-primes * [ find-relative-prime ] keep blum-blum-shub boa ; -: next-bbs-bit ( bbs -- bit ) - [ [ x>> 2 ] [ n>> ] bi ^mod ] keep - over >>x drop 1 bitand ; - -PRIVATE> - M: blum-blum-shub random-32* ( bbs -- r ) 0 32 rot [ next-bbs-bit swap 1 shift bitor ] curry times ; From 8d0fdd365128dc62da34790f58eb67ee9eb52c5f Mon Sep 17 00:00:00 2001 From: Eric Mertens Date: Tue, 15 Apr 2008 18:04:30 -0700 Subject: [PATCH 2/2] Add project-euler solution no. 76 --- extra/project-euler/076/076.factor | 53 ++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 extra/project-euler/076/076.factor diff --git a/extra/project-euler/076/076.factor b/extra/project-euler/076/076.factor new file mode 100644 index 0000000000..b09a2742c3 --- /dev/null +++ b/extra/project-euler/076/076.factor @@ -0,0 +1,53 @@ +! Copyright (c) 2008 Eric Mertens +! See http://factorcode.org/license.txt for BSD license. +USING: arrays assocs combinators kernel math sequences math.ranges locals ; +IN: project-euler.076 + +! http://projecteuler.net/index.php?section=problems&id=76 + +! DESCRIPTION +! ----------- + +! How many different ways can one hundred be written as a +! sum of at least two positive integers? + +! SOLUTION +! -------- + +! This solution uses dynamic programming and the following +! recurence relation: + +! ways(0,_) = 1 +! ways(_,0) = 0 +! ways(n,i) = ways(n-i,i) + ways(n,i-1) + +assoc + 1 { 0 0 } pick set-at ; + +: use ( n i -- n i ) + [ - dup ] keep min ; inline + +: ways ( n i table -- ) + over zero? [ + 3drop + ] [ + [ [ 1- 2array ] dip at ] + [ [ use 2array ] dip at + ] + [ [ 2array ] dip set-at ] 3tri + ] if ; + +:: each-subproblem ( n quot -- ) + n [1,b] [ dup [1,b] quot with each ] each ; inline + +PRIVATE> + +: (euler076) ( n -- m ) + dup init + [ [ ways ] curry each-subproblem ] + [ [ dup 2array ] dip at 1- ] 2bi ; + +: euler076 ( -- m ) + 100 (euler076) ;