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