private static BigInteger Fibonacci_MatrixExponentiation(int n) { //------------------------------- Stopwatch t = new Stopwatch(); t.Start(); //--------------------------------- if (n < 0) { return(BigInteger.MinusOne); } else if (n == 1) { return(n); } matrix2x2 res = new matrix2x2 { a = 1, b = 0, c = 0, d = 1 }; matrix2x2 fib = new matrix2x2 { a = 1, b = 1, c = 1, d = 0 }; do { if (n % 2 == 1) { res *= fib; } fib *= fib; } while ((n /= 2) > 0); /*do * { * if (n % 2 == 1) Mult2x2Matrix(ref result, F); * Mult2x2Matrix(ref F, F); * * } while ((n/=2) > 0);*/ //--------------------------------- t.Stop(); TimeSpan ts = t.Elapsed; Console.WriteLine("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10); //--------------------------------- File.WriteAllText(Directory.GetCurrentDirectory() + "\\Fibonacci_Matrix_Exponentiation.txt", res.c.ToString(), Encoding.UTF8); //File.WriteAllText(Directory.GetCurrentDirectory() + "\\Fibonacci_Matrix_Exponentiation.txt", result[1, 0].ToString(), Encoding.UTF8); //return result[1, 0]; return(res.c); }
private static BigInteger Fibonacci_MatrixExponentiation(int n) { if (n == 0) { return(BigInteger.Zero); } else if (n == 1) { return(BigInteger.One); } bool isNegative = n < 0 && n % 2 == 0; matrix2x2 res = new matrix2x2 { a = 1, b = 0, c = 0, d = 1 }; matrix2x2 fib = new matrix2x2 { a = 1, b = 1, c = 1, d = 0 }; n = Math.Abs(n); do { if (n % 2 == 1) { res *= fib; } fib *= fib; } while ((n /= 2) > 0); if (isNegative) { res.c = -res.c; } return(res.c); }