gpt4 book ai didi

clojure - 如何在clojure中随机生成一个长数

转载 作者:行者123 更新时间:2023-12-04 17:33:15 25 4
gpt4 key购买 nike

有长整数 m = 38941629971148227236N。我想在 1 < e < m 之间生成一个数字 e,并检查 e 是否满足此要求:gcd(e,m)=1。我的方法是使用 (long (rand m)) 随机生成 e ,我收到警告:

IllegalArgumentException Value out of range for long:
1.7166121075068025E19 clojure.lang.RT.longCast (RT.java:1254)

我的代码是:
(defn find-e [m]
(loop [e (long (rand m))]
(if (= 1 (gcd e m)) e
(recur (long (rand m))))))

我早就知道结果超出范围,但我不知道有什么办法可以解决这个问题?

最佳答案

问题出在 (long (rand m))因为您选择的随机值通常比 long 中可以容纳的要大得多。你想让一个 bigint 不长。这是一种解决方法:

(bigint (bigdec (rand 38941629971148227236N)))

请注意,以这种方式选择随机数实际上是生成一个 double 数,该 double 数被转换为一个 bigdec,而后者又被转换为一个 bigit。因此,可能的随机值的域是有限的。使用 double 作为基本随机数意味着不会生成所有可能的 bigint。如果您想要真正的 bigint 随机选择,请查看 this answer ...但如果你不太在意,只要你在正确的范围内得到一个 bigint,这可能对你有用:
(defn find-e [m]
(loop [e (bigint (bigdec (rand m)))]
(if (= 1 (gcd e m))
e
(recur (bigint (bigdec (rand m)))))))

关于clojure - 如何在clojure中随机生成一个长数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35822942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com