src/math/ds/mint/ms64/lib.hpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "../../../../nt/mod/montgomery64/lib.hpp" | ||
| 4 | #include "../_base/lib.hpp" | ||
| 5 | |||
| 6 | namespace tifa_libs { | ||
| 7 | |||
| 8 | template <u64 MOD> | ||
| 9 | class mint_ms64_tag : public mint_impl_::mint_tag_base { | ||
| 10 | using core = montgomery64<MOD>; | ||
| 11 | |||
| 12 | public: | ||
| 13 | static CEXP bool FIXED_MOD = true; | ||
| 14 | |||
| 15 | protected: | ||
| 16 | using raw_t = u64; | ||
| 17 | raw_t v_{}; | ||
| 18 | 32072518880 | CEXP mint_ms64_tag() NE = default; | |
| 19 | 37418163479 | CEXP mint_ms64_tag(int_c auto v) NE : v_{mod(v)} {} | |
| 20 | |||
| 21 | public: | ||
| 22 | 2849645418 | static CEXP raw_t mod(sint_c auto v) NE { | |
| 23 | if CEXP (smost64_c<decltype(v)>) { | ||
| 24 |
102/156unsigned long tifa_libs::mint_ms64_tag<1000000007ul>::mod<int>(int):
✓ Branch 0 taken 39078311 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 39078311 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 39078311 times.
✗ Branch 6 not taken.
unsigned long tifa_libs::mint_ms64_tag<1000000007ul>::mod<long>(long):
✓ Branch 0 taken 114027477 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 93660656 times.
✓ Branch 4 taken 20366821 times.
✓ Branch 5 taken 93660656 times.
✓ Branch 6 taken 20366821 times.
unsigned long tifa_libs::mint_ms64_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 long tifa_libs::mint_ms64_tag<1231453023109121ul>::mod<int>(int):
✓ Branch 0 taken 110 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 110 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 110 times.
✗ Branch 6 not taken.
unsigned long tifa_libs::mint_ms64_tag<1231453023109121ul>::mod<long>(long):
✓ Branch 0 taken 1045 times.
✓ Branch 1 taken 1254 times.
✓ Branch 3 taken 1045 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1045 times.
✓ Branch 6 taken 1254 times.
unsigned long tifa_libs::mint_ms64_tag<167772161ul>::mod<int>(int):
✓ Branch 0 taken 53053523 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 53053523 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 53053523 times.
✗ Branch 6 not taken.
unsigned long tifa_libs::mint_ms64_tag<180143985094819841ul>::mod<int>(int):
✓ Branch 0 taken 99 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 99 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 99 times.
✗ Branch 6 not taken.
unsigned long tifa_libs::mint_ms64_tag<180143985094819841ul>::mod<long>(long):
✓ Branch 0 taken 1060 times.
✓ Branch 1 taken 1121 times.
✓ Branch 3 taken 1060 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1060 times.
✓ Branch 6 taken 1121 times.
unsigned long tifa_libs::mint_ms64_tag<2013265921ul>::mod<int>(int):
✓ Branch 0 taken 154 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 154 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 154 times.
✗ Branch 6 not taken.
unsigned long tifa_libs::mint_ms64_tag<2013265921ul>::mod<long>(long):
✓ Branch 0 taken 799 times.
✓ Branch 1 taken 1199 times.
✓ Branch 3 taken 799 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 799 times.
✓ Branch 6 taken 1199 times.
unsigned long tifa_libs::mint_ms64_tag<2061584302081ul>::mod<int>(int):
✓ Branch 0 taken 131 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 131 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 131 times.
✗ Branch 6 not taken.
unsigned long tifa_libs::mint_ms64_tag<2061584302081ul>::mod<long>(long):
✓ Branch 0 taken 953 times.
✓ Branch 1 taken 1258 times.
✓ Branch 3 taken 953 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 953 times.
✓ Branch 6 taken 1258 times.
unsigned long tifa_libs::mint_ms64_tag<3799912185593857ul>::mod<int>(int):
✓ Branch 0 taken 3264 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 3264 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3264 times.
✗ Branch 6 not taken.
unsigned long tifa_libs::mint_ms64_tag<3799912185593857ul>::mod<long>(long):
✓ Branch 0 taken 1261 times.
✓ Branch 1 taken 1538 times.
✓ Branch 3 taken 1261 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1261 times.
✓ Branch 6 taken 1538 times.
unsigned long tifa_libs::mint_ms64_tag<4179340454199820289ul>::mod<int>(int):
✓ Branch 0 taken 96 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 96 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 96 times.
✗ Branch 6 not taken.
unsigned long tifa_libs::mint_ms64_tag<4179340454199820289ul>::mod<long>(long):
✓ Branch 0 taken 955 times.
✓ Branch 1 taken 1335 times.
✓ Branch 3 taken 955 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 955 times.
✓ Branch 6 taken 1335 times.
unsigned long tifa_libs::mint_ms64_tag<469762049ul>::mod<int>(int):
✓ Branch 0 taken 53053523 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 53053523 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 53053523 times.
✗ Branch 6 not taken.
unsigned long tifa_libs::mint_ms64_tag<6597069766657ul>::mod<int>(int):
✓ Branch 0 taken 106 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 106 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 106 times.
✗ Branch 6 not taken.
unsigned long tifa_libs::mint_ms64_tag<6597069766657ul>::mod<long>(long):
✓ Branch 0 taken 753 times.
✓ Branch 1 taken 974 times.
✓ Branch 3 taken 753 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 753 times.
✓ Branch 6 taken 974 times.
unsigned long tifa_libs::mint_ms64_tag<75161927681ul>::mod<int>(int):
✓ Branch 0 taken 121 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 121 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 121 times.
✗ Branch 6 not taken.
unsigned long tifa_libs::mint_ms64_tag<75161927681ul>::mod<long>(long):
✓ Branch 0 taken 804 times.
✓ Branch 1 taken 1033 times.
✓ Branch 3 taken 804 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 804 times.
✓ Branch 6 taken 1033 times.
unsigned long tifa_libs::mint_ms64_tag<754974721ul>::mod<int>(int):
✓ Branch 0 taken 53053523 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 53053523 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 53053523 times.
✗ Branch 6 not taken.
unsigned long tifa_libs::mint_ms64_tag<77309411329ul>::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 long tifa_libs::mint_ms64_tag<77309411329ul>::mod<long>(long):
✓ Branch 0 taken 651 times.
✓ Branch 1 taken 880 times.
✓ Branch 3 taken 651 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 651 times.
✓ Branch 6 taken 880 times.
unsigned long tifa_libs::mint_ms64_tag<998244353ul>::mod<int>(int):
✓ Branch 0 taken 533909168 times.
✓ Branch 1 taken 6852 times.
✓ Branch 3 taken 533909168 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 533909168 times.
✓ Branch 6 taken 6852 times.
unsigned long tifa_libs::mint_ms64_tag<998244353ul>::mod<long>(long):
✓ Branch 0 taken 2003071415 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 1439282596 times.
✓ Branch 4 taken 563788819 times.
✓ Branch 5 taken 1439282596 times.
✓ Branch 6 taken 563788819 times.
|
2849645418 | retif_((v >= 0 && (u64)v < mod()) [[likely]], core::redc_mul((u64)v, core::R2)); |
| 25 | } | ||
| 26 | 584173084 | return core::redc_mul(core::norm(i64(v % (i64)mod())), core::R2); | |
| 27 | } | ||
| 28 | 34568518061 | static CEXP raw_t mod(uint_c auto v) NE { | |
| 29 | if CEXP (umost64_c<decltype(v)>) { | ||
| 30 |
16/24unsigned long tifa_libs::mint_ms64_tag<1000000007ul>::mod<bool>(bool):
✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_ms64_tag<1000000007ul>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 2473411062 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_ms64_tag<1000000007ul>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 108806098 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_ms64_tag<1012924417ul>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 27056658 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_ms64_tag<1012924417ul>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 21312529 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_ms64_tag<167772161ul>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 1039619671 times.
✓ Branch 2 taken 2594088967 times.
unsigned long tifa_libs::mint_ms64_tag<3799912185593857ul>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 3120 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_ms64_tag<3799912185593857ul>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 8944 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_ms64_tag<469762049ul>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 1932920905 times.
✓ Branch 2 taken 1700787733 times.
unsigned long tifa_libs::mint_ms64_tag<754974721ul>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 2839686724 times.
✓ Branch 2 taken 794021914 times.
unsigned long tifa_libs::mint_ms64_tag<998244353ul>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 2158589988 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_ms64_tag<998244353ul>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 18593733777 times.
✓ Branch 2 taken 284469915 times.
|
34568518061 | retif_((cu64 x = (u64)v; x < mod()) [[likely]], core::redc_mul(x, core::R2), core::redc_mul(x % mod(), core::R2)); |
| 31 | } else retif_((v < mod()) [[likely]], core::redc_mul((u64)v, core::R2), core::redc_mul((u64)(v % mod()), core::R2)); | ||
| 32 | } | ||
| 33 | 1751378309940 | static CEXP raw_t mod() NE { return MOD; } | |
| 34 | 21359102467 | ND CEXP raw_t val() CNE { | |
| 35 | 21359102467 | const raw_t res = -core::mulh(this->v_ * core::R, mod()); | |
| 36 | 21359102467 | return res + (mod() & -(res >> 63)); | |
| 37 | } | ||
| 38 | CEXP raw_t& data() NE { return v_; } | ||
| 39 | |||
| 40 | protected: | ||
| 41 | template <class mint> | ||
| 42 | 227328231 | CEXP auto neg() CNE { | |
| 43 | 227328231 | mint res; | |
| 44 | 227328231 | res.v_ = (mod() & -raw_t(this->v_ != 0)) - v_; | |
| 45 | 227328231 | return res; | |
| 46 | } | ||
| 47 | 565901583694 | CEXP void add(mint_ms64_tag CR r) NE { v_ += r.v_ - mod(), v_ += mod() & -(this->v_ >> 63); } | |
| 48 | 527495699962 | CEXP void sub(mint_ms64_tag CR r) NE { v_ -= r.v_, v_ += mod() & -(this->v_ >> 63); } | |
| 49 | 671585315784 | CEXP void mul(mint_ms64_tag CR r) NE { v_ = core::redc_mul(this->v_, r.v_); } | |
| 50 | }; | ||
| 51 | template <u64 MOD> | ||
| 52 | using mint_ms64 = mint_impl_::mint<mint_ms64_tag<MOD>>; | ||
| 53 | |||
| 54 | } // namespace tifa_libs | ||
| 55 |