Как получить модульную инверсию с помощью расширенного евклидова алгоритма?

Дан мод b и найти его инверсию, а затем выполнить расширенный НОД.

ax + by = gcd(a,b)

После того, как я получу x и y, как мне получить обратное значение?


person skinnyas123    schedule 17.01.2013    source источник
comment
Вы говорите, что это обратное. Инверсия чего?   -  person President James K. Polk    schedule 18.01.2013


Ответы (2)


Если gcd(a,b) != 1, a не имеет обратного mod b.

В противном случае ax + by = 1 означает, что ax = 1 (mod b), поэтому x является инверсией a по модулю b.

person Rasmus Faber    schedule 17.01.2013

Сделайте это, чтобы вычислить обратную зависимость x от модуля m:

function inverse(x, m)
    a, b, u := 0, m, 1
    while x > 0
        q, r := divide(b, x)
        x, a, b, u := b % x, u, x, a - q * u
    if b === 1 return a % m
    error("must be coprime")

Здесь := — это оператор одновременного присваивания, поэтому сначала выполняются все вычисления в правой части, а затем выполняются все присваивания. Функция divide возвращает как частное, так и остаток от b / x.

person user448810    schedule 18.01.2013