Ich versuche die n-te Fibonacci-Zahl modulo 10^9 + 7 zu berechnen, wobei n vom Benutzer eingegeben wird.Berechnen der n-ten Fibonacci-Zahl modulo m unter Verwendung des Goldenen Schnitts in C
Ich habe das goldene Verhältnis verwendet, um Fibonacci-Zahlen zu berechnen.
Der folgende Code liefert korrekte Ergebnisse bis n = 43. Aber für n> = 44 geht phi über 10^9 + 7 und ich bekomme unerwartete Ergebnisse. Auch ergibt n> = 44 ein korrektes Ergebnis, wenn der Modul entfernt wird.
#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;
}
Warum passiert das? Ist es falsch, lange Doppel zu verwenden, um irrationale Zahlen zu speichern?
Dank
Frage: Ist es falsch, lange Doppel zu verwenden, um irrationale Zahlen zu speichern? Antwort: Ja, es ist so, dass sie nur zu einem gewissen Grad präzise sein können. Vielleicht möchten Sie Bibliotheken wie GMP anschauen (siehe [link] (https://gmplib.org/)). – jboockmann
[Modulare Kongruenz] (https://en.wikipedia.org/wiki/Modular_arithmetic) kann nicht auf rationale Zahlen, sondern nur auf ganze Zahlen angewendet werden. –
@pytheos: Danke. Aber ich denke, es sollte noch für niedrigere Werte funktionieren. – raksh93