One correction: after playing with the functions a bit I noticed I screwed up, putting sqrt where I needed square.
On Sun, Nov 8, 2009 at 4:43 PM, Robert Campbell <[email protected]> wrote: > I've started reading SICP and I came across the Fermat primality test > implemented an Scheme. I reimplemented it in Clojure and was able to > switch the recursive call in fast-prime to TCO/recur, but I was unable > to do the same for the exp-mod function. > > (defn exp-mod [base exp m] > (cond > (zero? exp) 1 > (even? exp) (mod (Math/sqrt (exp-mod base (/ exp 2) m)) m) > :else (mod (* base (exp-mod base (inc exp) m)) m))) > > (defn fermat-test [n] > (defn try-it [a] > (= (exp-mod a n n) a)) > (try-it (inc (rand-int (dec n))))) > > (defn fast-prime? [n times] > (cond > (zero? times) true > (fermat-test n) (recur n (dec times)) > :else false)) > > Calling (fast-prime? 5 3) blows the stack. How can I change exp-mod to use > TCO? > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to [email protected] Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---
