Итерация по различным перестановкам вектора в 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 должны быть отсортированы для получения правильных результатов.

Другие вопросы по тегам