Search code examples
clojuremoduloinverse

my Modulo Inverse in clojure Seems to give wrong answer


Hi I am programming in clojure and though the problem of modulo inverse has nothing to do with language i am stuck at this code -

(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))

          ))))
  )

It seems to give me right answers for small Primes but when i am using it in a problem with Bigger primes i am getting answers other than result like :

(= 2 (mod (* 4 (EulerDiv 2 (- 3 2))) 3))

This prints true

(def ToMod (+ 10e8 7))
( = 1 (int (mod (* 2 (EulerDiv 2 (- ToMod 2))) ToMod)) )

This prints false.

Also there is rem and mod in clojure. mod makes the output positive and hence i can not use it in between the calculations.

It is a programming contest but this is just part of solution and this info of modulo inverse was also provided in the problem page.

The problem is that of programming calculator grammar for evaluating evpressions like 4/-2/(2 + 8)


Solution

  • You are straying from integer arithmetic.

    • Given integers, the / function can produce rationals: (/ 1 2) is 1/2, not 0.
    • And 1e9 is 1.0E9, a double, not an integer.

    There are appropriate substitutes available. Look at the arithmetic section here for an integer division function, and at the cast section for something to convert a number to an integer.

    All the best!