Java 黄金分割法求斐波那契数

Java 黄金分割法求斐波那契数,java,algorithm,Java,Algorithm,我必须找到XthFibonacci数,即F(X)%1000000007 例如,如果我必须findx(350)=672262724。这是一个 现在我感兴趣的是使用黄金分割率A=1.61 B=-0.61 X(350) = (A^350-B^350+1)/Math.sqrt(5) 但是如何处理模运算,因为如果我简单地使用%运算,它会给我错误的答案 这是我的密码: public static double super_pow(double A , long B){ double o=1;

我必须找到
Xth
Fibonacci数,即
F(X)%1000000007

例如,如果我必须fin
dx(350)=672262724
。这是一个

现在我感兴趣的是使用
黄金分割率A=1.61 B=-0.61

X(350) = (A^350-B^350+1)/Math.sqrt(5)
但是如何处理模运算,因为如果我简单地使用
%
运算,它会给我错误的答案

这是我的密码:

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;
}

当答案
小于
Mod
时,我可以正常工作。但是对于较大的值,它给出的答案是错误的。

它不是这样工作的。你不能假装在有限域中工作,然后除以无理数,或者你可以,但这毫无意义。你只会得到一些与你想要的答案无关的非理性结果。如果你走那条路的话,你就得用R来做整个事情。这需要计算非常大的数字,然后取一个余数,浮点数在某个点上会失去精度,让你变得毫无意义。如果你要取这样的余数,权重为1的位总是很重要的,但它不一定存在于浮点数中,这取决于指数。但也许你知道这一点,这就是为什么你选择不这么做

在这种情况下,有限域数学也无法做到这一点。如果5是你工作领域中的二次剩余,这个结构仍然有效。A和B不是phi和phibar,而是(sqrt(5)+1)/2和(1-sqrt(5))/2,在有限域数学中,这两个数字将变成“有趣的数字”,看起来与phi和phibar完全无关(但实际上是它们的有限域模拟)。当然,如果这样做,代码中的任何地方都不会有
Math.sqrt
。你需要一个数
x
,这样
x*x=5
就可以对某物进行模化,而不是对实数之间的解进行二元有理逼近

5的平方根必须存在,这其中任何一个才能工作,但模100000007,5没有平方根

以下工程模1009:856*(627n-383n)


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

它不是这样工作的。你不能假装在有限域中工作,然后除以无理数,或者你可以,但这毫无意义。你只会得到一些与你想要的答案无关的非理性结果。如果你走那条路的话,你就得用R来做整个事情。这需要计算非常大的数字,然后取一个余数,浮点数在某个点上会失去精度,让你变得毫无意义。如果你要取这样的余数,权重为1的位总是很重要的,但它不一定存在于浮点数中,这取决于指数。但也许你知道这一点,这就是为什么你选择不这么做

在这种情况下,有限域数学也无法做到这一点。如果5是你工作领域中的二次剩余,这个结构仍然有效。A和B不是phi和phibar,而是(sqrt(5)+1)/2和(1-sqrt(5))/2,在有限域数学中,这两个数字将变成“有趣的数字”,看起来与phi和phibar完全无关(但实际上是它们的有限域模拟)。当然,如果这样做,代码中的任何地方都不会有
Math.sqrt
。你需要一个数
x
,这样
x*x=5
就可以对某物进行模化,而不是对实数之间的解进行二元有理逼近

5的平方根必须存在,这其中任何一个才能工作,但模100000007,5没有平方根

以下工程模1009:856*(627n-383n)

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