【问题标题】:What are some algorithms for finding a closed form function given an integer sequence?在给定整数序列的情况下,有哪些算法可以找到封闭形式的函数?
【发布时间】:2009-06-25 01:50:05
【问题描述】:

我正在寻找一种编程方式来获取一个整数序列并输出一个封闭形式的函数。比如:

给定:1,3,6,10,15

返回:n(n+1)/2

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

【问题讨论】:

  • 这可能只是缺乏数学知识,但这个问题似乎没有足够的界限。
  • 边界建议:如果可能,找到一个恰好给出 10 个整数的封闭形式函数,否则返回 null。不幸的是,类似的事情在很大程度上过度简化了这个问题。以至于它几乎变得毫无价值。
  • 我主要担心的是我过度思考了这个问题,并且有一些众所周知的方法可以解决这个问题。事实证明并非如此,事实上我需要比我已经投入的更多的想法

标签: algorithm language-agnostic math


【解决方案1】:

这涉及到一个极其深刻、复杂和活跃的数学领域。该解决方案在某些情况下(线性重复)几乎是微不足道的,而在其他情况下几乎是不可能的(想想 2、3、5、7、11、13 ......)您可以从查看 generating functions 开始,例如查看 Herb Wilf 关于该主题的 incredible 书(参见第 1 (2e) 页),但这只会让您走得更远。

但我认为你最好的选择是放弃,当你需要知道答案时,查询斯隆的综合Encyclopedia of Integer Sequences,而是花时间阅读这个深主题中最古怪的人物之一的opinions

任何告诉你这个问题可以解决的人都是在向你推销蛇油(参见 Wilf 书 (2e) 的第 118 页。)

【讨论】:

  • 一些很棒的链接;正是我想要的。我有一种感觉,答案会很复杂。我想也许我需要更多的主题知识才能提出正确的问题。谢谢!
  • 哇,我花了太长时间来解释我的解决方案。你打败了我一英里:)
  • 您可能还想看看“具体数学”一书。你可能会发现它比 Wilf 的书更容易理解。
  • 我对这个答案的问题是它隐含地假设存在 一个 正确的函数,而实际上有无数个封闭形式的函数通过任何指定的有限点集——仅举一个例子,n 次多项式将通过任何 n+1 个给定点。但更大的问题是:没有办法选择这些函数中的哪个函数是“最好的”。为什么?一个原因是因为序列中的下一个数字可以是任何东西。直到你提前提到这一点,我才 -1。
【解决方案2】:

一般来说没有一个函数。

对于您指定的序列,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, 108 , 1128, 1176, 1225, 1275, 1326, 1378, 1431

A130484 Sum {0A010875 的部分总和)。
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 {0A010876 的部分总和)。
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, 28 , 300, 312, 325, 330, 336, 343, 351, 360, 370, 381

如果您将自己限制在多项式函数中,这很容易编写代码,而且手动求解会有些乏味。

让,对于一些未知的

现在解方程





这只是一个线性方程组。

【讨论】:

  • 您给出了一个示例算法,而“正确”的答案断言不存在这样的算法。有趣的。您的答案假设序列是有限的,我认为这是一个正确的假设。
  • @Martin:ephemient 清楚地表明解决方案状态仅限于 n 次多项式,它始终可以拟合到 n 个点的有限集合。
  • 小修正:n 次多项式总是可以拟合到 n+1 个点的有限集合。
  • +1。这应该是 IHMO 的正确答案。最重要的一点是,这个问题的约束严重不足,我认为你给出的 1、3、6、10、15 的 5 个不同的合理函数列表很好地证明了这一点。
【解决方案3】:

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

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

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

【讨论】:

  • 您可以通过取所有给定的根(例如 a、b 和 c)来形成多项式,并将其写成 f(x) = (x-a)*(x-b)*(x-c) .但这并不意味着它们不是满足它的其他多项式。
【解决方案4】:

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))

【讨论】:

    【解决方案5】:

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

    您需要对序列进行一些假设。是几何的吗?算术?

    【讨论】:

    • 各种序列。也许在没有生成函数的情况下给出了“序列”。我也希望能够处理这种情况。我现在处于第一阶段,所以如果您认为我应该以某种方式重新考虑这个问题,我会很感激您的意见。
    【解决方案6】:

    如果您的序列来自多项式,则除差将发现该多项式以牛顿基或二项式基表示。见this

    【讨论】:

      【解决方案7】:

      没有一般的答案;使用Pade approximants 可以实现一个简单的方法;简而言之,假设您的序列是未知函数的泰勒展开的系数序列,然后应用一种算法(类似于连分数算法)以“简化”这个泰勒展开(更准确地说:找到一个有理函数非常接近初始(和截断)函数。Maxima 程序可以做到:查看页面上的“pade”:http://maxima.sourceforge.net/docs/manual/maxima_28.html

      另一个答案讲述了 Axiom 的 FriCAS 分支中的“猜测”包(请参阅 jmbr 的先前答案)。如果我没记错的话;该软件包本身的灵感来自 Christian Krattenthaler 的 Rate 计划;你可以在这里找到它:http://www.mat.univie.ac.at/~kratt/rate/rate.html 也许看看它的来源可以告诉你其他方法。

      【讨论】:

        猜你喜欢
        • 2014-05-02
        • 2021-06-27
        • 1970-01-01
        • 2014-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        相关资源
        最近更新 更多