MCPcopy Create free account
hub / github.com/BitVM/BitVM / add

Method add

bitvm/src/bn254/fp254impl.rs:160–263  ·  view source on GitHub ↗

A + B mod M Ci⁺ overflow carry bit (A+B) Ci⁻ overflow carry bit (A-B)

(a: u32, b: u32)

Source from the content-addressed store, hash-verified

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

Callers

nothing calls this directly

Implementers 2

fr.rsbitvm/src/bn254/fr.rs
fq.rsbitvm/src/bn254/fq.rs

Calls

no outgoing calls

Tested by

no test coverage detected