5#include "cplib/num/mmint.hpp"
6#include "cplib/num/pow.hpp"
26 const Fp fp0(0), fp1(1);
28 if (n == fp0 || p == 2) {
30 }
else if (
pow(n, (p - 1) / 2) != fp1) {
32 }
else if (p % 4 == 3) {
33 return pow(n, (p + 1) / 4);
39 }
while (
pow(w2, (p - 1) / 2) == fp1);
40 std::pair<Fp, Fp>
pow{a, fp1};
41 std::pair<Fp, Fp> ret{fp1, fp0};
50 Fp arbp_brap = (ar + br) * (ap + bp) - (arap + brbp);
51 ret = {arap + brbp * w2, arbp_brap};
54 pow = {ap * ap + bp * bp * w2, apbp + apbp};
69template <
typename T, std::enable_if_t<std::is_
unsigned_v<T>>* =
nullptr>
75 return mmint_by_modulus(
76 [](
const auto& n_mod_p) {
78 return ret ? ret->val() : std::optional<T>();
constexpr T pow(T base, uint64_t exp, Op &&op={})
A generic exponetiation by squaring function.
Definition: pow.hpp:14
std::optional< T > sqrt_mod_prime(T n, T p)
Square root modulo a prime number.
Definition: sqrt.hpp:70
std::optional< Fp > sqrt_mod_fp(Fp n)
Square root modulo a prime number.
Definition: sqrt.hpp:25