目标是计算F(n)模m(m等于10的幂5),其中n可能真的很大:最多10的幂18。
我的算法太慢了。
我的方法:计算并存储所有不超过m的斐波那契数,然后遍历该数组并对斐波那契数取模。
一旦找到pisano周期的长度,我就可以使用该长度来计算任何 F(n)
我的代码:
import java.math.BigInteger;
import java.util.*;
public class FibonacciAgain {
private static ArrayList<BigInteger> calc_fib() {
ArrayList<BigInteger> fib = new ArrayList<>();
fib.add(BigInteger.ZERO);
fib.add(BigInteger.ONE);
for (int i = 2; i <= 100000; i++) {
fib.add(fib.get(i - 2).add(fib.get(i - 1)));
}
return fib;
}
private static long calculatePeriod(ArrayList<BigInteger> fib, long modulo) {
long periodLength = 0;
boolean periodFound = false;
long[] period = new long[1000000];
period[0] = 0;
period[1] = 1;
period[2] = 1;
int i = 3;
while …Run Code Online (Sandbox Code Playgroud)