= 0; $t--) { $kt = gmp_testbit($scalar, $t) ? 1 : 0; if ($swap ^ $kt) { [$x2, $x3] = [$x3, $x2]; [$z2, $z3] = [$z3, $z2]; } $swap = $kt; $a = gmp_add($x2, $z2); $aa = gmp_mod(gmp_mul($a, $a), $p); $b = gmp_sub($x2, $z2); $bb = gmp_mod(gmp_mul($b, $b), $p); $e = gmp_sub($aa, $bb); $c = gmp_add($x3, $z3); $d = gmp_sub($x3, $z3); $da = gmp_mul($d, $a); $cb = gmp_mul($c, $b); $x3 = gmp_mod(gmp_pow(gmp_add($da, $cb), 2), $p); $z3 = gmp_mod(gmp_mul($x1, gmp_pow(gmp_sub($da, $cb), 2)), $p); $x2 = gmp_mod(gmp_mul($aa, $bb), $p); $z2 = gmp_mod(gmp_mul($e, gmp_add($aa, gmp_mul(121665, $e))), $p); } if ($swap) { [$x2, $x3] = [$x3, $x2]; [$z2, $z3] = [$z3, $z2]; } $r = gmp_mod(gmp_mul($x2, gmp_powm($z2, gmp_sub($p, 2), $p)), $p); return strrev(str_pad(gmp_export($r), 32, "\0", STR_PAD_LEFT)); } }