【发布时间】:2016-04-17 19:35:50
【问题描述】:
我正在尝试计算第 n 个斐波那契数模 10^9+7,其中 n 由用户输入。
我使用黄金比例来计算斐波那契数。
以下代码在 n=43 之前产生正确的结果。但是对于 n>=44,phi 超过 10^9+7,我开始得到意想不到的结果。此外,如果去除模数,n>=44 会给出正确的结果。
#include <stdio.h>
#include <math.h>
long double mod=1000000007;
long double power(long double base, long long int expo)
{
if(base==1 || expo==0)
return 1;
if(expo&1)
{
long double temp = power(base, expo>>1);
return fmodl(base * fmodl(temp*temp, mod), mod);
}
else
{
long double temp=power(base, expo>>1);
return fmodl(temp*temp,mod);
}
}
int main(void) {
// your code goes here
long double phi = (1+powl(5, 0.5))/2;
long double phi_cap = (1 - powl(5, 0.5))/2;
long double root5 = powl(5, 0.5);
long long int n;
scanf("%lld",&n);
long double ans = fmodl( (power(phi, n) - power(phi_cap, n)) * power(root5,mod-2), mod);
printf("%.0Lf\n", ans);
return 0;
}
为什么会这样?用long double存储无理数有错吗?
谢谢
【问题讨论】:
-
问题:用long double存储无理数有错吗?答:是的,因为它们只能在一定程度上精确。你可能想看看像 GMP 这样的库(参见 link)。
-
Modular congruence 不能应用于有理数,只能应用于整数。
-
@pytheos:谢谢。但我想它应该仍然适用于较低的值
-
@MOehm:谢谢。这是否意味着不可能使用黄金比例来做到这一点?您能否举例说明何时可以使用 fmodl() 和 fmod() 等函数?
-
为什么要用这种方式计算斐波那契数?因为你认为它更快?