The main example is

(NF-mod-limit 61 10000000 (reduce * (repeat 10 61)))

It runs in about 10 seconds but this is somewhat typical of other
computations I want to be able to do that take longer.  I'd just like
to be able to make the integer math as fast as is reasonable in
Clojure.

I'll try rem for time but I see that I still have to cast to long;
Clojure doesn't think (rem (long xxxx) (long xxxxx)) is a long.  The
error is "recur arg for primitive local: nf must be matching
primitive."


On May 3, 6:53 pm, David Nolen <dnolen.li...@gmail.com> wrote:
> On Mon, May 3, 2010 at 4: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?
>
> mod is a bit more general than Java's % operator. If you just want the %
> operator, then it looks like you need to use rem not mod. That seems to
> speed things up ~2X for me. Do you have some sample values you're passing to
> your function and the corresponding runtimes that you are seeing?
>
> David
>
> --
> 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