Thank you for the pointer to unchecked-remainder.  That runs much
better.

-B

On May 3, 6:23 pm, kaukeb <kau...@gmail.com> wrote:
> Using unchecked-remainder and adding a type declaration to the last
> constant keeps the primitives unboxed and improves performance by a
> factor of 6 for me. I couldn't say whether there's a reason rem and
> mod don't work like you'd expect here.
>
> (defn NF-mod-limit [p q limit]
>   (let [p (long p) q (long q) limit (long limit)]
>     (loop [n (long 0), nf (long 0), z (long 0), S (long 290797)]
>       (if (= n (inc q))
>         nf
>         (recur
>           (inc n)
>           (unchecked-remainder
>             (+ nf (* (unchecked-remainder S p) z))
>             limit)
>           (unchecked-remainder (inc (* p z)) limit)
>           (unchecked-remainder (* S S) (long 50515093)))))))
>
> On May 3, 1:21 pm, Brian Watkins <wildu...@gmail.com> wrote:
>
>
>
> > Any ideas about this?
>
> > On May 2, 1:44 am, Brian Watkins <wildu...@gmail.com> wrote:
>
> > > I'm trying to speed up computing terms of a simple recurrence where
> > > the terms are computed modulo some value each iteration,
>
> > > (defn NF-mod-limit [p q limit]
> > >  (loop [n 0, nf 0, z 0, S 290797]
> > >        (if (= n (inc q)) nf
> > >         (recur (inc n)
> > >                (mod (+ nf (* (mod S p) z)) limit)
> > >                (mod (inc (* p z)) limit)
> > >                (mod (* S S) 50515093))))))
>
> > > So I added in some type hinting,
>
> > > (defn NF-mod-limit [p q limit]
> > >  (let [p (long p) q (long q) limit (long limit)]
> > >  (loop [n (long 0), nf (long 0), z (long 0), S (long 290797)]
> > >        (if (= n (inc q)) nf
> > >         (recur (inc n)
> > >                (long (mod (+ nf (* (long (mod S p)) z)) limit))
> > >                (long (mod (inc (* p z)) limit))
> > >                (long (mod (* S S) 50515093)))))))
>
> > > But it doesn't run any faster.  Also it doesn't work without casting
> > > to long within the recur.  Is that maybe a problem with mod and
> > > primitive arithmetic or does this simply not speed up any more in
> > > Clojure?
>
> > > --
> > > You received this message because you are subscribed to the Google
> > > Groups "Clojure" group.
> > > To post to this group, send email to clojure@googlegroups.com
> > > Note that posts from new members are moderated - please be patient with 
> > > your first post.
> > > To unsubscribe from this group, send email to
> > > clojure+unsubscr...@googlegroups.com
> > > For more options, visit this group 
> > > athttp://groups.google.com/group/clojure?hl=en
>
> > --
> > You received this message because you are subscribed to the Google
> > Groups "Clojure" group.
> > To post to this group, send email to clojure@googlegroups.com
> > Note that posts from new members are moderated - please be patient with 
> > your first post.
> > To unsubscribe from this group, send email to
> > clojure+unsubscr...@googlegroups.com
> > For more options, visit this group 
> > athttp://groups.google.com/group/clojure?hl=en
>
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with your 
> first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group 
> athttp://groups.google.com/group/clojure?hl=en

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to