2

假设,我在 PARI/GP 中有一个带有 n 个元素的向量。

我想从 n 个元素中生成 k 个组合。

例如,如果向量是[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 中是否有执行此操作的命令,还是我必须对功能进行编程?

4

2 回答 2

4

不幸的是,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]]
于 2015-11-03T09:07:09.063 回答
1

从 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]
于 2021-07-14T20:00:58.227 回答