2022-07-05 15:01:40 +02:00
|
|
|
/// 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
|
|
|
|
|
|
|
|
|
|
%macro inverse
|
2022-07-05 15:43:41 +02:00
|
|
|
DUP1
|
2022-07-05 15:01:40 +02:00
|
|
|
%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
|
2022-07-05 15:43:41 +02:00
|
|
|
SWAP1
|
|
|
|
|
// stack: x, x^-1
|
|
|
|
|
POP
|
|
|
|
|
// stack: x^-1
|
2022-07-05 15:01:40 +02:00
|
|
|
%endmacro
|