Вам понадобится расширенный наибольший общий делитель для вычисления обратного значения x
для модуля z
. Когда x
и z
относительно простые, у вас есть a * x + b * z = 1 = gcd(x, z)
. И, таким образом, a * x = 1 - b * z
или a * x = 1 mod z
, а a
является обратным к x
в модуле z
.
Теперь вы можете вычислять result
с помощью x^-1 = a mod z
:
result = power(a, k) * y % z
с обычной целочисленной арифметикой в C, где power()
- обычное целочисленное возведение в степень.
Поскольку коэффициенты в таких вычислениях могут очень быстро стать очень большими, лучше использовать готовые библиотеки (например, gmp).