您正在寻找一组算术序列。我们会考虑你的例子
ee = {0, 4, 6, 10, 12, 16, 18, 22};
其中有两个这样的序列,一个例子有四个。
ff = {0, 3, 7, 11, 17, 20, 24, 28, 34, 37, 41, 45};
在第二个中,我们从 {0,3,7,11} 开始,然后增加 17。那么从第 n 项到第 n+1 项的一般方法是什么?如果该集合有 k 个序列(对于 ee,k=2,对于 ff,k=4)然后将模数添加到第 n-k+1 项。什么是模数?这是第 n 项和第 n 项之间的差异。
把这些放在一起并假设我们知道 k(我们一般不知道,但我们会解决的)我们有一个形式 f(n+1)=f(n-k+1) + (f(n)-f(nk))。所以我们需要找到一个递归(如果存在的话),检查它的形式是否正确,如果是,则进行后期处理。
这是执行所有这些操作的代码。请注意,它实际上解决了 k。
findArithmeticSequences[ll : {_Integer ..}] := With[
{rec = FindLinearRecurrence[ll]},
{Take[ll, Length[rec] - 1], ll[[Length[rec]]]} /;
ListQ[rec] &&
(rec === {1, 1, -1} || MatchQ[rec, {1, 0 .., 1, -1}])
]
(纯函数的爱好者可能更喜欢下面的变体。失败案例的处理方式略有不同,没有令人信服的理由。)
findArithmeticSequences2[ll : {_Integer ..}] :=
If[ListQ[#] &&
(# === {1, 1, -1} || MatchQ[#, {1, 0 .., 1, -1}]), {Take[ll,
Length[#] - 1], ll[[Length[#]]]}, $Failed] &[
FindLinearRecurrence[ll]]
测试:
In[115]:= findArithmeticSequences[ee]
Out[115]= {{0, 4}, 6}
In[116]:= findArithmeticSequences[ff]
Out[116]= {{0, 3, 7, 11}, 17}
请注意,可以通过多项式分解“几乎”解决此类问题(如果输入末尾没有部分序列)。例如,多项式
In[117]:= poly = Plus @@ (x^ee)
Out[117]= 1 + x^4 + x^6 + x^10 + x^12 + x^16 + x^18 + x^22
影响因素
(1+x^4)*(1+x^6+x^12+x^18)
以易于查看的方式包含所需的信息。不幸的是,出于这个特定目的,Factor 会超出这一点,并在此过程中掩盖信息。
我一直想知道是否可能有一种信号处理方式来处理这类事情,例如通过 DFT。但是我什么都没想到。
丹尼尔·利希特布劳