Java обратное по модулю 2 **64

Учитывая нечетное long x, я ищу long yтакое, что их произведение по модулю2**64(то есть, используя нормальную арифметику с переполнением ), равно 1. Чтобы было ясно, что я имею в виду :Это можно вычислить за несколько тысяч лет таким образом:

for (long y=1; ; y+=2) {
    if (x*y == 1) return y;
}

Я знаю, что это можно быстро решить с помощью расширенного алгоритма Евклида, но для этого требуется способность представлять все задействованные числа (в диапазоне до 2**64, так что даже беззнаковая арифметика не поможет ). Использование BigInteger, безусловно, помогло бы, но мне интересно, есть ли более простой способ, возможно, с использованием расширенного алгоритма Евклида, реализованного для положительных длинных чисел.

5
задан maaartinus 28 July 2012 в 15:15
поделиться