GCC Code Coverage Report


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 87.1% 370 / 0 / 425
Functions: 99.4% 157 / 0 / 158
Branches: 69.0% 120 / 0 / 174

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/36
unsigned 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/42
unsigned 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/22
tifa_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/16
auto 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/18
tifa_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/18
tifa_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/22
tifa_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