/ test / contracts / bignum.aes
bignum.aes
 1  // Check that we get out of gas/arithmetic errors for big numbers.
 2  contract BigNum =
 3  
 4    function mul_(a, b, r) =
 5      if (b =< 0) r
 6      else mul_(a + a, b / 2, if (b mod 2 == 1) (a + r) else r)
 7  
 8    function mul(a, b) = mul_(a, b, 0)
 9  
10    function pow1_(a, b, r) =
11      if (b =< 0) r
12      else pow1_(mul(a, a), b / 2, if (b mod 2 == 1) mul(a, r) else r)
13  
14    function pow1(a, b) = pow1_(a, b, 1)
15  
16    function pow2_(a, b, r) =
17      if (b =< 0) r
18      else pow2_(a * a, b / 2, if (b mod 2 == 1) (a * r) else r)
19  
20    function pow2(a, b) = pow2_(a, b, 1)
21  
22    entrypoint tetr1(a, b) =
23      if (b =< 0) 1 else pow1(a, tetr1(a, b - 1))
24  
25    entrypoint tetr2(a, b) =
26      if (b =< 0) 1 else pow2(a, tetr2(a, b - 1))
27  
28    entrypoint tetr3(a, b) =
29      if (b =< 0) 1 else a ^ tetr3(a, b - 1)
30