C'è un numero intero lungo m = 38941629971148227236N. Voglio generare un numero e tra 1 < e < m, e controllare e se soddisfa questo requisito: gcd (e, m) = 1. Il mio metodo è quello di utilizzare (lunga (rand m)) per generare e in modo casuale, ho ricevuto un avvertimento:Come generare un numero lungo in modo casuale nel clojure
IllegalArgumentException Value out of range for long:
1.7166121075068025E19 clojure.lang.RT.longCast (RT.java:1254)
Il mio codice è:
(defn find-e [m]
(loop [e (long (rand m))]
(if (= 1 (gcd e m)) e
(recur (long (rand m))))))
So che il risultato fuori portata per lungo tempo, ma non so c'è un modo per risolvere questo problema?
Davvero una buona risposta. Per i 'limiti' di grandi dimensioni, # di tentativi non dovrebbe essere un problema. – muhuk
In realtà ho sbagliato, può essere un problema poiché ogni bit raddoppia lo spazio di ricerca. E il 'limite' più grande diventa, peggio diventa. – muhuk