Merge branch 'mailmap' into 'master'
[why3.git] / examples / cubic_root.mlw
blobbad27c1c4966ca0a027386bb34dd2ea02a053177
2 (** {1 Integer Cubic Root}
4     Simple computation of the integer cubic root, using a loop and two
5     auxiliary variables containing the square and the cube.
7     See also isqrt.mlw *)
9 module CubicRoot
11   use int.Int
12   use ref.Ref
14   function cube (x: int) : int = x * x * x
16   let cubic_root (x: int) : int
17     requires { x >= 0 }
18     ensures  { cube (result - 1) <= x < cube result }
19   =
20     let ref a = 1 in
21     let ref b = 1 in
22     let ref y = 1 in
23     while y <= x do
24       invariant { cube (b - 1) <= x }
25       invariant { y = cube b }
26       invariant { a = b * b }
27       variant   { x - y }
28       y <- y + 3 * a + 3 * b + 1;
29       a <- a + 2 * b + 1;
30       b <- b + 1
31     done;
32     b
34 end