如何使用计算机代码检查无限集是否已关闭?

时间:2012-01-15 05:24:41

标签: c++ math matlab wolfram-mathematica set

给定 k 正整数a 1 < a 2 < a 3 < ......< a k ,以及大于 k 的所有整数,我们要检查集合A = {a i :i∈[1, k]}∪{n:n> a k ,n∈ℕ} = {a 1 2 3 ,..., a k k + 1, k +2,...}在加法时关闭。这意味着:

Σ1≤i≤k a i * b i ∈A,对于任何非负整数b i < /子>

例如,{2,4,6,7,8,....}在添加时关闭。

有没有简单的方法可以做到这一点?我们可以在Mathematica或Matlab中使用的任何函数吗?

3 个答案:

答案 0 :(得分:5)

如果小于 k 的不连续部分不大,我相信你可以直接接近它:

a = {2, 4, 6};
Tr /@ Subsets[a, {2}];
TakeWhile[%, # < Last@a &];
Complement[%, a] === {}

答案 1 :(得分:2)

平庸观察:任何具有操作数>= a_k的总和都是A的成员,因此您只需要关注两个操作数来自集合B = {a_1 .. a_(k-1)}的总和。伪代码的天真解决方案:

for i from k-1 down to 1
  for j from i down to 1
    if (a_i + a_j < a_k) and (a_i + a_j is not in B) then
      return false
return true

答案 2 :(得分:0)

您最近对此问题的修改使其变得荒谬。我注意到:

  • a_1a_k都是严格正整数
  • 该集合的其余成员严格大于a_k,因此也严格为正整数

因此,该集合的所有成员都是严格正整数

∑a_i*n_i ∈ A显然不适用于所有非负整数n_i

具体来说,它不适用于n_i = 0,因为总和为零,零不是严格正整数,因此不是该集合的成员。

现在,这是一个非常奇怪的“闭集”定义,而不是普遍接受的用法。但根据您的定义,对于任何k > 0,该集合都不会关闭。