Есть ли удобный способ генерировать комбинации k из n в PARI/GP?

Предположим, у меня есть вектор в PARI/GP с n элементами.

Я хочу генерировать комбинации k из n элементов.

Например, если вектор [3,7,11,14,18] и k=3, результат должен быть

[3,7,11]
[3,7,14]
[3,7,18]
[3,11,14]
[3,11,18]
[3,14,18]
[7,11,14]
[7,11,18]
[7,14,18]
[11,14,18]

Есть ли команда в PARI/GP, делающая это, или я должен запрограммировать функцию?

2 ответа

Решение

К сожалению, в PARI нет встроенной команды, которая делает все, что вам нужно.

функция forvec (с флагом = 2) очень хорошо подходит для комбинаторных задач. Таким образом, ваша функция может быть следующей:

subsets(A, k) = {
   my (lst = List());
   forvec(v = vector(k, i, [1, #A]), listput(lst, vecextract(A, v)), 2);

   Vec(lst)
};

subsets([3,7,11,14,18], 3)
gp> [[3,7,11], [3,7,14], [3,7,18], [3,11,14], [3,11,18], [3,14,18], [7,11,14], [7,11,18],
     [7,14,18], [11,14,18]]

Начиная с PARI-2.11, есть более идиоматичное (и более быстрое) решение:

      ? v = [3,7,11,14,18]
? forsubset([#v,3], s, print(vecextract(v,s)))
[3, 7, 11]
[3, 7, 14]
[3, 7, 18]
[3, 11, 14]
[3, 11, 18]
[3, 14, 18]
[7, 11, 14]
[7, 11, 18]
[7, 14, 18]
[11, 14, 18]
Другие вопросы по тегам