<?php

/** @generate-class-entries */

/**
 * @var int
 * @cvalue GMP_ROUND_ZERO
 */
const GMP_ROUND_ZERO = UNKNOWN;
/**
 * @var int
 * @cvalue GMP_ROUND_PLUSINF
 */
const GMP_ROUND_PLUSINF = UNKNOWN;
/**
 * @var int
 * @cvalue GMP_ROUND_MINUSINF
 */
const GMP_ROUND_MINUSINF = UNKNOWN;

#ifdef mpir_version
/**
 * @var string
 * @cvalue GMP_MPIR_VERSION_STRING
 */
const GMP_MPIR_VERSION = UNKNOWN;
#endif
/**
 * @var string
 * @cvalue GMP_VERSION_STRING
 */
const GMP_VERSION = UNKNOWN;

/**
 * @var int
 * @cvalue GMP_MSW_FIRST
 */
const GMP_MSW_FIRST = UNKNOWN;
/**
 * @var int
 * @cvalue GMP_LSW_FIRST
 */
const GMP_LSW_FIRST = UNKNOWN;
/**
 * @var int
 * @cvalue GMP_LITTLE_ENDIAN
 */
const GMP_LITTLE_ENDIAN = UNKNOWN;
/**
 * @var int
 * @cvalue GMP_BIG_ENDIAN
 */
const GMP_BIG_ENDIAN = UNKNOWN;
/**
 * @var int
 * @cvalue GMP_NATIVE_ENDIAN
 */
const GMP_NATIVE_ENDIAN = UNKNOWN;

final class GMP
{
    public function __construct(int|string $num = 0, int $base = 0) {}

    public function __serialize(): array {}

    public function __unserialize(array $data): void {}
}

function gmp_init(int|string $num, int $base = 0): GMP {}

function gmp_import(string $data, int $word_size = 1, int $flags = GMP_MSW_FIRST | GMP_NATIVE_ENDIAN): GMP {}

function gmp_export(GMP|int|string $num, int $word_size = 1, int $flags = GMP_MSW_FIRST | GMP_NATIVE_ENDIAN): string {}

function gmp_intval(GMP|int|string $num): int {}

function gmp_strval(GMP|int|string $num, int $base = 10): string {}

function gmp_add(GMP|int|string $num1, GMP|int|string $num2): GMP {}

function gmp_sub(GMP|int|string $num1, GMP|int|string $num2): GMP {}

function gmp_mul(GMP|int|string $num1, GMP|int|string $num2): GMP {}

/**
 * @return array<int, GMP>
 * @refcount 1
 */
function gmp_div_qr(GMP|int|string $num1, GMP|int|string $num2, int $rounding_mode = GMP_ROUND_ZERO): array {}

function gmp_div_q(GMP|int|string $num1, GMP|int|string $num2, int $rounding_mode = GMP_ROUND_ZERO): GMP {}

function gmp_div_r(GMP|int|string $num1, GMP|int|string $num2, int $rounding_mode = GMP_ROUND_ZERO): GMP {}

/** @alias gmp_div_q */
function gmp_div(GMP|int|string $num1, GMP|int|string $num2, int $rounding_mode = GMP_ROUND_ZERO): GMP {}

function gmp_mod(GMP|int|string $num1, GMP|int|string $num2): GMP {}

function gmp_divexact(GMP|int|string $num1, GMP|int|string $num2): GMP {}

function gmp_neg(GMP|int|string $num): GMP {}

function gmp_abs(GMP|int|string $num): GMP {}

function gmp_fact(GMP|int|string $num): GMP {}

function gmp_sqrt(GMP|int|string $num): GMP {}

/**
 * @return array<int, GMP>
 * @refcount 1
 */
function gmp_sqrtrem(GMP|int|string $num): array {}

function gmp_root(GMP|int|string $num, int $nth): GMP {}

/**
 * @return array<int, GMP>
 * @refcount 1
 */
function gmp_rootrem(GMP|int|string $num, int $nth): array {}

function gmp_pow(GMP|int|string $num, int $exponent): GMP {}

function gmp_powm(GMP|int|string $num, GMP|int|string $exponent, GMP|int|string $modulus): GMP {}

#ifdef HAVE___GMPZ_POWM_SEC
function gmp_powm_sec(GMP|int|string $num, GMP|int|string $exponent, GMP|int|string $modulus): GMP {}
#endif

function gmp_perfect_square(GMP|int|string $num): bool {}

function gmp_perfect_power(GMP|int|string $num): bool {}

function gmp_prob_prime(GMP|int|string $num, int $repetitions = 10): int {}

function gmp_gcd(GMP|int|string $num1, GMP|int|string $num2): GMP {}

/**
 * @return array<string, GMP>
 * @refcount 1
 */
function gmp_gcdext(GMP|int|string $num1, GMP|int|string $num2): array {}

function gmp_lcm(GMP|int|string $num1, GMP|int|string $num2): GMP {}

function gmp_invert(GMP|int|string $num1, GMP|int|string $num2): GMP|false {}

function gmp_jacobi(GMP|int|string $num1, GMP|int|string $num2): int {}

function gmp_legendre(GMP|int|string $num1, GMP|int|string $num2): int {}

function gmp_kronecker(GMP|int|string $num1, GMP|int|string $num2): int {}

function gmp_cmp(GMP|int|string $num1, GMP|int|string $num2): int {}

function gmp_sign(GMP|int|string $num): int {}

function gmp_random_seed(GMP|int|string $seed): void {}

function gmp_random_bits(int $bits): GMP {}

function gmp_random_range(GMP|int|string $min, GMP|int|string $max): GMP {}

function gmp_and(GMP|int|string $num1, GMP|int|string $num2): GMP {}

function gmp_or(GMP|int|string $num1, GMP|int|string $num2): GMP {}

function gmp_com(GMP|int|string $num): GMP {}

function gmp_xor(GMP|int|string $num1, GMP|int|string $num2): GMP {}

function gmp_setbit(GMP $num, int $index, bool $value = true): void {}

function gmp_clrbit(GMP $num, int $index): void {}

function gmp_testbit(GMP|int|string $num, int $index): bool {}

function gmp_scan0(GMP|int|string $num1, int $start): int {}

function gmp_scan1(GMP|int|string $num1, int $start): int {}

function gmp_popcount(GMP|int|string $num): int {}

function gmp_hamdist(GMP|int|string $num1, GMP|int|string $num2): int {}

function gmp_nextprime(GMP|int|string $num): GMP {}

#ifdef HAVE___GMPZ_PREVPRIME
/** @param bool $definitely_prime */
function gmp_prevprime(GMP|int|string $num, &$definitely_prime = null): GMP {}
#endif

function gmp_binomial(GMP|int|string $n, int $k): GMP {}
