Алгоритм, который я использую в данный момент, очень быстро набирает обороты. Шаг в алгоритме, который я делаю, вызывает x к результату функции totient, примененной к y. В результате вы можете столкнуться с очень большими числами.Существует ли алгоритм вычисления мультипликативного порядка x по модулю y (для y <1000), который не требует типа BigInteger?
Например. При расчете multiplicative order из 10 по модулю 53:
10^totient(53) == 10^52 == 1 * 10^52
следующий алгоритм тарифы немного лучше, либо с точки зрения избежать большого числа, но он по-прежнему не удается, где 10^Morder больше, чем емкость типа данных :
mOrder = 1
while 10^mOrder % 53 != 1
if mOrder >= i
mOrder = 0;
break
else
mOrder = mOrder + 1
Не часть первоначального вопроса, но аккуратный способ совместить ответы от @schnaader и @Svante. Требуемый мультипликативный порядок должен делить тотал (с), поэтому вам не нужно проверять каждый a^b. Если вы перечислите делители totient (c), вы можете использовать метод @ schnaader для выполнения возведения в степень, а метод @ Svante использовать уже рассчитанные результаты для вычисления других - т. Е. 10^1, 10^2 (путем возведения в квадрат), 10^4 (путем возведения в квадрат), 10^13 = (10^4)^3 * (10^1), 10^26 (путем возведения в квадрат). (Если это ни один из них, это должно быть 52). –