我正在尝试实现一种方法,该方法将给出一个长度为k的整数序列。根据给定值,该方法将检测是否可以使用具有整数系数的线性递推公式生成序列的值。
对于Tribonacci数列,给定至少3个值的输入序列,该方法将返回{1,1,1}。
对于已知递推关系f(n)=f(n−1)+f(n−2)−3*f(n−5)+4*f(n−10),任何少于10个值的输入序列都会返回一个错误,但是给定至少10个连续值的序列,该方法将返回{1,1,0,0,−3,0,0,0,0,4},对应于递推的系数(数组中第i个位置的零表示不需要f(n−i)的值)。
显然,递推不是提前知道的,这只是为了简单起见,我提供了已知递推的示例。但是该方法需要自行检测它。
这是否可行?是否有任何已知的算法?我尝试在Java中编写了一些程序,但实际上它不过是一种暴力方法,检测所有可能的递推公式并没有什么帮助...如果可能的话,我很想看到高效尝试这个问题的代码示例或任何指导方向。
编辑
搜索后,我偶然发现了“Berlekamp-Massey算法”,它似乎与此主题有关。
- 如果不可能,则会给出一个错误。
- 如果可能,该方法将返回一个大小为s<=k的整数系数数组C,其中s尽可能小。
对于Tribonacci数列,给定至少3个值的输入序列,该方法将返回{1,1,1}。
对于已知递推关系f(n)=f(n−1)+f(n−2)−3*f(n−5)+4*f(n−10),任何少于10个值的输入序列都会返回一个错误,但是给定至少10个连续值的序列,该方法将返回{1,1,0,0,−3,0,0,0,0,4},对应于递推的系数(数组中第i个位置的零表示不需要f(n−i)的值)。
显然,递推不是提前知道的,这只是为了简单起见,我提供了已知递推的示例。但是该方法需要自行检测它。
这是否可行?是否有任何已知的算法?我尝试在Java中编写了一些程序,但实际上它不过是一种暴力方法,检测所有可能的递推公式并没有什么帮助...如果可能的话,我很想看到高效尝试这个问题的代码示例或任何指导方向。
编辑
搜索后,我偶然发现了“Berlekamp-Massey算法”,它似乎与此主题有关。
f(n)=af(n-1)+bf(n-2), a,b 为整数
。在这种情况下,如何进行变化以适应a,b
?接下来,如果放弃这个尝试并向初始函数添加一个部分cf(n-3)
。输入参数的数量非常重要,如果没有限制,算法可能会非常低效。我的观点是,您的问题对于数学理论来说很好,但作为此处的主题,它不太实用(关键是算法,与数学相关,而不是任何语言中的任何实现)。 - Traian GEICUa
、b
、etc
。 - Traian GEICU