fork download
  1. #include <cstdio>
  2.  
  3. using namespace std;
  4.  
  5. unsigned long long mul_mod(unsigned long long a, unsigned long long b, unsigned long long m) {
  6. unsigned long long d = 0, mp2 = m >> 1;
  7. if (a >= m) a %= m;
  8. if (b >= m) b %= m;
  9. for (int i = 0; i < 64; i++)
  10. {
  11. d = (d > mp2) ? (d << 1) - m : d << 1;
  12. // if (a & 0x8000000000000000ULL)
  13. // d += b;
  14. // if (d >= m) d -= m;
  15. unsigned long long x = -(a >> 63) & b;
  16. if (d >= m - x) d -= m;
  17. d += x;
  18. a <<= 1;
  19. }
  20. return d;
  21. }
  22.  
  23. int main() {
  24. unsigned long long a = 3, b = 0x7FFFFFFFFFFFFFFFULL, m = 0xFFFFFFFFFFFFFFFFULL;
  25. unsigned long long result = mul_mod(a, b, m);
  26. printf("%llX * %llX mod %llX = %llX\n", a, b, m, result);
  27. return 0;
  28. }
  29.  
Success #stdin #stdout 0s 5648KB
stdin
Standard input is empty
stdout
3 * 7FFFFFFFFFFFFFFF mod FFFFFFFFFFFFFFFF = 7FFFFFFFFFFFFFFE