1#ifndef MODULAR_ARITHMETIC_H
2#define MODULAR_ARITHMETIC_H
10 static constexpr int MODULO =
static_cast<int>(1e9 + 7);
14 auto a =
static_cast<std::int64_t
>(x);
15 auto b =
static_cast<std::int64_t
>(y);
17 return static_cast<int>(c);
29 auto a =
static_cast<std::int64_t
>(x);
30 auto b =
static_cast<std::int64_t
>(y);
34 return static_cast<int>(c);
39 auto a =
static_cast<std::int64_t
>(x);
40 auto b =
static_cast<std::int64_t
>(y);
42 return static_cast<int>(c);
47 auto a =
static_cast<int64_t
>(x);
49 return static_cast<int>(b);
54 auto a =
static_cast<int64_t
>(x);
57 return static_cast<int>(c);
63 constexpr size_t N = 25;
64 constexpr auto lookup{[]()
constexpr
66 std::array<int, N> a{};
68 for (
size_t i = 1; i < N; i++)
76 return lookup[exponent] %
MODULO;
78 auto half_e = exponent >> 1;
79 auto tmp =
static_cast<std::int64_t
>(
modular_pow2(half_e));
80 auto m = (exponent & 1);
81 return ((tmp * tmp) << m) %
MODULO;
Definition big_integer.hpp:14
constexpr int modular_subtract(int x, int y)
Definition modular_arithmetic.hpp:27
static constexpr int MODULO
Definition modular_arithmetic.hpp:10
constexpr int modular_multiply(int x, int y)
Definition modular_arithmetic.hpp:37
constexpr int modular_cube(int x)
Definition modular_arithmetic.hpp:52
constexpr int additive_inverse(int x)
Definition modular_arithmetic.hpp:20
constexpr int modular_add(int x, int y)
Definition modular_arithmetic.hpp:12
static int modular_pow2(size_t exponent)
Definition modular_arithmetic.hpp:61
constexpr int modular_square(int x)
Definition modular_arithmetic.hpp:45