src/math/ds/mint/md64/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 <i64 ID> | ||
| 9 | class mint_md64_tag : public mint_impl_::mint_tag_base { | ||
| 10 | static inline montgomery64<0> core; | ||
| 11 | |||
| 12 | public: | ||
| 13 | static CEXP bool FIXED_MOD = false; | ||
| 14 | 4390 | static CEXP void set_mod(u64 m) NE { core.reset(m); } | |
| 15 | |||
| 16 | protected: | ||
| 17 | using raw_t = u64; | ||
| 18 | raw_t v_{}; | ||
| 19 | 6851957987 | CEXP mint_md64_tag() NE = default; | |
| 20 | 23949212949 | CEXP mint_md64_tag(int_c auto v) NE : v_{mod(v)} {} | |
| 21 | |||
| 22 | public: | ||
| 23 |
17/30unsigned long tifa_libs::mint_md64_tag<11l>::mod<int>(int):
✓ Branch 0 taken 25584018 times.
✗ Branch 1 not taken.
unsigned long tifa_libs::mint_md64_tag<11l>::mod<long>(long):
✓ Branch 0 taken 73134690 times.
✗ Branch 1 not taken.
unsigned long tifa_libs::mint_md64_tag<12l>::mod<int>(int):
✓ Branch 0 taken 5358207 times.
✗ Branch 1 not taken.
unsigned long tifa_libs::mint_md64_tag<12l>::mod<long>(long):
✓ Branch 0 taken 30332502 times.
✗ Branch 1 not taken.
unsigned long tifa_libs::mint_md64_tag<13l>::mod<int>(int):
✓ Branch 0 taken 19749895 times.
✗ Branch 1 not taken.
unsigned long tifa_libs::mint_md64_tag<13l>::mod<long>(long):
✓ Branch 0 taken 66735236 times.
✗ Branch 1 not taken.
unsigned long tifa_libs::mint_md64_tag<14l>::mod<int>(int):
✓ Branch 0 taken 122722327 times.
✓ Branch 1 taken 2284 times.
unsigned long tifa_libs::mint_md64_tag<14l>::mod<long>(long):
✓ Branch 0 taken 885091665 times.
✗ Branch 1 not taken.
unsigned long tifa_libs::mint_md64_tag<15l>::mod<int>(int):
✓ Branch 0 taken 265306417 times.
✓ Branch 1 taken 2284 times.
unsigned long tifa_libs::mint_md64_tag<15l>::mod<long>(long):
✓ Branch 0 taken 243442460 times.
✗ Branch 1 not taken.
unsigned long tifa_libs::mint_md64_tag<16l>::mod<int>(int):
✓ Branch 0 taken 12596378 times.
✗ Branch 1 not taken.
unsigned long tifa_libs::mint_md64_tag<16l>::mod<long>(long):
✓ Branch 0 taken 15262980 times.
✗ Branch 1 not taken.
unsigned long tifa_libs::mint_md64_tag<17l>::mod<int>(int):
✓ Branch 0 taken 12596252 times.
✗ Branch 1 not taken.
unsigned long tifa_libs::mint_md64_tag<55l>::mod<int>(int):
✓ Branch 0 taken 3125 times.
✗ Branch 1 not taken.
unsigned long tifa_libs::mint_md64_tag<70l>::mod<int>(int):
✓ Branch 0 taken 5005002 times.
✗ Branch 1 not taken.
|
1782925722 | static CEXP raw_t mod(sint_c auto v) NE { retif_((v >= 0) [[likely]], mod((to_uint_t<decltype(v)>)v), core.redc_mul(core.norm(i64(v % (i64)mod())), core.R2)); } |
| 24 | 23949208381 | static CEXP raw_t mod(uint_c auto v) NE { | |
| 25 | if CEXP (umost64_c<decltype(v)>) { | ||
| 26 |
25/38unsigned long tifa_libs::mint_md64_tag<11l>::mod<bool>(bool):
✓ Branch 1 taken 56 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_md64_tag<11l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 26188782 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_md64_tag<11l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 728237222 times.
✓ Branch 2 taken 407046 times.
unsigned long tifa_libs::mint_md64_tag<12l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 5578335 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_md64_tag<12l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 55470957 times.
✓ Branch 2 taken 9565546 times.
unsigned long tifa_libs::mint_md64_tag<13l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 332772079 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_md64_tag<13l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 7544085054 times.
✓ Branch 2 taken 30929134 times.
unsigned long tifa_libs::mint_md64_tag<14l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 1363928746 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_md64_tag<14l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 8253231381 times.
✓ Branch 2 taken 599465503 times.
unsigned long tifa_libs::mint_md64_tag<15l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 2664998926 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_md64_tag<15l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 2007755979 times.
✓ Branch 2 taken 170571307 times.
unsigned long tifa_libs::mint_md64_tag<16l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 51976197 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_md64_tag<16l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 24405739 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_md64_tag<17l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 51051446 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_md64_tag<17l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 3548761 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_md64_tag<55l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 6245 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_md64_tag<55l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 8944 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_md64_tag<70l>::mod<unsigned int>(unsigned int):
✓ Branch 1 taken 12011998 times.
✗ Branch 2 not taken.
unsigned long tifa_libs::mint_md64_tag<70l>::mod<unsigned long>(unsigned long):
✓ Branch 1 taken 12011998 times.
✓ Branch 2 taken 1001000 times.
|
23949208381 | retif_((cu64 x = (u64)v; x < mod()) [[likely]], core.redc_mul(x, core.R2), core.redc_mul(x % mod(), core.R2)); |
| 27 | } else retif_((v < mod()) [[likely]], core.redc_mul((raw_t)v, core.R2), core.redc_mul((raw_t)(v % mod()), core.R2)); | ||
| 28 | } | ||
| 29 | 185884235149 | static CEXP raw_t mod() NE { return core.MOD; } | |
| 30 | 9316011261 | ND CEXP raw_t val() CNE { | |
| 31 | 9316011261 | const raw_t res = -core.mul_h(v_ * core.R, mod()); | |
| 32 | 9316011261 | return res + (mod() & -(res >> 63)); | |
| 33 | } | ||
| 34 | CEXP raw_t& data() NE { return v_; } | ||
| 35 | |||
| 36 | protected: | ||
| 37 | template <class mint> | ||
| 38 | 195666646 | CEXP auto neg() CNE { | |
| 39 | 195666646 | mint res; | |
| 40 | 195666646 | res.v_ = (mod() & -raw_t(v_ != 0)) - v_; | |
| 41 | 195666646 | return res; | |
| 42 | } | ||
| 43 | 55580271145 | CEXP void add(mint_md64_tag CR r) NE { v_ += r.v_ - mod(), v_ += mod() & -(v_ >> 63); } | |
| 44 | 25618894399 | CEXP void sub(mint_md64_tag CR r) NE { v_ -= r.v_, v_ += mod() & -(v_ >> 63); } | |
| 45 | 68339749794 | CEXP void mul(mint_md64_tag CR r) NE { v_ = core.redc_mul(v_, r.v_); } | |
| 46 | }; | ||
| 47 | template <i64 ID> | ||
| 48 | using mint_md64 = mint_impl_::mint<mint_md64_tag<ID>>; | ||
| 49 | |||
| 50 | } // namespace tifa_libs | ||
| 51 |