| 1 | fn mul(a i64, unsigned u32) f64 { |
| 2 | mut one := a |
| 3 | |
| 4 | one *= 2 / unsigned |
| 5 | |
| 6 | return f64(one) |
| 7 | } |
| 8 | |
| 9 | fn typ(a int) i64 { |
| 10 | mut one := a |
| 11 | sec := one + i64(a) |
| 12 | |
| 13 | return sec |
| 14 | } |
| 15 | |
| 16 | pub fn gcd(a_ i64, b_ i64) i64 { |
| 17 | mut a := a_ |
| 18 | mut b := b_ |
| 19 | if a < 0 { |
| 20 | a = -a |
| 21 | } |
| 22 | if b < 0 { |
| 23 | b = -b |
| 24 | } |
| 25 | for b != 0 { |
| 26 | a %= b |
| 27 | if a == 0 { |
| 28 | return b |
| 29 | } |
| 30 | b %= a |
| 31 | } |
| 32 | return a |
| 33 | } |
| 34 | |
| 35 | pub fn lcm(a i64, b i64) i64 { |
| 36 | if a == 0 { |
| 37 | return a |
| 38 | } |
| 39 | res := a * (b / gcd(b, a)) |
| 40 | if res < 0 { |
| 41 | return -res |
| 42 | } |
| 43 | return res |
| 44 | } |
| 45 | |
| 46 | pub fn inc(a f64) int { |
| 47 | mut b := a |
| 48 | b++ |
| 49 | b-- |
| 50 | return int(b) |
| 51 | } |
| 52 | |
| 53 | pub fn negate(a int) i64 { |
| 54 | return ~a + 1 |
| 55 | } |
| 56 | |
| 57 | pub fn powi(a i64, b i64) i64 { |
| 58 | mut b_ := b |
| 59 | mut p := a |
| 60 | mut v := i64(1) |
| 61 | |
| 62 | if b_ < 0 { // exponent < 0 |
| 63 | if a == 0 { |
| 64 | return -1 // division by 0 |
| 65 | } |
| 66 | return if a * a != 1 { |
| 67 | 0 |
| 68 | } else { |
| 69 | if (b_ & 1) > 0 { |
| 70 | a |
| 71 | } else { |
| 72 | 1 |
| 73 | } |
| 74 | } |
| 75 | } |
| 76 | |
| 77 | for b_ > 0 { |
| 78 | if b_ & 1 > 0 { |
| 79 | v *= p |
| 80 | } |
| 81 | p *= p |
| 82 | b_ >>= 1 |
| 83 | } |
| 84 | |
| 85 | return v |
| 86 | } |
| 87 | |
| 88 | pub fn sqrti(a i64) i64 { |
| 89 | mut x := a |
| 90 | mut q, mut r := i64(1), i64(0) |
| 91 | for ; q <= x; { |
| 92 | q <<= 2 |
| 93 | } |
| 94 | for ; q > 1; { |
| 95 | q >>= 2 |
| 96 | t := x - r - q |
| 97 | r >>= 1 |
| 98 | if t >= 0 { |
| 99 | x = t |
| 100 | r += q |
| 101 | } |
| 102 | } |
| 103 | return r |
| 104 | } |
| 105 | |
| 106 | fn main() { |
| 107 | println('--- test printing numbers') |
| 108 | println(-20) |
| 109 | println(0) |
| 110 | println(22) |
| 111 | println(-1000000022) |
| 112 | |
| 113 | println('--- test powi') |
| 114 | println(powi(2, 62)) |
| 115 | println(powi(0, -2)) |
| 116 | println(powi(2, -1)) |
| 117 | |
| 118 | println('--- test sqrti') |
| 119 | println(sqrti(i64(123456789) * i64(123456789))) |
| 120 | println(sqrti(144)) |
| 121 | println(sqrti(0)) |
| 122 | |
| 123 | println('--- test negate') |
| 124 | println(negate(20)) |
| 125 | println(negate(-1)) |
| 126 | |
| 127 | println('--- test inc') |
| 128 | println(inc(20)) |
| 129 | println(inc(-1)) |
| 130 | |
| 131 | println('--- test lcm') |
| 132 | println(lcm(2, 3)) |
| 133 | println(lcm(-2, 3)) |
| 134 | println(lcm(-2, -3)) |
| 135 | println(lcm(0, 0)) |
| 136 | |
| 137 | println('--- test gcd') |
| 138 | |
| 139 | println(gcd(6, 9)) |
| 140 | println(gcd(6, -9)) |
| 141 | println(gcd(-6, -9)) |
| 142 | println(gcd(0, 0)) |
| 143 | } |
| 144 | |