【问题标题】:my Modulo Inverse in clojure Seems to give wrong answer我在clojure中的模逆似乎给出了错误的答案
【发布时间】:2014-10-13 06:10:43
【问题描述】:

您好,我正在用 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))

          ))))
  )

对于小质数,它似乎给了我正确的答案,但是当我在更大质数的问题中使用它时,我得到的答案不是结果,例如:

(= 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)之类的evpressions

【问题讨论】:

  • 我的程序只要有/ 就会给出错误的答案。这是我使用模逆的地方

标签: clojure modulo inverse


【解决方案1】:

您正在偏离整数算术。

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

有合适的替代品可用。查看 arithmetic 部分 here 了解整数除法函数,并查看 cast 部分了解将数字转换为整数的内容。

一切顺利!

【讨论】:

    猜你喜欢
    • 2011-07-02
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多