Exemplo n.º 1
0
        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);
        }