Skip to content

Instantly share code, notes, and snippets.

@odanado
Last active April 3, 2016 20:51
Show Gist options
  • Save odanado/26834f30406b25c47a5b to your computer and use it in GitHub Desktop.
Save odanado/26834f30406b25c47a5b to your computer and use it in GitHub Desktop.
LCGの逆関数
#include <iostream>
#include <cstdio>
constexpr inline uint64_t calc_pow(uint64_t a, uint64_t n, uint64_t mask) {
return n == 0 ? 1 :
(n & 1 ? a : 1) * calc_pow((a*a)&mask, n >> 1, mask);
}
constexpr inline uint64_t calc_inverse(uint64_t mul, uint64_t mask) {
return calc_pow(mul, mask >> 1, mask);
}
int main() {
constexpr uint64_t mul = 0x5D588B656C078965;
constexpr uint64_t add = 0x269EC3;
constexpr uint64_t mask = -1;
constexpr uint64_t div = calc_inverse(mul, mask);
constexpr uint64_t sub = ~(div * add) + 1;
printf("%lX,%lX\n",div,sub);
return 0;
}
@odanado
Copy link
Author

odanado commented Apr 3, 2016

これ今見て気付いたけどcalc_powでmask使ってない

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment