找回密码
 欢迎注册
楼主: KeyTo9_Fans

[求助] 给两个数列,求通项公式

[复制链接]
发表于 2012-6-26 11:24:14 | 显示全部楼层
Mathematica有解多维递推公式的,但是是针对一个方程的。而不是方程组。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-6-27 12:37:32 | 显示全部楼层
11# wayne



我忽视了一点:公务员考试那种,默认通项中的系数都是整数形式的, 所以产生简单的多个通项的可能性很小。。
-----------------------
拉格朗日插值是在实数域范围内进行,
有没有在整数范围内进行插值的技术....??
或者资料可供参考。。。?
这方面资料很少,但是运用极多, 构造一个好的hash函数大量用到这方面技术。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-6-27 13:21:25 | 显示全部楼层
12# plp626
如果点是整数,那么,拉格朗日插值出来的公式的系数是 有理数
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-6-28 09:34:24 | 显示全部楼层
没错,只是随着点的增加, 分母可能非常大, 早已超过了32位;
现实中拉格朗日插值不怎么会超过4次的;
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2012-6-28 09:35:58 | 显示全部楼层
比如,给定一组数列(1,2,3,。。。12)->(31, 28, 31,30,31,30 31, 31, 30 ,31 , 30 , 31 )
给个hash映射, 使用的运算量最少(仅使用C提供的运算符)

换做(1,2,3,。。。12)->(31, 29, 31,30,31,30 31, 31, 30 ,31 , 30 , 31 ) 又是怎样的。。。

大家知道是月份的。。。,,我就不多解释了。。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-4-4 23:04:31 | 显示全部楼层
第$1$个数列终于找到一个简单的程序生成它了:
  1. #include<cstdio>

  2. const int n=51;
  3. unsigned long long a[n],b[n],c[n],d[n];
  4. int i,j;

  5. int main()
  6. {
  7.         b[0]=1;
  8.         b[1]=1;
  9.         b[2]=1;
  10.         b[3]=1;
  11.         b[4]=2;
  12.         c[0]=1;
  13.         c[1]=1;
  14.         c[2]=1;
  15.         c[3]=1;
  16.         c[4]=2;
  17.         d[4]=1;
  18.         for(i=5;i<n;i++)
  19.         {
  20.                 c[i]=c[i-1];
  21.                 for(j=2;j<i-1;j++)
  22.                         c[i]+=b[j-2]*c[i-j];
  23.                 d[i]=d[i-1]+c[i];
  24.                 b[i]=1;
  25.                 for(j=0;j<i-3;j++)
  26.                         b[i]+=b[j]*d[i-j];
  27.         }
  28.         for(i=1;i<n-3;i++)
  29.         {
  30.                 for(j=0;j<i;j++)
  31.                         a[i]+=b[j]*(c[i-j+3]-c[i-j+2]);
  32.                 printf("%2d:%21llu\n",i,a[i]);
  33.         }
  34.         return 0;
  35. }
复制代码
该程序只用了$4$个一维数组:$a[]$、$b[]$、$c[]$、$d[]$,

以及$2$重循环:$i$、$j$。

其中数列$b$、$c$、$d$互相递推,$a$是根据$b$、$c$推出来的,

如下图所示:

$a\Leftarrow b\Leftrightarrow c\Leftrightarrow d$。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2013-4-6 23:48:44 | 显示全部楼层
根据上面的程序,第$1$个数列的递推式是:

$a(n)=\sum_{i=0}^{n-1}b(i)*(c(n-i+3)-c(n-i+2))$

当$n\leq 4$时,$b$、$c$、$d$的初值为:
$b(0)=b(1)=b(2)=b(3)=c(0)=c(1)=c(2)=c(3)=1$
$b(4)=c(4)=2$
$d(0)=d(1)=d(2)=d(3)=0$
$d(4)=1$

当$n>4$时,$b$、$c$、$d$的递推式为:
$b(n)=1+\sum_{i=0}^{n-4}b(i)*d(n-i)$
$c(n)=c(n-1)+\sum_{i=2}^{n-2}b(i-2)*c(n-i)$
$d(n)=d(n-1)+c(n)$

这下全是$1$维的数列了,如何求$a$的通项公式呢?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-4-7 16:29:09 | 显示全部楼层
不知道用Mathematica怎么求解
下面代码报错,不允许方程组中的Sum
貌似数列和卷积的计算有关,能不能对数列做傅立叶变换来计算通项呢
  1. RSolve[{b[n] == 1 + Sum[b[i]*d[n - i], {i, 0, n - 4}],
  2.   c[n] == c[n - 1] + Sum[b[i - 2]*c[n - i], {i, 2, n - 2}],
  3.   d[n] == d[n - 1] + c[n],
  4.   b[0] == 1,
  5.   b[1] == 1,
  6.   b[2] == 1,
  7.   b[3] == 1,
  8.   c[0] == 1,
  9.   c[1] == 1,
  10.   c[2] == 1,
  11.   c[3] == 1,
  12.   b[4] == 3,
  13.   c[4] == 3,
  14.   d[0] == 0,
  15.   d[1] == 0,
  16.   d[2] == 0,
  17.   d[3] == 0,
  18.   d[4] == 1
  19.   },
  20. {b[n], c[n], d[n]}, n]
复制代码
错误提示:
RSolve::piarg:
All arguments in position 1 of b[n]  should be either of the form + integer or q^integer . Mixtures of these forms are not allowed.

评分

参与人数 1金币 +1 贡献 +1 经验 +1 收起 理由
KeyTo9_Fans + 1 + 1 + 1 不错的尝试,看来要用别的招数了……

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-4-13 23:01:03 | 显示全部楼层
17# KeyTo9_Fans
还是很复杂,看的眼花缭乱的
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2013-4-18 08:55:09 | 显示全部楼层
不知道这两组数列有何意义、用途?原出处?
类似的数列无穷无尽,不会只是数字游戏吧。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-17 12:31 , Processed in 0.045707 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表