// gmp_init (although that's probably tested well by now) var_dump($a = gmp_init(123456)); var_dump($b = gmp_init("0xFFFFDEBACDFEDF7200")); // 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
<?php for ($i = -1; $i < 10; $i++) { var_dump(gmp_strval(gmp_jacobi($i * $i - 1, 3))); } var_dump(gmp_strval(gmp_jacobi(7, 23))); var_dump(gmp_strval(gmp_jacobi("733535124", "1234123423434535623"))); var_dump(gmp_strval(gmp_jacobi(3, "1234123423434535623"))); $n = "123123"; $n1 = "1231231"; var_dump(gmp_strval(gmp_jacobi($n, $n1))); var_dump(gmp_strval(gmp_jacobi($n, 3))); var_dump(gmp_strval(gmp_jacobi(3, $n1))); var_dump(gmp_jacobi(3, array())); var_dump(gmp_jacobi(array(), 3)); var_dump(gmp_jacobi(array(), array())); var_dump(gmp_jacobi(array(), array(), 1)); var_dump(gmp_jacobi(array())); var_dump(gmp_jacobi()); echo "Done\n";
public static function jacobi($a, $n) { if (extension_loaded('gmp') && USE_EXT == 'GMP') { return gmp_strval(gmp_jacobi($a, $n)); } elseif (extension_loaded('bcmath') && USE_EXT == 'BCMATH') { if ($n >= 3 && $n % 2 == 1) { $a = bcmod($a, $n); if ($a == 0) { return 0; } if ($a == 1) { return 1; } $a1 = $a; $e = 0; while (bcmod($a1, 2) == 0) { $a1 = bcdiv($a1, 2); $e = bcadd($e, 1); } if (bcmod($e, 2) == 0 || bcmod($n, 8) == 1 || bcmod($n, 8) == 7) { $s = 1; } else { $s = -1; } if ($a1 == 1) { return $s; } if (bcmod($n, 4) == 3 && bcmod($a1, 4) == 3) { $s = -$s; } return bcmul($s, self::jacobi(bcmod($n, $a1), $a1)); } } else { throw new ErrorException("Please install BCMATH or GMP"); } }
/** * {@inheritDoc} * @see \Mdanter\Ecc\MathAdapterInterface::jacobi() */ public function jacobi($a, $n) { return gmp_strval(gmp_jacobi(gmp_init($a, 10), gmp_init($n, 10))); }