//最大公约数 intgcd(int a, int b){ if (a % b == 0) { return b; } else { int t = a; a = b; b = t % b; returngcd(a, b); } }
voidextgcd(int a, int b, int &x, int &y){ if (a == 0) { x = 0, y = 1; return; } extgcd(b % a, a, x, y); int t = x; x = y - b / a * x; y = t; }
inteuclid_mod_reverse1(int a, int n){ //检查输入合法 if (gcd(a, n) != 1 || a <= 0 || n <= 0) { return-1; }
int x, y; extgcd(a, n, x, y); return (n + x % n) % n; }
Haskell 的程序或許更加直观:
1 2 3 4 5 6 7 8 9 10 11 12
modInverse :: Int -> Int -> MaybeInt modInverse a n = case gcd a n of 1 -> Just $ makePositive $ fst $ extgcd a n _ -> Nothing where extgcd 0 b = (0, 1) extgcd a b = let (x', y') = extgcd (b `mod` a) a x = y' - (b `div` a) * x' y = x' in (x, y) makePositive x = if x >= 0then x else x + n