src/math/ds/mint/md/lib.hpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "../../../../nt/mod/montgomery/lib.hpp" | ||
| 4 | #include "../_base/lib.hpp" | ||
| 5 | |||
| 6 | namespace tifa_libs { | ||
| 7 | |||
| 8 | template <i64 ID> | ||
| 9 | class mint_md_tag : public mint_impl_::mint_tag_base { | ||
| 10 | static inline montgomery<0> core; | ||
| 11 | |||
| 12 | public: | ||
| 13 | static CEXP bool FIXED_MOD = false; | ||
| 14 | 5380 | static CEXP void set_mod(u32 m) NE { core.reset(m); } | |
| 15 | |||
| 16 | protected: | ||
| 17 | using raw_t = u32; | ||
| 18 | raw_t v_{}; | ||
| 19 | 10527966900 | CEXP mint_md_tag() NE = default; | |
| 20 | 46721065823 | CEXP mint_md_tag(int_c auto v) NE : v_{mod(v)} {} | |
| 21 | |||
| 22 | public: | ||
| 23 |
20/36unsigned int tifa_libs::mint_md_tag<11l>::mod<int>(int):
✓ Branch 0 taken 25584018 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_md_tag<11l>::mod<long>(long):
✓ Branch 0 taken 73134690 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_md_tag<12l>::mod<int>(int):
✓ Branch 0 taken 17776903 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_md_tag<12l>::mod<long>(long):
✓ Branch 0 taken 30332502 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_md_tag<13l>::mod<int>(int):
✓ Branch 0 taken 32168576 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_md_tag<13l>::mod<long>(long):
✓ Branch 0 taken 66735236 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_md_tag<14l>::mod<int>(int):
✓ Branch 0 taken 263716193 times.
✓ Branch 1 taken 2284 times.
unsigned int tifa_libs::mint_md_tag<14l>::mod<long>(long):
✓ Branch 0 taken 885091665 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_md_tag<15l>::mod<int>(int):
✓ Branch 0 taken 402550081 times.
✓ Branch 1 taken 6852 times.
unsigned int tifa_libs::mint_md_tag<15l>::mod<long>(long):
✓ Branch 0 taken 285966394 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_md_tag<16l>::mod<int>(int):
✓ Branch 0 taken 323809775 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_md_tag<16l>::mod<long>(long):
✓ Branch 0 taken 15262980 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_md_tag<17l>::mod<int>(int):
✓ Branch 0 taken 12596252 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_md_tag<22l>::mod<int>(int):
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_md_tag<54l>::mod<int>(int):
✓ Branch 0 taken 3125 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_md_tag<69l>::mod<int>(int):
✓ Branch 0 taken 5005002 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_md_tag<8l>::mod<int>(int):
✓ Branch 0 taken 13499512 times.
✗ Branch 1 not taken.
unsigned int tifa_libs::mint_md_tag<8l>::mod<long>(long):
✓ Branch 0 taken 2557502 times.
✗ Branch 1 not taken.
|
2455799557 | static CEXP raw_t mod(sint_c auto v) NE { retif_((v >= 0) [[likely]], mod((to_uint_t<decltype(v)>)v), core.tsf(core.norm(i32(v % (i32)mod())))); } |
| 24 | 46721056687 | static CEXP raw_t mod(uint_c auto v) NE { | |
| 25 | if CEXP (umost64_c<decltype(v)>) { | ||
| 26 |
31/42unsigned int tifa_libs::mint_md_tag<11l>::mod<bool>(bool):
✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_md_tag<11l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 32357942 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_md_tag<11l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 722068062 times.
✓ Branch 2 taken 407046 times.
unsigned int tifa_libs::mint_md_tag<12l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 229336280 times.
✓ Branch 2 taken 20 times.
unsigned int tifa_libs::mint_md_tag<12l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 18024083582 times.
✓ Branch 2 taken 9565546 times.
unsigned int tifa_libs::mint_md_tag<13l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 489720267 times.
✓ Branch 2 taken 20 times.
unsigned int tifa_libs::mint_md_tag<13l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 7458527797 times.
✓ Branch 2 taken 30929134 times.
unsigned int tifa_libs::mint_md_tag<14l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 2218109917 times.
✓ Branch 2 taken 60 times.
unsigned int tifa_libs::mint_md_tag<14l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 8200419888 times.
✓ Branch 2 taken 599465503 times.
unsigned int tifa_libs::mint_md_tag<15l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 3305023169 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_md_tag<15l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 3132860335 times.
✓ Branch 2 taken 170571307 times.
unsigned int tifa_libs::mint_md_tag<16l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 1543978843 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_md_tag<16l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 293993604 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_md_tag<17l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 52200169 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_md_tag<17l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 2400038 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_md_tag<22l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 15 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_md_tag<54l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 12799 times.
✓ Branch 2 taken 2390 times.
unsigned int tifa_libs::mint_md_tag<69l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 15014996 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_md_tag<69l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 9009000 times.
✓ Branch 2 taken 1001000 times.
unsigned int tifa_libs::mint_md_tag<8l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 177440400 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_md_tag<8l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 2557502 times.
✗ Branch 2 not taken.
|
46721056687 | retif_((cu64 x = (u64)v; x < mod()) [[likely]], core.tsf((raw_t)x), core.tsf((raw_t)(x % mod()))); |
| 27 | } else retif_((v < mod()) [[likely]], core.tsf((raw_t)v), core.tsf((raw_t)(v % mod()))); | ||
| 28 | } | ||
| 29 | 56355585304 | static CEXP raw_t mod() NE { return core.MOD; } | |
| 30 | 11519867545 | ND CEXP raw_t val() CNE { | |
| 31 |
17/22tifa_libs::mint_md_tag<11l>::val() const:
✓ Branch 0 taken 1753921797 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<12l>::val() const:
✓ Branch 0 taken 57297286 times.
✓ Branch 1 taken 800004 times.
tifa_libs::mint_md_tag<13l>::val() const:
✓ Branch 0 taken 2183055016 times.
✓ Branch 1 taken 800004 times.
tifa_libs::mint_md_tag<14l>::val() const:
✓ Branch 0 taken 2791692863 times.
✓ Branch 1 taken 3400016 times.
tifa_libs::mint_md_tag<15l>::val() const:
✓ Branch 0 taken 3581199682 times.
✓ Branch 1 taken 1000004 times.
tifa_libs::mint_md_tag<16l>::val() const:
✓ Branch 0 taken 977590648 times.
✓ Branch 1 taken 3000012 times.
tifa_libs::mint_md_tag<17l>::val() const:
✓ Branch 0 taken 112831615 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<22l>::val() const:
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
tifa_libs::mint_md_tag<54l>::val() const:
✓ Branch 0 taken 30264 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<69l>::val() const:
✓ Branch 0 taken 22021994 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<8l>::val() const:
✓ Branch 0 taken 16003410 times.
✓ Branch 1 taken 15222910 times.
|
11519867545 | retif_((!core.OFFSET) [[likely]], core.reduce(v_)); |
| 32 | 24222970 | const raw_t h = core.reduce(v_ >> core.OFFSET); | |
| 33 | 24222970 | return ((h - v_) * core.R & core.MASK) * core.MOD_ODD + h; | |
| 34 | } | ||
| 35 | CEXP raw_t& data() NE { return v_; } | ||
| 36 | |||
| 37 | protected: | ||
| 38 | template <class mint> | ||
| 39 | 203151300 | ND CEXP auto neg() CNE { | |
| 40 | 203151300 | mint res; | |
| 41 |
11/16auto tifa_libs::mint_md_tag<11l>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_md_tag<11l> > >() const:
✓ Branch 0 taken 2317307 times.
✗ Branch 1 not taken.
auto tifa_libs::mint_md_tag<12l>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_md_tag<12l> > >() const:
✓ Branch 0 taken 5883608 times.
✓ Branch 1 taken 127379 times.
auto tifa_libs::mint_md_tag<13l>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_md_tag<13l> > >() const:
✓ Branch 0 taken 61409141 times.
✓ Branch 1 taken 127379 times.
auto tifa_libs::mint_md_tag<14l>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_md_tag<14l> > >() const:
✓ Branch 0 taken 22539992 times.
✓ Branch 1 taken 382137 times.
auto tifa_libs::mint_md_tag<15l>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_md_tag<15l> > >() const:
✓ Branch 0 taken 110364337 times.
✗ Branch 1 not taken.
auto tifa_libs::mint_md_tag<16l>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_md_tag<16l> > >() const:
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
auto tifa_libs::mint_md_tag<17l>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_md_tag<17l> > >() const:
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
auto tifa_libs::mint_md_tag<8l>::neg<tifa_libs::mint_impl_::mint<tifa_libs::mint_md_tag<8l> > >() const:
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
|
203151300 | if (!core.OFFSET) [[likely]] { |
| 42 | 202514397 | res.v_ = (core.MOD_ODD & -raw_t(v_ != 0)) - v_; | |
| 43 | 202514397 | return res; | |
| 44 | } | ||
| 45 | 636903 | const raw_t h = v_ >> core.OFFSET; | |
| 46 | 636903 | res.v_ = (((core.MOD_ODD & -raw_t(h != 0)) - h) << core.OFFSET) | (-v_ & core.MASK); | |
| 47 | 636903 | return res; | |
| 48 | } | ||
| 49 | 58191294173 | CEXP void add(mint_md_tag CR r) NE { | |
| 50 |
14/18tifa_libs::mint_md_tag<11l>::add(tifa_libs::mint_md_tag<11l> const&):
✓ Branch 0 taken 5492671870 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<12l>::add(tifa_libs::mint_md_tag<12l> const&):
✓ Branch 0 taken 23772453716 times.
✓ Branch 1 taken 8 times.
tifa_libs::mint_md_tag<13l>::add(tifa_libs::mint_md_tag<13l> const&):
✓ Branch 0 taken 5148306353 times.
✓ Branch 1 taken 8 times.
tifa_libs::mint_md_tag<14l>::add(tifa_libs::mint_md_tag<14l> const&):
✓ Branch 0 taken 9206096866 times.
✓ Branch 1 taken 25 times.
tifa_libs::mint_md_tag<15l>::add(tifa_libs::mint_md_tag<15l> const&):
✓ Branch 0 taken 6331406678 times.
✓ Branch 1 taken 1 time.
tifa_libs::mint_md_tag<16l>::add(tifa_libs::mint_md_tag<16l> const&):
✓ Branch 0 taken 8213735594 times.
✓ Branch 1 taken 3 times.
tifa_libs::mint_md_tag<17l>::add(tifa_libs::mint_md_tag<17l> const&):
✓ Branch 0 taken 26303951 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<22l>::add(tifa_libs::mint_md_tag<22l> const&):
✗ Branch 0 not taken.
✓ Branch 1 taken 812 times.
tifa_libs::mint_md_tag<54l>::add(tifa_libs::mint_md_tag<54l> const&):
✓ Branch 0 taken 318288 times.
✗ Branch 1 not taken.
|
58191294173 | if (!core.OFFSET) [[likely]] { |
| 51 | 58191293316 | const raw_t h = v_ + r.v_ - core.MOD_ODD; | |
| 52 | 58191293316 | v_ = h + (core.MOD_ODD & -(h >> 31)); | |
| 53 | 58191293316 | return; | |
| 54 | } | ||
| 55 | 857 | const raw_t h = (v_ >> core.OFFSET) + (r.v_ >> core.OFFSET) - core.MOD_ODD; | |
| 56 | 857 | v_ = ((h + (core.MOD_ODD & -(h >> 31))) << core.OFFSET) | ((v_ + r.v_) & core.MASK); | |
| 57 | } | ||
| 58 | 26170619987 | CEXP void sub(mint_md_tag CR r) NE { | |
| 59 |
10/18tifa_libs::mint_md_tag<11l>::sub(tifa_libs::mint_md_tag<11l> const&):
✓ Branch 0 taken 2028861452 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<12l>::sub(tifa_libs::mint_md_tag<12l> const&):
✓ Branch 0 taken 1718257757 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<13l>::sub(tifa_libs::mint_md_tag<13l> const&):
✓ Branch 0 taken 10245748582 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<14l>::sub(tifa_libs::mint_md_tag<14l> const&):
✓ Branch 0 taken 5199487888 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<15l>::sub(tifa_libs::mint_md_tag<15l> const&):
✓ Branch 0 taken 1974555834 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<16l>::sub(tifa_libs::mint_md_tag<16l> const&):
✓ Branch 0 taken 3881513805 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<17l>::sub(tifa_libs::mint_md_tag<17l> const&):
✓ Branch 0 taken 696057125 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<54l>::sub(tifa_libs::mint_md_tag<54l> const&):
✓ Branch 0 taken 147132 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<8l>::sub(tifa_libs::mint_md_tag<8l> const&):
✓ Branch 0 taken 1638 times.
✓ Branch 1 taken 425988774 times.
|
26170619987 | if (!core.OFFSET) [[likely]] { |
| 60 | 25744631213 | const raw_t h = v_ - r.v_; | |
| 61 | 25744631213 | v_ = h + (core.MOD_ODD & -(h >> 31)); | |
| 62 | 25744631213 | return; | |
| 63 | } | ||
| 64 | 425988774 | const raw_t h = (v_ >> core.OFFSET) - (r.v_ >> core.OFFSET); | |
| 65 | 425988774 | v_ = ((h + (core.MOD_ODD & -(h >> 31))) << core.OFFSET) | ((v_ - r.v_) & core.MASK); | |
| 66 | } | ||
| 67 | 92495467377 | CEXP void mul(mint_md_tag CR r) NE { | |
| 68 |
17/22tifa_libs::mint_md_tag<11l>::mul(tifa_libs::mint_md_tag<11l> const&):
✓ Branch 0 taken 6686339065 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<12l>::mul(tifa_libs::mint_md_tag<12l> const&):
✓ Branch 0 taken 43622189725 times.
✓ Branch 1 taken 73551860 times.
tifa_libs::mint_md_tag<13l>::mul(tifa_libs::mint_md_tag<13l> const&):
✓ Branch 0 taken 13287785762 times.
✓ Branch 1 taken 73551860 times.
tifa_libs::mint_md_tag<14l>::mul(tifa_libs::mint_md_tag<14l> const&):
✓ Branch 0 taken 9972944882 times.
✓ Branch 1 taken 222155465 times.
tifa_libs::mint_md_tag<15l>::mul(tifa_libs::mint_md_tag<15l> const&):
✓ Branch 0 taken 8987318036 times.
✓ Branch 1 taken 1499885 times.
tifa_libs::mint_md_tag<16l>::mul(tifa_libs::mint_md_tag<16l> const&):
✓ Branch 0 taken 6779029467 times.
✓ Branch 1 taken 4499655 times.
tifa_libs::mint_md_tag<17l>::mul(tifa_libs::mint_md_tag<17l> const&):
✓ Branch 0 taken 352955778 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<22l>::mul(tifa_libs::mint_md_tag<22l> const&):
✗ Branch 0 not taken.
✓ Branch 1 taken 812 times.
tifa_libs::mint_md_tag<54l>::mul(tifa_libs::mint_md_tag<54l> const&):
✓ Branch 0 taken 474364 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<69l>::mul(tifa_libs::mint_md_tag<69l> const&):
✓ Branch 0 taken 87898320 times.
✗ Branch 1 not taken.
tifa_libs::mint_md_tag<8l>::mul(tifa_libs::mint_md_tag<8l> const&):
✓ Branch 0 taken 182509043 times.
✓ Branch 1 taken 427494342 times.
|
92495467377 | if (!core.OFFSET) [[likely]] { |
| 69 | 91692713498 | v_ = core.reduce((u64)v_ * r.v_); | |
| 70 | 91692713498 | return; | |
| 71 | } | ||
| 72 | 802753879 | v_ = (core.reduce((u64)(v_ >> core.OFFSET) * (r.v_ >> core.OFFSET)) << core.OFFSET) | ((v_ * r.v_) & core.MASK); | |
| 73 | } | ||
| 74 | }; | ||
| 75 | template <i64 ID> | ||
| 76 | using mint_md = mint_impl_::mint<mint_md_tag<ID>>; | ||
| 77 | |||
| 78 | } // namespace tifa_libs | ||
| 79 |