public function contains($x, $y) { $eq_zero = null; if (extension_loaded('gmp') && USE_EXT == 'GMP') { $eq_zero = gmp_cmp(GmpUtils::gmp_mod2(gmp_sub(gmp_pow($y, 2), gmp_add(gmp_add(gmp_pow($x, 3), gmp_mul($this->a, $x)), $this->b)), $this->prime), 0); if ($eq_zero == 0) { return true; } else { return false; } } elseif (extension_loaded('bcmath') && USE_EXT == 'BCMATH') { $eq_zero = bccomp(bcmod(bcsub(bcpow($y, 2), bcadd(bcadd(bcpow($x, 3), bcmul($this->a, $x)), $this->b)), $this->prime), 0); if ($eq_zero == 0) { return true; } else { return false; } } else { throw new ErrorException("Please install BCMATH or GMP"); } }
public static function double(Point $p1) { if (extension_loaded('gmp') && USE_EXT == 'GMP') { $p = $p1->curve->getPrime(); $a = $p1->curve->getA(); $inverse = NumberTheory::inverse_mod(gmp_strval(gmp_mul(2, $p1->y)), $p); $three_x2 = gmp_mul(3, gmp_pow($p1->x, 2)); $l = gmp_strval(GmpUtils::gmp_mod2(gmp_mul(gmp_add($three_x2, $a), $inverse), $p)); $x3 = gmp_strval(GmpUtils::gmp_mod2(gmp_sub(gmp_pow($l, 2), gmp_mul(2, $p1->x)), $p)); $y3 = gmp_strval(GmpUtils::gmp_mod2(gmp_sub(gmp_mul($l, gmp_sub($p1->x, $x3)), $p1->y), $p)); if (gmp_cmp(0, $y3) > 0) { $y3 = gmp_strval(gmp_add($p, $y3)); } $p3 = new Point($p1->curve, $x3, $y3); return $p3; } elseif (extension_loaded('bcmath') && USE_EXT == 'BCMATH') { $p = $p1->curve->getPrime(); $a = $p1->curve->getA(); $inverse = NumberTheory::inverse_mod(bcmul(2, $p1->y), $p); $three_x2 = bcmul(3, bcpow($p1->x, 2)); $l = bcmod(bcmul(bcadd($three_x2, $a), $inverse), $p); $x3 = bcmod(bcsub(bcpow($l, 2), bcmul(2, $p1->x)), $p); $y3 = bcmod(bcsub(bcmul($l, bcsub($p1->x, $x3)), $p1->y), $p); if (bccomp(0, $y3) == 1) { $y3 = bcadd($p, $y3); } $p3 = new Point($p1->curve, $x3, $y3); return $p3; } else { throw new ErrorException("Please install BCMATH or GMP"); } }
public static function order_mod($x, $m) { if (extension_loaded('gmp') && USE_EXT == 'GMP') { if ($m <= 1) { return 0; } if (gcd($x, m) == 1) { $z = $x; $result = 1; while ($z != 1) { $z = gmp_strval(GmpUtils::gmp_mod2(gmp_mul($z, $x), $m)); $result = gmp_add($result, 1); } return gmp_strval($result); } } elseif (extension_loaded('bcmath') && USE_EXT == 'BCMATH') { if ($m <= 1) { return 0; } if (gcd($x, m) == 1) { $z = $x; $result = 1; while ($z != 1) { $z = bcmod(bcmul($z, $x), $m); $result = bcadd($result, 1); } return $result; } } else { throw new ErrorException("Please install BCMATH or GMP"); } }