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 }
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; };