Розв'язання
Нехай
Визначимо
а також
На позиції потрібно вибрати ще не використане значення p_i, для якого
Нехай
Порівняння
має розв'язок тоді і тільки тоді, коли
Якщо ця умова не виконується, допустимої перестановки не існує.
Інакше позначимо
Поділивши порівняння на , отримаємо
При цьому
Тому число \frac{P_{i-1}}{g} має обернений елемент за модулем .
Отже, p_i повинен належати рівно одному класу лишків:
де
Таким чином, на кожному кроці потрібно лише знайти невикористане число з певного класу лишків за модулем .
Чому можна брати будь-якого представника
Нехай
Оскільки
та
маємо
Оскільки M\mid x-y, отримуємо
Тому
Отже, кожне число з потрібного класу лишків дає абсолютно однакове значення наступного префіксного добутку.
Тепер визначимо
та
Оскільки
виконується
Отже,
Тобто кожен наступний модуль ділить попередній.
Тому якщо два числа рівні за поточним модулем , то вони залишатимуться рівними і за всіма наступними модулями.
Таким чином, усі невикористані представники поточного класу лишків повністю еквівалентні, тому можна вибрати будь-який з них.
Підтримка невикористаних значень
Кожне можливе значення є дільником .
Для кожного дільника згрупуємо числа 1,2,\dots,n за їхнім лишком за модулем .
Для кожного класу лишків будемо зберігати вказівник на перше число, яке ми ще не перевіряли.
Коли нам потрібен певний клас лишків, рухаємо цей вказівник, доки поточне число вже використане.
Якщо невикористаних чисел у цьому класі більше немає, то продовжити побудову неможливо.
Інакше вибираємо знайдене число як p_i та позначаємо його використаним.
Після цього оновлюємо
Доведення коректності
На кожному кроці умова на p_i еквівалентна належності до рівно одного класу лишків за модулем .
Кожне число з цього класу дає потрібний наступний префіксний добуток.
Оскільки кожен наступний модуль ділить поточний, усі представники поточного класу лишків залишатимуться еквівалентними й на всіх наступних кроках.
Тому вибір будь-якого невикористаного представника завжди безпечний.
Якщо невикористаного представника немає, то жодне невикористане число не може задовольнити поточне порівняння.
Отже, алгоритм будує допустиму перестановку тоді і тільки тоді, коли вона існує.
Складність
Нехай — кількість дільників числа .
Для кожного дільника кожне значення може бути оброблене лише сталу кількість разів.
Тому загальна складність становить
за часом та
за пам'яттю.