找到总和为n的所有m元组

时间:2015-01-25 14:02:47

标签: r

我想找到方程i + j + k + l + m = n的所有非负整数解,其中n是非负整数。也就是说,我希望在R中找到与某个n相关的所有可能的5元组(i,j,k,l,m)。

我写了一段不起作用的代码。我怀疑循环中有什么问题。

为了您的方便,我采取了n = 3,所以我基本上试图计算所有向量(i,j,k,l,m)的数量为35,矩阵a(35乘5)是应该显示那些向量的矩阵。整个过程就在函数" sample(n)"中,如果我把n = 3,即调用样本(3),则给出矩阵a。请注意,事先定义了a(35 x 5),所有条目为0。

sample=function(n){
i=0
j=0
k=0
l=0
m=0
for(p in 1:35){
while(i<=3){
while(j<=3){
while(k<=3){
while(l<=3){
m=n-(i+j+k+l)
if(m>-1){
a[p,]=c(i,j,k,l,m)
}
l=l+1}
k=k+1}
j=j+1}
i=i+1}
}
return(a)
}

当我打电话给sample(3)时,我得到了原始的a,即包含所有元素的矩阵0.这段代码出了什么问题?请纠正它。

2 个答案:

答案 0 :(得分:6)

我认为蛮力方法不会给你带来很多快乐。相反,你应该寻找可以使用并且有效的现有功能(即用C / C ++实现)。

n <- 3
library(partitions)
blockparts(rep(n, 5), n)
#[1,] 3 2 1 0 2 1 0 1 0 0 2 1 0 1 0 0 1 0 0 0 2 1 0 1 0 0 1 0 0 0 1 0 0 0 0
#[2,] 0 1 2 3 0 1 2 0 1 0 0 1 2 0 1 0 0 1 0 0 0 1 2 0 1 0 0 1 0 0 0 1 0 0 0
#[3,] 0 0 0 0 1 1 1 2 2 3 0 0 0 1 1 2 0 0 1 0 0 0 0 1 1 2 0 0 1 0 0 0 1 0 0
#[4,] 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 3 0 0 0 0 0 0 1 1 1 2 0 0 0 1 0
#[5,] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 3

答案 1 :(得分:2)

我认为,除了代码中可能存在的错误之外,您的代码并没有回答您声明的问题(据我所知)。

考虑问题的一种方法是,给定四倍(i,j,k,l),m = n - (i + j + k + l)的值,同时注意到四倍(i) ,j,k,l)被约束,使得n> = i + j + k + 1 AND i,j,k,l> = 0.例如,考虑以下算法:

  • 让我自由地取0和n之间的任何值。

  • 给定i,j可以取0到n-i之间的值。

  • 给定(i,j),k取0到n-i-j之间的值。

  • 给定(i,j,k),l取0到n-i-j-k之间的值。

  • 给定(i,j,k,l),m定义为m = n-i-j -k -l。

以下代码应该回答您的问题。如果这不是你想要的,请评论。

sample.example = function(n){
  a=array(0,c(0,5))
  for(i in 0:n){
    for(j in seq(from=0,to=n-i,by=1)){
      for(k in seq(from=0,to=n-i-j,by=1)){
        for(l in seq(from=0,to=n-i-j-k,by=1)){
          m = n - i -j - k - l
          a = rbind(a,c(i,j,k,l,m))
     }}}}
  return(a)
}