diff --git a/bin/main.ml b/bin/main.ml index 39556ce..69799b9 100644 --- a/bin/main.ml +++ b/bin/main.ml @@ -150,3 +150,73 @@ let program = Printf.printf "%d\n" (reduce 48 program) ;; + +(* -------------------------------------------------------------------------- *) +(* Miller-Rabin primality test program *) +let program = + Main + ("n", + "result", + Sequence ( + (Assignment ("result", Integer 0)), + (Sequence ( + (Sequence ( + (Assignment ("s", Integer 0)), + (While ( + (BCmp (Integer 0, + Modulo ( + Division ( + (Minus (Variable "n", Integer 1)), + (Power (Integer 2, Variable "s"))), + (Integer 2) + ) + ) + ), + (Assignment ("s", Plus (Variable "s", Integer 1))) + )) + )), + (Sequence ( + (Assignment ("d", Division (Minus (Variable "n", Integer 1), Power (Integer 2, Variable "s")))), + (For ( + (Assignment ("i", Integer 20)), + (BCmpGreater (Variable "i", Integer 0)), + (Assignment ("i", Minus (Variable "i", Integer 1))), + (Sequence ( + Sequence ( + (Assignment ("a", Plus (Rand (Minus (Variable "n", Integer 4)), Integer 2))), + (Assignment ("x", PowerMod (Variable "a", Variable "d", Variable "n")))), + Sequence ( + (For ( + (Assignment ("j", Integer 0)), + (BCmpLess (Variable "j", Variable "s")), + (Assignment ("j", Plus (Variable "j", Integer 1))), + (Sequence ( + Sequence ( + (Assignment ("y", PowerMod (Variable "x", Integer 2, Variable "n"))), + (If ( + (BAnd (BAnd (BCmp (Variable "y", Integer 1), BNot (BCmp (Variable "x", Integer 1))), BNot (BCmp (Variable "x", Minus (Variable "n", Integer 1))))), + (Assignment ("result", Integer 1)), + (Skip) + ))), + (Assignment ("x", Variable "y")) + )) + )), + (If ( + (BNot (BCmp (Variable "y", Integer 1))), + (Assignment ("result", Integer 1)), + (Skip) + ))) + )) + )) + )) + )) + ) + ) +;; + +(* should return 0 because prime *) +Printf.printf "%d\n" (reduce 179424673 program) +;; +(* sould return 1 because not prime *) +Printf.printf "%d\n" (reduce 179424675 program) +;;