A + B mod M Ci⁺ overflow carry bit (A+B) Ci⁻ overflow carry bit (A-B)
(a: u32, b: u32)
| 158 | // Ci⁺ overflow carry bit (A+B) |
| 159 | // Ci⁻ overflow carry bit (A-B) |
| 160 | fn add(a: u32, b: u32) -> Script { |
| 161 | let binding = Self::ADD_ONCELOCK; |
| 162 | let add_script = binding.get_or_init(|| { |
| 163 | script! { |
| 164 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ A₁ B₁ A₀ B₀ |
| 165 | { 0x20000000 } |
| 166 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ A₁ B₁ A₀ B₀ 2²⁹ |
| 167 | |
| 168 | // A₀ + B₀ |
| 169 | limb_add_carry |
| 170 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ A₁ B₁ 2²⁹ C₀⁺ A₀+B₀ |
| 171 | OP_DUP |
| 172 | OP_TOALTSTACK |
| 173 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ A₁ B₁ 2²⁹ C₀⁺ A₀+B₀ | A₀+B₀ |
| 174 | OP_ROT |
| 175 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ A₁ B₁ C₀⁺ A₀+B₀ 2²⁹ |
| 176 | { Self::MODULUS_LIMBS[0] } |
| 177 | OP_SWAP |
| 178 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ A₁ B₁ C₀⁺ A₀+B₀ M₀ 2²⁹ |
| 179 | limb_sub_borrow |
| 180 | OP_TOALTSTACK |
| 181 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ A₁ B₁ C₀⁺ 2²⁹ C₀⁻ | (A₀+B₀)-M₀ |
| 182 | |
| 183 | // from A₁ + B₁ + carry_0 |
| 184 | // to A{N-2} + B{N-2} + carry_{N-3} |
| 185 | for i in 1..Self::N_LIMBS-1 { |
| 186 | OP_2SWAP |
| 187 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ A₁ 2²⁹ C₀⁻ B₁ C₀⁺ |
| 188 | OP_ADD |
| 189 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ A₁ 2²⁹ C₀⁻ B₁+C₀⁺ |
| 190 | OP_2SWAP |
| 191 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ C₀⁻ B₁+C₀⁺ A₁ 2²⁹ |
| 192 | limb_add_carry |
| 193 | OP_DUP |
| 194 | OP_TOALTSTACK |
| 195 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ C₀⁻ 2²⁹ C₁⁺ (B₁+C₀)+A₁ | (B₁+C₀)+A₁ |
| 196 | OP_2SWAP |
| 197 | OP_SWAP |
| 198 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ C₁⁺ (B₁+C₀)+A₁ 2²⁹ C₀⁻ |
| 199 | { Self::MODULUS_LIMBS[i as usize] } |
| 200 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ C₁⁺ (B₁+C₀)+A₁ 2²⁹ C₀⁻ M₁ |
| 201 | OP_ADD |
| 202 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ C₁⁺ (B₁+C₀)+A₁ 2²⁹ C₀⁻+M₁ |
| 203 | OP_SWAP |
| 204 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ C₁⁺ (B₁+C₀)+A₁ C₀⁻+M₁ 2²⁹ |
| 205 | limb_sub_borrow |
| 206 | OP_TOALTSTACK |
| 207 | // ⋯ A₈ B₈ A₇ B₇ A₆ B₆ A₅ B₅ A₄ B₄ A₃ B₃ A₂ B₂ C₁⁺ 2²⁹ C₁⁻ | ((B₁+C₀)+A₁)-(C₀⁻+M₁) |
| 208 | } |
| 209 | // ⋯ A₈ B₈ C₇⁺ 2²⁹ C₇⁻ |
| 210 | OP_2SWAP |
| 211 | OP_ADD |
| 212 | // ⋯ A₈ 2²⁹ C₇⁻ B₈+C₇⁺ |
| 213 | OP_2SWAP |
| 214 | OP_ROT |
| 215 | OP_ROT |
| 216 | // ⋯ C₇⁻ 2²⁹ B₈+C₇⁺ A₈ |
| 217 | OP_ADD |