Sorry, forgot to post the following to the users list.

Hi,
count partitions, much faster and exact.
You may want to put the hash or part of it within function p such as to
avoid spllling much memory.
Jos

#lang racket

(require math/number-theory)

(define p-hash (make-hash '((0 . 1))))

(define (p n)
 (hash-ref! p-hash n
  (λ ()
   (+
    (let loop ((k 1) (m (sub1 n)) (s 0))
     (if (< m 0) s
      (loop (add1 k) (- m (add1 (* 3 k))) (if (odd? k) (+ s (p m)) (- s (p
m))))))
    (let loop ((k -1) (m (- n 2)) (s 0))
      (if (< m 0) s
       (loop (sub1 k) (+ m (* 3 k) -2) (if (odd? k) (+ s (p m)) (- s (p
m))))))))))

(time (for ((n (in-range 0 1000))) (p n)))
(time (for ((n (in-range 0 1000))) (partitions n)))
(void (time (p 10000)))

(for/and ((n (in-range 0 1000))) (= (partitions n) (p n)))

(read-line)

; results with racket:
; cpu time: 16 real time: 16 gc time: 0
; cpu time: 8845 real time: 8845 gc time: 111
; cpu time: 577 real time: 578 gc time: 0
; #t



____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to