Skip to content

Instantly share code, notes, and snippets.

@otijhuis
Created May 10, 2014 03:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save otijhuis/b411c57b2a99e7a47168 to your computer and use it in GitHub Desktop.
Save otijhuis/b411c57b2a99e7a47168 to your computer and use it in GitHub Desktop.
Stackoverflow Clojure performance solution
(ns calc.core)
(def start (biginteger 1))
(def b (.pow (biginteger 2) 20))
(def g (biginteger 11717829880366207009516117596335367088558084999998952205599979459063929499736583746670572176471460312928594829675428279466566527115212748467589894601965568))
(def p (biginteger 13407807929942597099574024998205846127479365820592393377723561443721764030073546976801874298166903427690031858186486050853753882811946569946433649006084171))
(def h (biginteger 3239475104050450443565264378728065788649097520952449527834792452971981976143292558073856937958553180532878928001494706097394108577585732452307673444020333))
(defn build-left-table [start end p h g]
(into {}
(pmap (fn [n] [(.mod(.multiply h (.modInverse (.modPow g (biginteger n) p) p)) p) (biginteger n)])
(range start (inc end)))))
(defn find-collision [table b p g]
(let [base (.modPow g b p)]
(loop [i 0
v (biginteger 1)]
(when (< i b)
(do
(if (contains? table v)
(let [percentage (double (/ (* i 100) b))]
(println (str "Collision after " percentage "%"))
[i (table v)])
(recur (inc i) (.mod (.multiply v base) p))))))))
(time (find-collision (build-left-table start b p h g) b p g))
@otijhuis
Copy link
Author

Better find-collision:

(defn find-collision [table b p g]
  (let [base (.modPow g b p)
        f (iterate (fn [x] (.mod (.multiply x base) p)) (biginteger 1))]
    (some (fn [x] (table x)) (take b f))))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment