嗨我正在使用clojure进行编程,虽然模数反转的问题与语言无关但我仍然坚持使用此代码 -
(defn EulerDiv [x p]
(let [ToMod (+ p 2)]
(loop [num 1 toPow (int p) numDouble x]
(if (= 0 toPow)
num
(let [numDouble2 (rem (* numDouble numDouble) ToMod)
halfToPow (int (/ toPow 2))]
(if (odd? toPow)
(recur (rem (* num numDouble) ToMod)
halfToPow
numDouble2)
(recur num halfToPow numDouble2))
))))
)
它似乎给了我正确的小Primes的答案,但当我在Bigger primes的问题中使用它时,我得到的答案不是结果,如:
(= 2 (mod (* 4 (EulerDiv 2 (- 3 2))) 3))
这打印真实
(def ToMod (+ 10e8 7))
( = 1 (int (mod (* 2 (EulerDiv 2 (- ToMod 2))) ToMod)) )
这打印错误。
在clojure中还有rem
和mod
。
mod使输出为正,因此我无法在计算之间使用它。
这是一个编程竞赛,但这只是解决方案的一部分,并且在问题页面中也提供了模数反转的这些信息。
问题在于编制计算器语法来评估像4/-2/(2 + 8)
答案 0 :(得分:2)
你正在偏离整数运算。
/
函数可以产生有理数:(/ 1 2)
是1/2
,而不是0
。1e9
为1.0E9
,double
,不是整数。有适当的替代品可供选择。查看算术部分here以获取整数除法函数,并在强制转换部分查看将数字转换为整数的内容。
一切顺利!