【问题标题】:Is there a comfortable way to generate the combinations k out of n in PARI/GP?有没有一种舒适的方法可以在 PARI/GP 中生成 n 中的 k 组合?
【发布时间】:2016-02-02 23:15:01
【问题描述】:

假设,我在 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 中是否有执行此操作的命令,还是我必须对功能进行编程?

【问题讨论】:

    标签: function pari pari-gp


    【解决方案1】:

    很遗憾,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]]
    

    【讨论】:

      【解决方案2】:

      从 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]
      

      【讨论】:

        猜你喜欢
        • 2010-10-31
        • 1970-01-01
        • 2014-01-03
        • 2020-12-18
        • 2015-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多