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/228unsigned 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/26unsigned 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 |