GCC Code Coverage Report


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 94.2% 308 / 0 / 327
Functions: 100.0% 226 / 0 / 226
Branches: 67.7% 172 / 0 / 254

src/math/ds/mint/ms/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 <u64 MOD_>
9 class mint_ms_tag : public mint_impl_::mint_tag_base {
10 static_assert(MOD_ <= UINT32_MAX);
11 using core = montgomery<MOD_>;
12
13 public:
14 static CEXP bool FIXED_MOD = true;
15
16 protected:
17 using raw_t = u32;
18 raw_t v_{};
19 35896183438 CEXP mint_ms_tag() NE = default;
20 64306488240 CEXP mint_ms_tag(int_c auto v) NE : v_{mod(v)} {}
21
22 public:
23 5237190113 static CEXP raw_t mod(sint_c auto v) NE {
24 if CEXP (smost64_c<decltype(v)>) {
25
154/228
unsigned int tifa_libs::mint_ms_tag<1000000007ul>::mod<int>(int):
✓ Branch 0 taken 65764013 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 65764013 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 65764013 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<1000000007ul>::mod<long>(long):
✓ Branch 0 taken 114027697 times.
✓ Branch 1 taken 264 times.
✓ Branch 3 taken 93660876 times.
✓ Branch 4 taken 20366821 times.
✓ Branch 5 taken 93660876 times.
✓ Branch 6 taken 20367085 times.
unsigned int tifa_libs::mint_ms_tag<1000003ul>::mod<int>(int):
✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 11 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 11 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<1004535809ul>::mod<int>(int):
✓ Branch 0 taken 94 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 94 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 94 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<1004535809ul>::mod<long>(long):
✓ Branch 0 taken 532 times.
✓ Branch 1 taken 631 times.
✓ Branch 3 taken 532 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 532 times.
✓ Branch 6 taken 631 times.
unsigned int tifa_libs::mint_ms_tag<1012924417ul>::mod<int>(int):
✓ Branch 0 taken 368563 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 368563 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 368563 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<11ul>::mod<int>(int):
✓ Branch 0 taken 164 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 164 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 164 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<11ul>::mod<long>(long):
✓ Branch 0 taken 227 times.
✓ Branch 1 taken 306 times.
✓ Branch 3 taken 227 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 227 times.
✓ Branch 6 taken 306 times.
unsigned int tifa_libs::mint_ms_tag<13ul>::mod<int>(int):
✓ Branch 0 taken 88 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 88 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 88 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<13ul>::mod<long>(long):
✓ Branch 0 taken 80 times.
✓ Branch 1 taken 96 times.
✓ Branch 3 taken 80 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 80 times.
✓ Branch 6 taken 96 times.
unsigned int tifa_libs::mint_ms_tag<167772161ul>::mod<int>(int):
✓ Branch 0 taken 53825263 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 53825263 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 53825263 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<167772161ul>::mod<long>(long):
✓ Branch 0 taken 576 times.
✓ Branch 1 taken 607 times.
✓ Branch 3 taken 576 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 576 times.
✓ Branch 6 taken 607 times.
unsigned int tifa_libs::mint_ms_tag<17ul>::mod<int>(int):
✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 66 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 66 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<17ul>::mod<long>(long):
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 72 times.
✓ Branch 3 taken 60 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 60 times.
✓ Branch 6 taken 72 times.
unsigned int tifa_libs::mint_ms_tag<19260817ul>::mod<int>(int):
✓ Branch 0 taken 184 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 184 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 184 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<19260817ul>::mod<long>(long):
✓ Branch 0 taken 1175 times.
✓ Branch 1 taken 1151 times.
✓ Branch 3 taken 1175 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1175 times.
✓ Branch 6 taken 1151 times.
unsigned int tifa_libs::mint_ms_tag<19ul>::mod<int>(int):
✓ Branch 0 taken 269 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 269 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 269 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<19ul>::mod<long>(long):
✓ Branch 0 taken 570 times.
✓ Branch 1 taken 534 times.
✓ Branch 3 taken 570 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 570 times.
✓ Branch 6 taken 534 times.
unsigned int tifa_libs::mint_ms_tag<3ul>::mod<int>(int):
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 12 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<3ul>::mod<long>(long):
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 8 times.
✓ Branch 6 taken 8 times.
unsigned int tifa_libs::mint_ms_tag<40961ul>::mod<int>(int):
✓ Branch 0 taken 109 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 109 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 109 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<40961ul>::mod<long>(long):
✓ Branch 0 taken 306 times.
✓ Branch 1 taken 374 times.
✓ Branch 3 taken 306 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 306 times.
✓ Branch 6 taken 374 times.
unsigned int tifa_libs::mint_ms_tag<469762049ul>::mod<int>(int):
✓ Branch 0 taken 53825260 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 53825260 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 53825260 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<469762049ul>::mod<long>(long):
✓ Branch 0 taken 584 times.
✓ Branch 1 taken 614 times.
✓ Branch 3 taken 584 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 584 times.
✓ Branch 6 taken 614 times.
unsigned int tifa_libs::mint_ms_tag<5ul>::mod<int>(int):
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 30 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<5ul>::mod<long>(long):
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 24 times.
✓ Branch 3 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 16 times.
✓ Branch 6 taken 24 times.
unsigned int tifa_libs::mint_ms_tag<65537ul>::mod<int>(int):
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 72 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 72 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<65537ul>::mod<long>(long):
✓ Branch 0 taken 197 times.
✓ Branch 1 taken 233 times.
✓ Branch 3 taken 197 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 197 times.
✓ Branch 6 taken 233 times.
unsigned int tifa_libs::mint_ms_tag<754974721ul>::mod<int>(int):
✓ Branch 0 taken 53825304 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 53825304 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 53825304 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<754974721ul>::mod<long>(long):
✓ Branch 0 taken 880 times.
✓ Branch 1 taken 1010 times.
✓ Branch 3 taken 880 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 880 times.
✓ Branch 6 taken 1010 times.
unsigned int tifa_libs::mint_ms_tag<786433ul>::mod<int>(int):
✓ Branch 0 taken 91 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 91 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 91 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<786433ul>::mod<long>(long):
✓ Branch 0 taken 320 times.
✓ Branch 1 taken 405 times.
✓ Branch 3 taken 320 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 320 times.
✓ Branch 6 taken 405 times.
unsigned int tifa_libs::mint_ms_tag<7ul>::mod<int>(int):
✓ Branch 0 taken 71 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 71 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 71 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<7ul>::mod<long>(long):
✓ Branch 0 taken 61 times.
✓ Branch 1 taken 100 times.
✓ Branch 3 taken 61 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 61 times.
✓ Branch 6 taken 100 times.
unsigned int tifa_libs::mint_ms_tag<998244353ul>::mod<int>(int):
✓ Branch 0 taken 2830357614 times.
✓ Branch 1 taken 11420 times.
✓ Branch 3 taken 2830357614 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2830357614 times.
✓ Branch 6 taken 11420 times.
unsigned int tifa_libs::mint_ms_tag<998244353ul>::mod<long>(long):
✓ Branch 0 taken 2065171002 times.
✓ Branch 1 taken 222 times.
✓ Branch 3 taken 1501382183 times.
✓ Branch 4 taken 563788819 times.
✓ Branch 5 taken 1501382183 times.
✓ Branch 6 taken 563789041 times.
unsigned int tifa_libs::mint_ms_tag<999292927ul>::mod<int>(int):
✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 66 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 66 times.
✗ Branch 6 not taken.
unsigned int tifa_libs::mint_ms_tag<999292927ul>::mod<long>(long):
✓ Branch 0 taken 185 times.
✓ Branch 1 taken 222 times.
✓ Branch 3 taken 185 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 185 times.
✓ Branch 6 taken 222 times.
5237190113 retif_((v >= 0 && (u64)v < mod()) [[likely]], core::reduce(u64((raw_t)v) * core::R2));
26 }
27 584173933 return core::reduce(u64(i32(v % (i32)mod()) + (i32)mod()) * core::R2);
28 }
29 59069298127 static CEXP raw_t mod(uint_c auto v) NE {
30 if CEXP (umost64_c<decltype(v)>) {
31
18/26
unsigned int tifa_libs::mint_ms_tag<1000000007ul>::mod<bool>(bool):
✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_ms_tag<1000000007ul>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 2661333994 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_ms_tag<1000000007ul>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 100818922 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_ms_tag<1000003ul>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 2424499 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_ms_tag<1012924417ul>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 48369187 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_ms_tag<167772161ul>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 42622828 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_ms_tag<167772161ul>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 1039610813 times.
✓ Branch 2 taken 2594088967 times.
unsigned int tifa_libs::mint_ms_tag<469762049ul>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 42622828 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_ms_tag<469762049ul>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 1932912047 times.
✓ Branch 2 taken 1700787733 times.
unsigned int tifa_libs::mint_ms_tag<754974721ul>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 42622828 times.
✗ Branch 2 not taken.
unsigned int tifa_libs::mint_ms_tag<754974721ul>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 2839677866 times.
✓ Branch 2 taken 794021914 times.
unsigned int tifa_libs::mint_ms_tag<998244353ul>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 3718578007 times.
✓ Branch 2 taken 2390 times.
unsigned int tifa_libs::mint_ms_tag<998244353ul>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 41224333333 times.
✓ Branch 2 taken 284469915 times.
59069298127 retif_((cu64 x = (u64)v; x < mod()) [[likely]], core::reduce(x * core::R2), core::reduce(u64(x % mod()) * core::R2));
32 } else retif_((v < mod()) [[likely]], core::reduce(u64((raw_t)v) * core::R2), core::reduce(u64((raw_t)(v % mod())) * core::R2));
33 }
34 77236942594 static CEXP raw_t mod() NE { return MOD_; }
35 23232383239 ND CEXP raw_t val() CNE { return core::norm(core::reduce(v_)); }
36 CEXP raw_t& data() NE { return v_; }
37
38 protected:
39 template <class mint>
40 431984862 ND CEXP auto neg() CNE {
41 431984862 mint res;
42 431984862 res.v_ = (core::MOD2 & -raw_t(v_ != 0)) - v_;
43 431984862 return res;
44 }
45 579027900046 CEXP void add(mint_ms_tag CR r) NE { v_ += r.v_ - core::MOD2, v_ += core::MOD2 & -(v_ >> 31); }
46 531712339075 CEXP void sub(mint_ms_tag CR r) NE { v_ -= r.v_, v_ += core::MOD2 & -(v_ >> 31); }
47 710035534953 CEXP void mul(mint_ms_tag CR r) NE { v_ = core::reduce(u64(v_) * r.v_); }
48 };
49 template <u64 MOD>
50 using mint_ms = mint_impl_::mint<mint_ms_tag<MOD>>;
51
52 } // namespace tifa_libs
53