假设我在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中是否有命令执行此操作,或者我是否需要编写功能?
答案 0 :(得分:4)
不幸的是,PARI没有内置命令来完成你需要的所有东西。
函数forvec
(带有flag = 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]]
答案 1 :(得分: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]