我必须找到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
时,我的工作正常。但是对于较大的价值,答案是错误的。
答案 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次幂,以及稍微优化的版本(避免冗余计算)。