在给定整数序列的情况下,有哪些算法可以找到闭合函数?

时间:2009-06-25 01:50:06

标签: algorithm language-agnostic math

我正在寻找采用整数序列并吐出封闭形式函数的编程方式。类似的东西:

鉴于:1,3,6,10,15

返回:n(n + 1)/ 2

样品可能有用;语言不重要。

7 个答案:

答案 0 :(得分:17)

这触及了一个极其深刻,复杂和活跃的数学领域。在某些情况下,这个解决方案几乎是微不足道的(线性复发),而在其他情况下该死的几乎不可能(想想2,3,5,7,11,13 ......)你可以先看一下generating functions例子,看看Herb Wilf的incredible书(参见第1页(2e))关于这个主题,但这只会让你到目前为止。

但我认为你最好的选择是放弃,在你需要知道答案的时候查询Sloane的全面Encyclopedia of Integer Sequences,而是花时间阅读其中一个最古怪的人物opinions。这个深刻的主题。

任何告诉你这个问题的人都可以卖给你卖蛇油(参见Wilf书(第21页)第118页。)

答案 1 :(得分:10)

一般没有一个功能。

对于您指定的序列,The On-Line Encyclopedia of Integer Sequences在其有趣的整数序列数据库中找到133个匹配项。我在这里复制了前5个。

  

A000217三角数:a(n)= C(n + 1,2)= n(n + 1)/ 2 = 0 + 1 + 2 + ... + n。
  0, 1,3,6,10,15 ,21,28,36,45,55,66,78,91,105,120,136,153,171,190,210,231 ,253,276,300,325,351,378,406,435,465,496,528,561,595,630,666,703,741,780,820,861,903,946,990,1035,1081 ,1128,1176,1225,1275,1326,1378,1431

     

A130484 Sum {0< = k< = n,k mod 6}(部分和A010875)。
  0, 1,3,6,10,15 ,15,16,18,21,25,30,30,31,33,36,40,45,45,46,48,51 ,55,60,60,61,63,66,70,75,75,76,78,81,85,90,90,91,93,96,100,105,105,106,108,111,115 ,120,120,121,123,126,130,135,135,136,138,141,145,150,150,151,153

     

A130485 Sum {0< = k< = n,k mod 7}(部分和A010876)。
  0, 1,3,6,10,15 ,21,21,22,24,27,31,36,42,42,43,45,48,52,57,63,63 ,64,66,69,73,78,84,84,85,87,90,94,99,105,105,106,108,111,115,120,126,126,127,129,132,136 ,141,147,147,148,150,153,157,162,168,168,169,171,174,178,183

     

A104619将基数为16的自然数写入第k行中k个数字的三角形中,如下所示。序列给出了前导对角线    1,3,6,10,15 ,2,1,1,14,3,2,2,5,12,4,4,4,13,6,7,11,6 ,9,9,10,7,12,13,1,0,1,10,5,1,12,8,1,1,14,1,9,7,1,4,3,1,2 ,2,1,3,4,2,7,9,2,14,1,2,8,12,2,5,10,3,5,11,3,8,15,3,14,6 ,3,7,0,4,3,13,4,2,13,4,4,0,5,9,6,5,1,15,5,12,11,6

     

A037123 a(n)= a(n-1)+ n的数字之和   0, 1,3,6,10,15 ,21,28,36,45,46,48,51,55,60,66,73,81,90,100,102,105 ,109,114,120,127,135,144,154,165,168,172,177,183,190,198,207,217,228,240,244,249,255,262,270,279,289 ,300,312,325,330,336,343,351,360,370,381

如果你将自己限制在多项式函数中,这很容易编码,只需要手工解决就会有些乏味。

对于某些未知的f(x)=a_0+a_1x+a_2x^2+\cdots+a_{n-1}x^{n-1}+a_nx^n

,请a_0\ldots a_n

现在解决方程式 y_0=f(0)=a_0
y_1=f(1)=a_0+a_1+a_2+\cdots+a_{n-1}+a_n
y_2=f(2)=a_0+2a_1+4a_2+\cdots+2^{n-1}a_{n-1}+2^na_n
...
y_n=f(n)=a_0+na_1+n^2a_2+\cdots+n^{n-1}a_{n-1}+n^na_n
这只是一个线性方程组。

答案 2 :(得分:3)

如果您的数据保证可以表达为多项式,我认为您可以使用R(或任何提供数据回归拟合的套件)。如果您的相关性恰好为1,则该线条非常适合描述该系列。

回归分析中有很多统计数据,我对计算的基础知识还不够熟悉,无法为您提供更多详细信息。

但是,this link to regression analysis in R might be of assistance

答案 3 :(得分:2)

Axiom计算机代数系统包括用于此目的的包。你可以read its documentation here

这是FriCAS(Axiom的一个分支)中的示例序列的输出:

(3) -> guess([1, 3, 6, 10, 15])

                 2
                n  + 3n + 2
(3)  [[function= -----------,order= 0]]
                     2
Type: List(Record(function: Expression(Integer),order: NonNegativeInteger))

答案 4 :(得分:1)

我认为你的问题不合适。给定序列中有限数量的整数 没有生成函数,下一个元素可以是任何东西。

你需要假设一下序列。是几何?算术?

答案 5 :(得分:1)

如果您的序列来自多项式,那么分割的差异将发现以牛顿基或二项式为基础表达的多项式。请参阅this

答案 6 :(得分:0)

没有一般性答案;可以使用Pade approximants实现一个简单的方法;用两个词来说,假设你的序列是一个未知函数的泰勒展开系数序列,然后应用一个算法(类似于连续分数算法),以便简化&#34;这个泰勒展开(更准确地说:找到一个非常接近初始(和截断)函数的有理函数。千里马程序可以做到这一点:在页面上查看&#34; pade&#34; http://maxima.sourceforge.net/docs/manual/maxima_28.html < / p>

另一个答案讲述了&#34;猜测&#34;包含在Axiom的FriCAS分支中(参见jmbr的上一个答案)。如果我没错;这个套餐的灵感来自Christian Krattenthaler的Rate计划;你可以在这里找到它:http://www.mat.univie.ac.at/~kratt/rate/rate.html也许查看它的来源可以告诉你其他方法。