/// Division modulo 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47, the BN254 base field order /// To replace with more efficient method using non-determinism later. // Returns y * (x^-1) where the inverse is taken modulo N %macro moddiv // stack: x, y %inverse // stack: x^-1, y %mulmodn %endmacro %macro mulmodn // stack: x, y PUSH 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 // stack: N, x, y SWAP2 // stack: y, x, N MULMOD %endmacro %macro squaremodn // stack: x DUP1 // stack: x, x %mulmodn %endmacro // Computes the inverse modulo N using x^-1 = x^(N-2) mod N and square-and-multiply modular exponentiation. %macro inverse DUP1 %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn %squaremodn %squaremodn DUP2 %mulmodn %squaremodn %squaremodn DUP2 %mulmodn SWAP1 // stack: x, x^-1 POP // stack: x^-1 %endmacro