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

[提问] 小学奥数:有 m 级楼梯,每次可上1级、2级或3级,有几种走法?

[复制链接]
发表于 2017-5-2 13:52:43 | 显示全部楼层
aimisiyou 发表于 2017-5-1 11:27
\(f(m)=f(m-1)+f(m-2)+f(m-3),(m>=4) 其中f(1)=1,f(2)=2,f(3)=4,f(4)=7……\)

土法炼钢,好办法,对于小学生容易明白
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-5-2 15:04:20 | 显示全部楼层
mathematica 发表于 2017-5-2 13:23
当项目特别巨大的时候,必须采用我的办法!
否则应该没办法计算!或者计算一定会失败!

矩阵的幂本身计算就是根据相似矩阵(矩阵特征值)来计算的,也就是那些特征方程方程的根的幂的线性组合,本质上还是通项公式,只是没显式写出来而已。

点评

@mathematica,n和n-3对于计算结果没有本质区别,你运行一下看看  发表于 2017-5-3 14:04
还有,是MatrixPower[a, n-3],而不是MatrixPower[a, n]  发表于 2017-5-3 13:28
MatrixPower这个函数,mathematica应该使用了优化算法,我指的是类似于模幂算法的快速算法,对于这个郭先强应知道  发表于 2017-5-3 13:28
矩阵的幂使用的是类似于模幂算法的办法,而不是使用特征值,你要是用特征值,计算速度会非常的慢!  发表于 2017-5-3 13:24
@mathe,这是符号运算,不是数值运算,你运行一下下面的代码,看到结果就明白了。  发表于 2017-5-2 23:00
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-5-2 21:59:27 | 显示全部楼层
kastin 发表于 2017-5-2 15:04
矩阵的幂本身计算就是根据相似矩阵(矩阵特征值)来计算的,也就是那些特征方程方程的根的幂的线性组合, ...


我自己简单写了一个 二分法求幂的函数。
  1. Pow[a_,b_]:=Module[{x=a,y=b},Sow[b];If[b==0,1,If[Mod[b,2]==0,Pow[a,b/2]^2,Pow[a,(b-1)/2]^2*a]]]
复制代码

该函数 每调用一次就会记录当前所计算的幂的指数值。通过记录的一连串值,你可以跟踪到 计算一个较大的幂的时候 实际上是经过了多少次 函数调用。

运行
  1. Reap[Pow[2,200000]]
复制代码
  

同样的,矩阵的幂运算也是这个道理, 也就是说,幂运算的复杂度是$O(lg(n))$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-5-2 23:18:59 | 显示全部楼层
@mathe
除了一些内部纯粹是数值算法编写的函数其结果是数值的,其他MMA的函数带入的如果不是浮点数,结果都是符号结果(具体的数认为是无穷精度的,而不是浮点数,类似PI这种也一样认为是符号)。

比较一下如下程序所用时间
  1. RecurrenceTable[{a[n]==a[n-1]+a[n-2]+a[n-3],a[1]==1,a[2]==2,a[3]==4},a,{n,1,5000}];//Timing
  2. RecurrenceTable[{a[n]==a[n-1]+a[n-2]+a[n-3],a[1]==1.,a[2]==2.,a[3]==4.},a,{n,1,5000}];//Timing
复制代码
第一行时间比第二行长,尤其当5000变得更大时更为显著。因为第一行代码是符号计算结果,第二行是数值计算结果(因为初值后面给的是浮点整数,这才是正宗的数值计算,得到的结果就是数值结果)。

点评

恩, 浮点运算用的是电脑硬件结构的 自然机器字长. 高精度的话,只能另外自己写一个存储结构, 这个就降低了效率  发表于 2017-5-3 20:11
5000改成100000才能看出来区别。  发表于 2017-5-3 13:10
@wayne,上面的例子就是说明整数和浮点数的差别,如果数值计算可以是整数运算,那上面的计算时间为何有差别?数值计算的整数运算就是第二行代码的形式。  发表于 2017-5-3 13:04
mathe的评论只限于 数值运算的层面  发表于 2017-5-3 00:25
符号运算取自英文单词Symbolic computation. 又叫 CAS,computer algebra system. 用的都是 符号推导的那种算法,是数的象征意义。数值计算用的是 C/C++语言基本类型,是基于数的值的形式存储运算的。  发表于 2017-5-3 00:24
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-5-3 13:30:30 | 显示全部楼层
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-5-3 14:02:37 | 显示全部楼层
mathematica 发表于 2017-5-3 13:30
http://bbs.emath.ac.cn/forum.php?mod=viewthread&tid=2555&fromuid=865
http://bbs.emath.ac.cn/forum.p ...

这个东西我知道,我在2014年特地写过Matlab版的很多数论函数(这些都是MMA有但Matlab没有的)。例如,利用Montgomery快速幂模算法来实现模幂运算
  1. function x=powermod(n,p,m)
  2. % Montgomery快速幂模算法 x = n^p mod m
  3. if p==0
  4.     x=1;
  5.     return;
  6. end
  7. r = mod(n,m);  
  8. tmp = 1;
  9. while p>1
  10.     if rem(p,2)==1,tmp = mod(tmp*r,m); end
  11.     r = mod(r*r,m);
  12.     p =bitshift(p,-1);
  13. end
  14. x=mod(r*tmp,m);
复制代码

问题是MMA内部计算表达式用的不一定都是数值算法,不信你看
  1. MatrixPower[{{1, 2}, {2, 3}}, 10^8]; // Timing (* 时间非常长 *)
  2. MatrixPower[{{1., 2.}, {2., 3.}}, 10^8]; // Timing (* 纯数值算法计算,时间很短 *)
复制代码

要注意,Timing[expr] 仅包括在计算 expr 时花费的时间,不包括在结果的格式化或输出上的时间.。为了确保这一点,上面用分号省去了结果输出。

上面第二行后面加小数点表示数字是浮点整数,第一行表示符号整数。二者数值上是一样的,但是内部计算过程就不一样。

点评

差别 在于 软件层面自己写的高精度数据结构 和 硬件层面 机器自然的数据字长的 性能差异  发表于 2017-5-3 20:13
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-5-3 15:12:30 来自手机 | 显示全部楼层
整数大数运算自然比浮点运算慢很多
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-5-3 17:07:55 | 显示全部楼层
kastin 发表于 2017-5-3 14:02
这个东西我知道,我在2014年特地写过Matlab版的很多数论函数(这些都是MMA有但Matlab没有的)。例如,利 ...


嗯,是的. 这个在Mathematica里面应该是做了算法自动切换的. 根据表达式确定 计算域, 进而选择不同的算法.


第一个是 任意精度(大数)运算.,第二个是 浮点运算.   第二个应该是有精度损失的,越大越不准.

但两个算法应该都用了二分法,不矛盾.  只是第一个算法的参与运算的存储结构是 高精度整数,  第二个参与运算的存储类型是 浮点数,

点评

是的.正如MMA的软广告所言,在MMA里,一切都是表达式. 只有在最后时刻才对表达式进行终极化简,然后求值,lazy evaluatation. 也就是行业的惰性求值  发表于 2017-5-4 14:47
MMA的里面只要不是浮点数,而是类似Pi,Sqrt[2], 2这种无限精确的数字的话,那么它后续函数计算过程中的精度是无穷位精度的,而不是有限位的高精度,不会出现浮点数那种误差累计。最明显的例子就是调和数Hn的计算。  发表于 2017-5-3 18:47
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2017-5-12 09:09:02 | 显示全部楼层
本帖最后由 TSC999 于 2017-5-12 09:20 编辑

【数学中国】网站 elim 推出的通项公式:

elim 推出的通项公式.png

用上面这个通项公式算出的结果,对于所有的自然数进行计算,结果都是接近真实值(整数)的实数,所以取其最接近的那个整数的值,即得到精确的真实值,没有任何误差!

请问,对于本问题,在理论上是否存在某个通项公式,对于任何自然数 n , 通项公式的计算结果都是一个精确的整数? 就像斐波那契数列的通项公式一样,虽然公式中含有根式,但是展开后却是个没有任何误差的整数。

点评

这个公式就是我在2#提到的公式,本质上就是使用了三次方程x^3-x^2-x-1的实根来表示  发表于 2017-5-12 22:05
elim 的 u 公式中还有一项±0.5,但是有这一项时对于某些 n 值反而会有误差,本帖去掉了±0.5,就意外地消除了那个误差。  发表于 2017-5-12 09:26
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2017-5-12 10:22:05 | 显示全部楼层
TSC999 发表于 2017-5-12 09:09
【数学中国】网站 elim 推出的通项公式:

这个公式我在10楼提高过了呀
  1. ToRadicals[
  2. Root[-1 - #1 - #1^2 + #1^3 &, 1]^
  3.    n Root[-1 + 12 #1 - 44 #1^2 + 44 #1^3 &, 1]]
复制代码

\[\frac{1}{44} \left(2 \sqrt[3]{11 \left(3 \sqrt{33}+77\right)}+\sqrt[3]{6776-264 \sqrt{33}}+44\right) 3^{-n-1} \left(\sqrt[3]{3 \sqrt{33}+19}+\sqrt[3]{19-3 \sqrt{33}}+1\right)^n\]

点评

是的,经验证,两公式计算结果一模一样。你的程序代码前若增加 Simplify[ ] 就更好了,结果将会简化。  发表于 2017-5-12 16:18
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-12-4 02:02 , Processed in 0.026937 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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