private static void TestMatrixMultiply(int n) { Console.WriteLine("Test matrix multiply - Loop (n^3) -> Strassen Algorithm (n^log7 or n^2.81):"); var st = new Stopwatch(); var matrix2 = new BigIntegerMatrix(new System.Numerics.BigInteger[n][]); for (var i = 0; i < n; i++) { matrix2[i] = new System.Numerics.BigInteger[n]; for (var j = 0; j < n; j++) { matrix2[i][j] = new Random(i * j).Next(100); } } st.Restart(); var resultMat = matrix2 * matrix2; st.Stop(); Print(resultMat.AsEnumerable()); Console.WriteLine(st.ElapsedMilliseconds); st.Restart(); resultMat = BigIntegerMatrix.StrassenMultiply(matrix2, matrix2); st.Stop(); Print(resultMat.AsEnumerable()); Console.WriteLine(st.ElapsedMilliseconds); }
public BigInteger Calculate(BigInteger n) { var basicArray = new[] { new BigInteger[] { 1, 1 }, new BigInteger[] { 1, 0 } }; var matrix = new BigIntegerMatrix(basicArray); var result = new MatrixNPowerCalculator().Power(matrix, n); return(result[1][0]); }
public BigIntegerMatrix Power(BigIntegerMatrix value, BigInteger n) { if (n <= 1) { return(value); } if (n % 2 == 0) { var halfValue = Power(value, n / 2); return(halfValue * halfValue); } else { var halfValue = Power(value, n / 2); return(halfValue * halfValue * value); } }