优化pell数的功能,Mathematica

时间:2015-01-31 11:39:44

标签: wolfram-mathematica

我需要编写一个函数来查找第n个Pell编号。

这是佩尔数的递归关系。

P[0]=0, P[1]=1
P[n+1] = 2P[n] + P[n-1]; n>=1;

我是这样做的:

P[n_] :=
  If[n >= 1,
   Return[2*P[n - 1] + P[n - 2]]];

虽然有效,但必须针对n> = 50进行优化,这样才能在相对较短的时间内进行计算,而且这个方法并不快速。

2 个答案:

答案 0 :(得分:1)

记忆很好。或者可以做到

pell[n_] = 
 RSolveValue[{p[n] == 2*p[n - 1] + p[n - 2], p[0] == 0, p[1] == 1}, 
  p[n], n]

(* Out[4308]= -(((1 - Sqrt[2])^n - (1 + Sqrt[2])^n)/(2 Sqrt[2])) *)

或者

pell2[n_] := MatrixPower[{{2, 1}, {1, 0}}, n, {0, 1}][[1]]

答案 1 :(得分:0)

所有佩尔和纳西数都有近似的公式。这是您要寻找的佩尔数字的近似公式:

from __future__ import division  #if you are using python 2.x
from math import sqrt

Pell = 1 + sqrt(2)
pell = 1 - sqrt(2)

for i in range(1,50):
    print (Pell**i - pell**i)/(Pell-pell)