<div dir="ltr">Hi Jens,<div><br></div><div style>You are probably right (no pun intended!), but I was only looking at the docs and since prime-strong-pseudo-single? is unexported and not in the docs, I didn&#39;t see it.</div>
<div style><br></div><div style>I may not fully understand your code, but where do you put in the number of trials (it is not in the signature of prime-strong-pseudo-single?)?</div><div style><br></div><div style>Thanks again for a very useful set of functions!</div>
<div style>-joe</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Feb 20, 2013 at 11:24 AM, Jens Axel Søgaard <span dir="ltr">&lt;<a href="mailto:jensaxel@soegaard.net" target="_blank">jensaxel@soegaard.net</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Joe,<br>
<br>
2013/2/20 Joe Gilray &lt;<a href="mailto:jgilray@gmail.com">jgilray@gmail.com</a>&gt;:<br>
<div class="im">&gt; Racketeers,<br>
&gt;<br>
&gt; Thanks for putting together the fantastic math library.  It will be a<br>
&gt; wonderful resource.  Here are some quick impressions (after playing mostly<br>
&gt; with math/number-theory)<br>
&gt;<br>
&gt; 1) The functions passed all my tests and were very fast.  If you need even<br>
&gt; more speed you can keep a list of primes around and write functions to use<br>
&gt; that, but that should be rarely necessary<br>
<br>
</div>That&#39;s great to hear.<br>
<div class="im"><br>
&gt; 2) I have a couple of functions to donate if you want them:<br>
<br>
</div>Contributions to the library is very welcome. For example<br>
it would be nice to have a better implementation of next-prime.<br>
<div><div class="h5"><br>
&gt; 2a) Probablistic primality test:<br>
&gt;<br>
&gt; ; function that performs a Miller-Rabin probabalistic primality test k<br>
&gt; times, returns #t if n is probably prime<br>
&gt; ; algorithm from <a href="http://rosettacode.org/wiki/Miller-Rabin_primality_test" target="_blank">http://rosettacode.org/wiki/Miller-Rabin_primality_test</a>,<br>
&gt; code adapted from Lisp example<br>
&gt; ; (module+ test (check-equal? (is-mr-prime? 1000000000000037 8) #t))<br>
&gt; (define (is-mr-prime? n k)<br>
&gt;   ; function that returns two values r and e such that number = divisor^e *<br>
&gt; r, and r is not divisible by divisor<br>
&gt;   (define (factor-out number divisor)<br>
&gt;     (do ([e 0 (add1 e)] [r number (/ r divisor)])<br>
&gt;       ((not (zero? (remainder r divisor))) (values r e))))<br>
&gt;<br>
&gt;   ; function that performs fast modular exponentiation by repeated squaring<br>
&gt;   (define (expt-mod base exponent modulus)<br>
&gt;     (let expt-mod-iter ([b base] [e exponent] [p 1])<br>
&gt;       (cond<br>
&gt;         [(zero? e) p]<br>
&gt;         [(even? e) (expt-mod-iter (modulo (* b b) modulus) (/ e 2) p)]<br>
&gt;         [else (expt-mod-iter b (sub1 e) (modulo (* b p) modulus))])))<br>
&gt;<br>
&gt;   ; function to return a random, exact number in the passed range<br>
&gt; (inclusive)<br>
&gt;   (define (shifted-rand lower upper)<br>
&gt;     (+ lower (random (add1 (- (modulo upper 4294967088) (modulo lower<br>
&gt; 4294967088))))))<br>
&gt;<br>
&gt;   (cond<br>
&gt;     [(= n 1) #f]<br>
&gt;     [(&lt; n 4) #t]<br>
&gt;     [(even? n) #f]<br>
&gt;     [else<br>
&gt;      (let-values ([(d s) (factor-out (- n 1) 2)]) ; represent n-1 as 2^s-d<br>
&gt;        (let lp ([a (shifted-rand 2 (- n 2))] [cnt k])<br>
&gt;          (if (zero? cnt) #t<br>
&gt;              (let ([x (expt-mod a d n)])<br>
&gt;                (if (or (= x 1) (= x (sub1 n))) (lp (shifted-rand 2 (- n 2))<br>
&gt; (sub1 cnt))<br>
&gt;                    (let ctestlp ([r 1] [ctest (modulo (* x x) n)])<br>
&gt;                      (cond<br>
&gt;                        [(&gt;= r s) #f]<br>
&gt;                        [(= ctest 1) #f]<br>
&gt;                        [(= ctest (sub1 n)) (lp (shifted-rand 2 (- n 2))<br>
&gt; (sub1 cnt))]<br>
&gt;                        [else (ctestlp (add1 r) (modulo (* ctest ctest)<br>
&gt; n))])))))))]))<br>
<br>
</div></div>As far as I can tell, this is the same algorithm as prime-strong-pseudo-single?<br>
from number-theory.rkt. See line 134.<br>
<br>
<a href="https://github.com/plt/racket/blob/master/collects/math/private/number-theory/number-theory.rkt" target="_blank">https://github.com/plt/racket/blob/master/collects/math/private/number-theory/number-theory.rkt</a><br>

<br>
--<br>
Jens Axel Søgaard<br>
</blockquote></div><br></div>