黄金比率找到斐波纳契数

时间:2016-04-09 18:09:16

标签: java algorithm

我必须找到Xth斐波纳契数,即F(X)%1000000007
例如,如果我必须d X(350) = 672262724。这是Code

现在我有兴趣找到使用Golden Ratio A=1.61 B=-0.61

X(350) = (A^350-B^350+1)/Math.sqrt(5)

但如何照顾Modulo,因为如果我只是使用%操作,它会给我错误的答案

这是我的代码:

public static double super_pow(double A , long B){

      double o=1;

      while(B>0){

          if((B&1)!=0) o*=A;

          A*=A;
          B/=2;
          o%=mod;
          A%=mod;
      }



      return (o+1)%mod;
}

当答案为less than Mod时,我的工作正常。但是对于较大的价值,答案是错误的。

1 个答案:

答案 0 :(得分:4)

它不会那样工作。你不能假装在有限的领域工作然后除以无理数,或者你可以,但它没有意义。你只会得到一些与你想要的答案毫无关系的不相关的非理性。如果你这样做,你必须在R中完成整个事情。这需要计算非常大的数字,然后取一个余数,浮点数在某些时候会耗尽精确度并给你废话。如果您要采用类似的余数,那么权重为1的位总是很重要,但它不一定存在于浮点数中,具体取决于指数。但也许你知道这一点,这就是你选择不这样做的原因。

在这种情况下,您也无法使用有限域数学。 Iff 5是您正在工作的领域中的二次残差,这种结构仍然有效。 A和B不分别是phi和phibar,但是(sqrt(5)+1)/ 2和(1-sqrt(5))/ 2,它们在有限域数学中将计算出来#34;有趣的数字"看起来与phi和phibar完全无关(但实际上是它们的有限域模拟)。当然,如果您这样做,代码中的任何地方都不会有Math.sqrt。您需要数字x,以便x * x = 5 模拟某些,而不是实数中解决方案的二元有理逼近。

任何一个都必须存在5的平方根,但模数1000000007,5没有平方根。

以下作品以模数1009:856 *(627 n - 383 n

其他算法仍然有效,例如将特定的2x2矩阵提升到n次幂,以及稍微优化的版本(避免冗余计算)。