Last active
April 3, 2016 20:51
-
-
Save odanado/26834f30406b25c47a5b to your computer and use it in GitHub Desktop.
LCGの逆関数
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
これ今見て気付いたけどcalc_powでmask使ってない