src/math/ds/mint/bd/lib.hpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "../../../../nt/mod/barrett/lib.hpp" | ||
| 4 | #include "../_base/lib.hpp" | ||
| 5 | |||
| 6 | namespace tifa_libs { | ||
| 7 | |||
| 8 | template <i64 ID> | ||
| 9 | class mint_bd_tag : public mint_impl_::mint_tag_base { | ||
| 10 | static inline barrett<0> core; | ||
| 11 | |||
| 12 | public: | ||
| 13 | static CEXP bool FIXED_MOD = false; | ||
| 14 | 5473 | static CEXP void set_mod(u32 m) NE { core.reset(m); } | |
| 15 | |||
| 16 | protected: | ||
| 17 | using raw_t = u32; | ||
| 18 | raw_t v_{}; | ||
| 19 | 11820906307 | CEXP mint_bd_tag() NE = default; | |
| 20 | 47783867050 | CEXP mint_bd_tag(int_c auto v) NE : v_{mod(v)} {} | |
| 21 | |||
| 22 | public: | ||
| 23 | 2445532897 | static CEXP raw_t mod(sint_c auto v) NE { | |
| 24 |
15/26unsigned int tifa_libs::mint_bd_tag<11l>::mod<int>(int):
✓ Branch 0 taken 25584018 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bd_tag<11l>::mod<long>(long):
✓ Branch 0 taken 73134690 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bd_tag<12l>::mod<int>(int):
✓ Branch 0 taken 17776903 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bd_tag<12l>::mod<long>(long):
✓ Branch 0 taken 30332502 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bd_tag<13l>::mod<int>(int):
✓ Branch 0 taken 32168167 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bd_tag<13l>::mod<long>(long):
✓ Branch 0 taken 66735236 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bd_tag<14l>::mod<int>(int):
✓ Branch 0 taken 263716307 times.
✓ Branch 1 taken 2284 times.
unsigned int tifa_libs::mint_bd_tag<14l>::mod<long>(long):
✓ Branch 0 taken 885091678 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bd_tag<15l>::mod<int>(int):
✓ Branch 0 taken 402550937 times.
✓ Branch 1 taken 6852 times.
unsigned int tifa_libs::mint_bd_tag<15l>::mod<long>(long):
✓ Branch 0 taken 296764316 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bd_tag<16l>::mod<int>(int):
✓ Branch 0 taken 323809775 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bd_tag<16l>::mod<long>(long):
✓ Branch 0 taken 15262980 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_bd_tag<17l>::mod<int>(int):
✓ Branch 0 taken 12596252 times.
✗ Branch 1 not taken.
|
2445532897 | if (v >= 0) return mod((to_uint_t<decltype(v)>)v); |
| 25 |
2/26unsigned int tifa_libs::mint_bd_tag<11l>::mod<int>(int):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bd_tag<11l>::mod<long>(long):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bd_tag<12l>::mod<int>(int):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bd_tag<12l>::mod<long>(long):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bd_tag<13l>::mod<int>(int):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bd_tag<13l>::mod<long>(long):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bd_tag<14l>::mod<int>(int):
✓ Branch 1 taken 2284 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bd_tag<14l>::mod<long>(long):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bd_tag<15l>::mod<int>(int):
✓ Branch 1 taken 6852 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bd_tag<15l>::mod<long>(long):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bd_tag<16l>::mod<int>(int):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bd_tag<16l>::mod<long>(long):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_bd_tag<17l>::mod<int>(int):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
|
9136 | if (auto ret = mod((to_uint_t<decltype(v)>)-v); ret) return mod() - ret; |
| 26 | ✗ | else return ret; | |
| 27 | } | ||
| 28 | 47783867050 | static CEXP raw_t mod(uint_c auto v) NE { | |
| 29 | 47783867050 | if CEXP (umost64_c<decltype(v)>) return (raw_t)core.reduce((u64)v); | |
| 30 | else if (v < UINT64_MAX) return (raw_t)core.reduce((u64)v); | ||
| 31 | else return raw_t(v % mod()); | ||
| 32 | } | ||
| 33 | 92331410864 | static CEXP raw_t mod() NE { return (raw_t)core.mod; } | |
| 34 | 12091438327 | ND CEXP raw_t val() CNE { return v_; } | |
| 35 | CEXP raw_t& data() NE { return v_; } | ||
| 36 | |||
| 37 | protected: | ||
| 38 | template <class mint> | ||
| 39 | 354711400 | CEXP auto neg() CNE { | |
| 40 | 354711400 | mint res; | |
| 41 |
12/14auto tifa_libs::mint_bd_tag<11l>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_bd_tag<11l> > >() const:
✓ Branch 0 taken 2183943 times.
✓ Branch 1 taken 133364 times.
auto tifa_libs::mint_bd_tag<12l>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_bd_tag<12l> > >() const:
✓ Branch 0 taken 5234319 times.
✓ Branch 1 taken 776668 times.
auto tifa_libs::mint_bd_tag<13l>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_bd_tag<13l> > >() const:
✓ Branch 0 taken 60758574 times.
✓ Branch 1 taken 777943 times.
auto tifa_libs::mint_bd_tag<14l>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_bd_tag<14l> > >() const:
✓ Branch 0 taken 71748303 times.
✓ Branch 1 taken 1693863 times.
auto tifa_libs::mint_bd_tag<15l>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_bd_tag<15l> > >() const:
✓ Branch 0 taken 210923847 times.
✓ Branch 1 taken 480564 times.
auto tifa_libs::mint_bd_tag<16l>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_bd_tag<16l> > >() const:
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
auto tifa_libs::mint_bd_tag<17l>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_bd_tag<17l> > >() const:
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
354711400 | if (v_) res.v_ = mod() - v_; |
| 42 | 354711400 | return res; | |
| 43 | } | ||
| 44 | 58864872105 | CEXP void add(mint_bd_tag CR r) NE { | |
| 45 |
13/14tifa_libs::mint_bd_tag<11l>::add(tifa_libs::mint_bd_tag<11l> const&):
✓ Branch 1 taken 2648668700 times.
✓ Branch 2 taken 2844003170 times.
tifa_libs::mint_bd_tag<12l>::add(tifa_libs::mint_bd_tag<12l> const&):
✓ Branch 1 taken 9920194916 times.
✓ Branch 2 taken 13852258808 times.
tifa_libs::mint_bd_tag<13l>::add(tifa_libs::mint_bd_tag<13l> const&):
✓ Branch 1 taken 653357149 times.
✓ Branch 2 taken 4494949212 times.
tifa_libs::mint_bd_tag<14l>::add(tifa_libs::mint_bd_tag<14l> const&):
✓ Branch 1 taken 1385178907 times.
✓ Branch 2 taken 7951968042 times.
tifa_libs::mint_bd_tag<15l>::add(tifa_libs::mint_bd_tag<15l> const&):
✓ Branch 1 taken 1789560713 times.
✓ Branch 2 taken 5084692940 times.
tifa_libs::mint_bd_tag<16l>::add(tifa_libs::mint_bd_tag<16l> const&):
✓ Branch 1 taken 1692166611 times.
✓ Branch 2 taken 6521568986 times.
tifa_libs::mint_bd_tag<17l>::add(tifa_libs::mint_bd_tag<17l> const&):
✗ Branch 1 not taken.
✓ Branch 2 taken 26303951 times.
|
58864872105 | if ((v_ += r.v_) >= mod()) v_ -= mod(); |
| 46 | 58864872105 | } | |
| 47 | 25859809213 | CEXP void sub(mint_bd_tag CR r) NE { | |
| 48 |
14/14tifa_libs::mint_bd_tag<11l>::sub(tifa_libs::mint_bd_tag<11l> const&):
✓ Branch 0 taken 76574346 times.
✓ Branch 1 taken 1952287106 times.
tifa_libs::mint_bd_tag<12l>::sub(tifa_libs::mint_bd_tag<12l> const&):
✓ Branch 0 taken 802598996 times.
✓ Branch 1 taken 915658761 times.
tifa_libs::mint_bd_tag<13l>::sub(tifa_libs::mint_bd_tag<13l> const&):
✓ Branch 0 taken 2310857184 times.
✓ Branch 1 taken 7934759935 times.
tifa_libs::mint_bd_tag<14l>::sub(tifa_libs::mint_bd_tag<14l> const&):
✓ Branch 0 taken 678925194 times.
✓ Branch 1 taken 4550572705 times.
tifa_libs::mint_bd_tag<15l>::sub(tifa_libs::mint_bd_tag<15l> const&):
✓ Branch 0 taken 772022661 times.
✓ Branch 1 taken 1287981395 times.
tifa_libs::mint_bd_tag<16l>::sub(tifa_libs::mint_bd_tag<16l> const&):
✓ Branch 0 taken 995420730 times.
✓ Branch 1 taken 2886093075 times.
tifa_libs::mint_bd_tag<17l>::sub(tifa_libs::mint_bd_tag<17l> const&):
✓ Branch 0 taken 168451809 times.
✓ Branch 1 taken 527605316 times.
|
25859809213 | if (i32(v_ -= r.v_) < 0) v_ += mod(); |
| 49 | 25859809213 | } | |
| 50 | 93955402036 | CEXP void mul(mint_bd_tag CR r) NE { v_ = (raw_t)core.reduce(u64(v_) * r.v_); } | |
| 51 | }; | ||
| 52 | template <i64 ID> | ||
| 53 | using mint_bd = mint_impl_::mint<mint_bd_tag<ID>>; | ||
| 54 | |||
| 55 | } // namespace tifa_libs | ||
| 56 |