public static function add(\fpoirotte\Pssht\ECC\Curve $curve, \fpoirotte\Pssht\ECC\Point $P, \fpoirotte\Pssht\ECC\Point $Q) { $mod = $curve->getModulus(); $xP = $P->coordinates['x']; $yP = $P->coordinates['y']; $xQ = $Q->coordinates['x']; $yQ = $Q->coordinates['y']; if (!gmp_cmp($xP, $xQ) && !gmp_cmp($yP, $yQ)) { $alphanum = gmp_add(gmp_mul('3', gmp_pow($xP, '2')), $curve->getA()); $alphaden = gmp_mul('2', $yP); } else { $alphanum = gmp_sub($yQ, $yP); $alphaden = gmp_sub($xQ, $xP); } $bezout = gmp_gcdext($alphaden, $mod); $alpha = gmp_mod(gmp_mul($alphanum, $bezout['s']), $mod); $xR = gmp_sub(gmp_sub(gmp_pow($alpha, '2'), $xP), $xQ); $yR = gmp_sub(gmp_mul($alpha, gmp_sub($xP, $xR)), $yP); return new static(gmp_mod(gmp_add($xR, $mod), $mod), gmp_mod(gmp_add($yR, $mod), $mod)); }