我在clojure中的Modulo Inverse似乎给出了错误的答案

时间:2014-10-13 06:10:43

标签: clojure modulo inverse

嗨我正在使用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中还有remmod。 mod使输出为正,因此我无法在计算之间使用它。

这是一个编程竞赛,但这只是解决方案的一部分,并且在问题页面中也提供了模数反转的这些信息。

问题在于编制计算器语法来评估像4/-2/(2 + 8)

这样的表达

1 个答案:

答案 0 :(得分:2)

你正在偏离整数运算。

  • 给定整数,/函数可以产生有理数:(/ 1 2)1/2,而不是0
  • 1e91.0E9double,不是整数。

有适当的替代品可供选择。查看算术部分here以获取整数除法函数,并在强制转换部分查看将数字转换为整数的内容。

一切顺利!