<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ks_c_5601-1987">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7036.0">
<TITLE>RE: [racket] FW: q about code for partitions</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/rtf format -->

<P><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">I timed a version unrolling the loops for even and odd k. I see no speed up.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">Just to let you know.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">Jos</FONT></SPAN>
</P>
<BR>

<P><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> -----Original Message-----</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> From: Matthew Flatt [</FONT></SPAN><A HREF="mailto:mflatt@cs.utah.edu"><SPAN LANG="es"><U><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">mailto:mflatt@cs.utah.edu</FONT></U></SPAN></A><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">] </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> Sent: domingo, 29 de junio de 2014 8:47</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> To: Jens Axel S©ªgaard</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> Cc: Jos Koot; Racket Users List</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> Subject: Re: [racket] FW: q about code for partitions</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> It looks like "partitions2.rkt" ends up calling a contract-wrapped</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> variant of `exact-zero?`. If I change `ref!` to</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">>  (define (ref! n thnk)</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">>    (let ([v (vector-ref cache n)])</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">>      (if (zero? v)</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">>          (let ([new-v (thnk)])</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">>            (vector-set! cache n new-v)</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">>            new-v)</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">>          v)))</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> then "partitions2.rkt" is much faster.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> At Sat, 28 Jun 2014 12:06:34 +0200, Jens Axel S©ªgaard wrote:</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > Hi,</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > I have converted your code to Typed Racket and made two versions.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > The first version use a hash as cache and the second </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> version us a vector.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > Timings show that the vector version is 1.5 to 2 times </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> slower than the</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > hash version.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > I don't understand this. Is there anything that can be done </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> to improve it?</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > The two versions can be seen here in color:</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> >     </FONT></SPAN><A HREF="http://pasterack.org/pastes/12166"><SPAN LANG="es"><U><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">http://pasterack.org/pastes/12166</FONT></U></SPAN></A><SPAN LANG="es"></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> >     </FONT></SPAN><A HREF="http://pasterack.org/pastes/16085"><SPAN LANG="es"><U><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">http://pasterack.org/pastes/16085</FONT></U></SPAN></A><SPAN LANG="es"></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > They are also attached.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > I used (time (begin (partitions 50000) 0)) as benchmark.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > 2014-06-28 9:54 GMT+02:00 Jos Koot <jos.koot@gmail.com>:</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > Sorry, forgot to post the following to the users list.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > ></FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > Hi,</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > count partitions, much faster and exact.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > You may want to put the hash or part of it within </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> function p such as to</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > avoid spllling much memory.</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > Jos</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > ></FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > #lang racket</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > ></FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > (require math/number-theory)</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > ></FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > (define p-hash (make-hash '((0 . 1))))</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > ></FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > (define (p n)</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > >  (hash-ref! p-hash n</FONT></SPAN>

<BR><SPAN LANG="el"><FONT SIZE=2 FACE="Courier New Greek">> > >   (¥ë ()</FONT></SPAN><SPAN LANG="es"></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > >    (+</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > >     (let loop ((k 1) (m (sub1 n)) (s 0))</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > >      (if (< m 0) s</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > >       (loop (add1 k) (- m (add1 (* 3 k))) (if (odd? k) (+ </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> s (p m)) (- s (p</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > m))))))</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > >     (let loop ((k -1) (m (- n 2)) (s 0))</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > >       (if (< m 0) s</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > >        (loop (sub1 k) (+ m (* 3 k) -2) (if (odd? k) (+ s </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> (p m)) (- s (p</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > m))))))))))</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > ></FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > (time (for ((n (in-range 0 1000))) (p n)))</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > (time (for ((n (in-range 0 1000))) (partitions n)))</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > (void (time (p 10000)))</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > ></FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > (for/and ((n (in-range 0 1000))) (= (partitions n) (p n)))</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > ></FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > (read-line)</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > ></FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > ; results with racket:</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > ; cpu time: 16 real time: 16 gc time: 0</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > ; cpu time: 8845 real time: 8845 gc time: 111</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > ; cpu time: 577 real time: 578 gc time: 0</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > ; #t</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > ></FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > ></FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > ></FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > > ____________________</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > >   Racket Users list:</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > >   </FONT></SPAN><A HREF="http://lists.racket-lang.org/users"><SPAN LANG="es"><U><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">http://lists.racket-lang.org/users</FONT></U></SPAN></A><SPAN LANG="es"></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > -- </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > --</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > Jens Axel S©ªgaard</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> --------------------------------------------------------------</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> ----------------</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > [application/octet-stream "partitions2.rkt"] [~/Desktop & </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> open] [~/Temp & open]</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> --------------------------------------------------------------</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> ----------------</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > [application/octet-stream "partitions1.rkt"] [~/Desktop & </FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> open] [~/Temp & open]</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> > ____________________</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> >   Racket Users list:</FONT></SPAN>

<BR><SPAN LANG="es"><FONT SIZE=2 FACE="Courier New">> >   </FONT></SPAN><A HREF="http://lists.racket-lang.org/users"><SPAN LANG="es"><U><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">http://lists.racket-lang.org/users</FONT></U></SPAN></A><SPAN LANG="es"></SPAN>
</P>

</BODY>
</HTML>