Example #1
0
int isPrime(mpz_int num)
{
	mpz_t nt;
	mpz_init(nt);
	mpz_set(nt, num.backend().data());
	return mpz_probab_prime_p(nt, PRIME_TEST_REPS); //Miller-Rabin probabilistic primality test
}
Example #2
0
return_values bs(const mpz_int &a, const mpz_int &b)
{
    const mpz_int C_cubed_over_24 = 10939058860032000ll; // C = 640320;
    mpz_int Pab, Qab, Tab;

    if (b - a == 1)
    {
        if (a == 0)
        {
            Pab = Qab = 1;
        }
        else
        {
            Pab = (6*a-5) * (2*a-1) * (6*a-1);
            mpz_int a_cubed;
            mpz_pow_ui(a_cubed.backend().data(), a.backend().data(), 3);
            Qab = a_cubed * C_cubed_over_24;

        }
        Tab = Pab * (13591409 + 545140134*a);

        if (a & 1)
        {
            Tab *= -1;
        }
    }
    else
    {
        mpz_int m;
        m = (a+b) / 2;

        mpz_int Pam, Qam, Tam;
        std::tie(Pam, Qam, Tam) = bs(a, m);

        mpz_int Pmb, Qmb, Tmb;
        std::tie(Pmb, Qmb, Tmb) = bs(m, b);

        Pab = Pam * Pmb;
        Qab = Qam * Qmb;
        Tab = Qmb * Tam + Pam * Tmb;
    }
    // std::cout << "P Q T: " << Pab << ", " << Qab << ", " << Tab << std::endl;

    return_values return_tuple(Pab, Qab, Tab);

    return return_tuple;
};