Nouveau à Stackoverflow alors s'il vous plaît signaler tout ce que je peux faire pour améliorer la qualité de ma question.Alternative à long afin d'éviter débordement Numéros Fibonacci
Donc ce que mon code fait (ou plutôt espère faire) est de calculer d'énormes nombres de fibonacci modulo un assez grand m. Pour rendre l'algorithme plus efficace, j'utilise l'utilisation de pisano periods. Essentiellement, je calculer la période Pisano de m et ensuite faire le calcul du reste plus facile à l'aide de la relation suivante:
Le reste de la n ième nombre de Fibonacci (modulo m) est égal au reste de la k ème nombre de Fibonacci (modulo m ) de telle sorte que k = n% de p où p est le période pisano de m.
Pour calculer la période Pisano, j'utilise la propriété suivante:
Si le FIB% courant m = 0 et la somme de tous Fib de jusqu'à maintenant% m = 0 , alors l'indice du fib actuel est la période pisano de m. (Notez que l'index doit être supérieur à 0)
Cependant, je rencontre un problème dans cette tentative: Pour calculer la période pisano, je dois calculer des nombres consécutifs de Fibonacci. Le problème se pose lorsque le nombre de nombres Fibonacci qui doivent être calculés devient très grand, disons 100 000. Ensuite, le type de données déborde longtemps. À ma connaissance, toute tentative de calculer des périodes pisano nécessitera le calcul de fibonacci, donc la seule solution semble être de remplacer longtemps par autre chose. Si quelqu'un a des suggestions quant à ce que ce remplacement pourrait être, je l'apprécierais grandement.
import java.util.*;
public class FibHuge {
public static void main (String [] args) {
Scanner in = new Scanner (System.in);
long num = in.nextLong();
long mod = in.nextLong();
System.out.println (getMod(num, mod));
}
private static int getMod (long num, long mod) {
Period per = new Period();
long period = per.getPeriod (mod);
int newFibNum = (int)(num % period);
num = (num % mod);
Integer ia[] = new Integer [per.al.size()];
ia = per.al.toArray (ia);
return ia[newFibNum];
}
}
class Period {
ArrayList <Long> al;
long FNum;
long SNum;
Period() {
al = new ArrayList <Long>();
FNum = 0;
SNum = 1;
}
private long getFib (long first, long second){
return first + second;
}
long getPeriod (long mod){
boolean bool = true;
long fibcount = 0;
long currentmod = 0;
long fib = 0;
long sum = 0;
while (bool){
if (fibcount <= 1){
currentmod = fibcount % mod;
al.add (currentmod);
sum += fibcount;
}
else {
fib = getFib (FNum, SNum);
FNum = SNum;
SNum = fib;
currentmod = (fib % mod);
al.add (currentmod);
sum += fib;
}
if ((currentmod == 0 & (sum % mod) == 0) & fibcount > 0){
return fibcount;
}
fibcount++;
}
return mod; //essentially just to satisfy the return condition
}
}
* Le problème se pose lorsque le nombre de nombres Fibonacci qui doivent être calculés devient très important, disons 100 000. * - Je pense que vous avez tort à propos des nombres de Fibonacci. Ils se développent exponentiellement rapidement - la gamme de long est dépassée par le numéro 93e Fibonacci. – Leon
@Leon Eh bien, c'est bien pire que ce que je pensais. Même si je savais qu'ils se développaient de façon exponentielle, je n'avais aucune idée de ce qui se passerait si vite. – Airdish