Итерация по различным перестановкам вектора в Pari/GP
Я хочу перебрать все различные перестановки вектора. Я пытался сделать это с помощью vecextract()
в комбинации с numtoperm()
создать вектор перестановок и vecsort(,,,8)
удалить эквивалентные перестановки.
К сожалению, это плохо масштабируется: максимальный размер вектора в моем текущем стековом размере 4 ГБ составляет менее 12!, а на моей машине только 16 ГБ.
Есть ли способ сделать это без нехватки памяти, может быть, непосредственно генерируя k-ю отдельную перестановку?
2 ответа
Решение
Для этого нет ничего встроенного в ПАРИ. Я бы посоветовал прочитать Как сгенерировать все перестановки мультимножества?,
Использовать .
forperm([1,1,2,3], v, print(v))
Производит
Vecsmall([1, 1, 2, 3])
Vecsmall([1, 1, 3, 2])
Vecsmall([1, 2, 1, 3])
Vecsmall([1, 2, 3, 1])
Vecsmall([1, 3, 1, 2])
Vecsmall([1, 3, 2, 1])
Vecsmall([2, 1, 1, 3])
Vecsmall([2, 1, 3, 1])
Vecsmall([2, 3, 1, 1])
Vecsmall([3, 1, 1, 2])
Vecsmall([3, 1, 2, 1])
Vecsmall([3, 2, 1, 1])
Обратите внимание, что входной вектор для
forperm
должны быть отсортированы для получения правильных результатов.