[ create a new paste ] login | about

Link: http://codepad.org/SpVF5kd8    [ raw code | fork ]

programmingpraxis - Plain Text, pasted on Mar 3:
; modest prime-number library

(defn gcd "greatest common divisor" [a b]
  (if (zero? b) a (gcd b (mod a b))))

(println "gcd of 8 and 12 is" (gcd 8 12))

(defn powerMod "modular exponentiation" [b e m]
  (defn m* [p q] (mod (* p q) m))
  (loop [b b, e e, x 1]
    (if (zero? e) x
      (if (even? e) (recur (m* b b) (/ e 2) x)
        (recur (m* b b) (quot e 2) (m* b x))))))

(def b 2988348162058574136915891421498819466320163312926952423791023078876139)
(def e 2351399303373464486466122544523690094744975233415544072992656881240319)
(def m 10000000000000000000000000000000000000000)
(println "b ^ e (mod m) =" (powerMod b e m))

(defn primes "primes less than n" [n]
  (let [sieve (boolean-array n true)]
    (loop [p 2, ps (list)]
      (cond (= n p) (reverse ps)
            (aget sieve p)
              (do (doseq [i (range (* p p) n p)]
                    (aset sieve i false))
                  (recur (+ p 1) (cons p ps)))
            :else (recur (+ p 1) ps)))))

(println "primes less than 30 are" (primes 30))

(defn prime? "miller-rabin primality test" [n]
  (defn witness? [n a]
    (loop [d (- n 1), s 0]
      (if (even? d) (recur (/ d 2) (+ s 1))
        (let [t (powerMod a d n)]
          (if (= t 1) false ; probably prime
            (loop [t t, s s]
              (if (zero? s) true ; composite
                (if (= t (- n 1)) false ; probably prime
                  (recur (powerMod t 2 n) (- s 1))))))))))
  (if (= n 2) true
    (loop [i 25] ; arbitrary number of witness trials
      (if (zero? i) true ; probably prime
        (let [a (+ 2 (rand-int (min 100000 (- n 2))))]
          (if (witness? n a) false ; composite
            (recur (- i 1))))))))

(println "2 is" (if (prime? 2) "prime" "composite"))
(println "87 is" (if (prime? 87) "prime" "composite"))
(println "2^89-1 is" (if (prime? 618970019642690137449562111) "prime" "composite"))

(defn factors "pollard-rho factorization" [n]
  (defn rho [n c]
    (defn f [x] (mod (+ (* x x) c) n))
    (loop [h 5, t 2, d 1]
      (if (< 1 d) d
        (recur (f (f h)) (f t) (gcd (- t h) n)))))
  (if (<= -1 n 1) (list n)
    (if (neg? n) (cons -1 (factors (- n)))
      (loop [n n, c 1, fs (list)]
        (if (= n 1) fs (if (prime? n) (sort < (cons n fs))
          (if (even? n) (recur (/ n 2) c (cons 2 fs))
            (let [d (rho n c)]
              (if (prime? d)
                  (recur (/ n d) (+ c 1) (cons d fs))
                  (recur n (+ c 1) fs))))))))))

(println "factors of 13290059 are" (factors 13290059))


Create a new paste based on this one


Comments: