Created
May 10, 2014 03:43
-
-
Save otijhuis/b411c57b2a99e7a47168 to your computer and use it in GitHub Desktop.
Stackoverflow Clojure performance solution
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Better find-collision: