public function sqrt($a) { $p = $this->p; if (gmp_legendre($a, $p) != 1) { //no result return null; } if (gmp_strval(gmp_mod($p, gmp_init(4, 10)), 10) == 3) { $sqrt1 = gmp_powm($a, gmp_div_q(gmp_add($p, gmp_init(1, 10)), gmp_init(4, 10)), $p); // there are always 2 results for a square root // In an infinite number field you have -2^2 = 2^2 = 4 // In a finite number field you have a^2 = (p-a)^2 $sqrt2 = gmp_mod(gmp_sub($p, $sqrt1), $p); return array($sqrt1, $sqrt2); } else { throw new \Exception('P % 4 != 3 , this isn\'t supported yet.'); } }
// gmp_intval echo gmp_intval(PHP_INT_MAX) . "\n"; echo gmp_intval(gmp_add(PHP_INT_MAX, 1)) . "\n"; echo gmp_intval(gmp_sub(PHP_INT_MAX, 1)) + 1 . "\n"; echo gmp_strval(gmp_add(PHP_INT_MAX, 1)) . "\n"; // gmp_invert echo gmp_invert("5", "10"); // no inverse, outputs nothing, result is FALSE $invert = gmp_invert("5", "11"); echo gmp_strval($invert) . "\n"; // gmp_jacobi echo gmp_jacobi("1", "3") . "\n"; echo gmp_jacobi("2", "3") . "\n"; // gmp_legendre echo gmp_legendre("1", "3") . "\n"; echo gmp_legendre("2", "3") . "\n"; // gmp_mod $mod = gmp_mod("8", "3"); echo gmp_strval($mod) . "\n"; // gmp_mul $mul = gmp_mul("12345678", "2000"); echo gmp_strval($mul) . "\n"; // gmp_neg $neg1 = gmp_neg("1"); echo gmp_strval($neg1) . "\n"; $neg2 = gmp_neg("-1"); echo gmp_strval($neg2) . "\n"; // gmp_nextprime $prime1 = gmp_nextprime(10); // next prime number greater than 10 $prime2 = gmp_nextprime(-1000);
<?php for ($i = -1; $i < 10; $i++) { var_dump(gmp_strval(gmp_legendre($i * $i - 1, 3))); } var_dump(gmp_strval(gmp_legendre(7, 23))); var_dump(gmp_strval(gmp_legendre("733535124", "1234123423434535623"))); var_dump(gmp_strval(gmp_legendre(3, "1234123423434535623"))); $n = "123123"; $n1 = "1231231"; var_dump(gmp_strval(gmp_legendre($n, $n1))); var_dump(gmp_strval(gmp_legendre($n, 3))); var_dump(gmp_strval(gmp_legendre(3, $n1))); var_dump(gmp_legendre(3, array())); var_dump(gmp_legendre(array(), 3)); var_dump(gmp_legendre(array(), array())); var_dump(gmp_legendre(array(), array(), 1)); var_dump(gmp_legendre(array())); var_dump(gmp_legendre()); echo "Done\n";