/ tests / tests / compiler / examples / fibonacci.adl
fibonacci.adl
 1  
 2  program test.alpha {
 3      // This calculates the n-th fibonacci number (up to 64th)
 4      transition fibonacci(public n: u8) -> u128 {
 5          assert(n <= 64u8);
 6  
 7          let f0: u128 = 0u128;
 8          let f1: u128 = 1u128;
 9          let c: u8 = 0u8;
10  
11          let z: u8 = reverse_bits(n);
12  
13          for i:u8 in 0u8..8u8 {
14              if n > 0u8 {
15                  let f2i1: u128 = f1 * f1 + f0 * f0;
16                  let f2i: u128 =  f0 * (2u128 * f1 - f0);
17                  if z & 1u8.shl(c) == 0u8 {
18                      f0 = f2i;
19                      f1 = f2i1;
20                  } else {
21                      f0 = f2i1;
22                      f1 = f2i + f2i1;
23                  }
24                  c = c + 1u8;
25                  n = n >> 1u8;
26              }
27          }
28  
29          return f0;
30      }
31  
32      function reverse_bits(n: u8) -> u8 {
33          let reverse: u8 = 0u8;
34  
35          for i:u8 in 0u8..8u8 {
36              if n > 0u8 {
37                  reverse = reverse << 1u8;
38  
39                  if n & 1u8 == 1u8 {
40                      reverse ^= 1u8;
41                  }
42  
43                  n = n >> 1u8;
44              }
45          }
46  
47          return reverse;
48      }
49  }