У меня есть серия
S = i^(m) + i^(2m) + ............... + i^(km) (mod m)
0 <= i < m, k may be very large (up to 100,000,000), m <= 300000
Я хочу найти сумму. Я не могу применить формулу геометрической прогрессии (GP), потому что тогда результат будет иметь знаменатель, и тогда мне придется найти модульный инверсный, который может не существовать (если знаменатель и m не являются взаимно простыми).
Итак, я сделал альтернативный алгоритм, сделав предположение, что эти мощности сделают цикл длины намного меньше k (потому что это модульное уравнение, и поэтому я бы получил нечто вроде 2,7,9,1,2,7, 9,1....), и этот цикл будет повторяться в вышеупомянутой серии. Поэтому вместо повторения от 0 до k я просто нашел бы сумму чисел в цикле, а затем вычислил количество циклов в вышеупомянутых сериях и умножил их. Поэтому я сначала нашел i^m (mod m)
, а затем умножил это число снова и снова, принимая по модулю на каждом шаге, пока не дойду до первого элемента снова.
Но когда я действительно закодировал алгоритм, для некоторых значений я я получил циклы, которые были очень большого размера. И поэтому потребовалось большое количество времени до завершения, и, следовательно, мое предположение неверно.
Итак, есть ли другой образец, который мы можем узнать? (В принципе я не хочу перебирать k.) Поэтому, пожалуйста, дайте мне представление об эффективном алгоритме для поиска суммы.