This code is a translation from pseudo-code in a mathemathics wiki to resolve Fibonacci problem in O log(n).
The problem comes when you want to change the seeds of fibonacci (1,0), this is most mathematical question and complexity question than programatically...
So... Where to put A and B to start for example with seeds 5,6?
Thanks for your time!
public static BigInteger Fib(int A, int B, int n)
{
if (n <= 0)
return 0;
n = n - 1;
_auxOne = 0;
_auxTwo = 1;
Matrix[0, 0] = _auxTwo; //a
Matrix[0, 1] = _auxOne; //b
Matrix[1, 0] = _auxOne; //c
Matrix[1, 1] = _auxTwo + _auxOne; //d
while (n > 0)
{
if (n % 2 != 0)
{
_auxOne = Matrix[1, 1] * Matrix[0, 1] + Matrix[1, 0] * Matrix[0, 0]; //(db+ca)
_auxTwo = Matrix[1, 1] * (Matrix[0, 1] + Matrix[0, 0]) + Matrix[1, 0] * Matrix[0, 1]; //(d(b+a)+cb)
Matrix[0, 0] = _auxOne;
Matrix[0, 1] = _auxTwo;
}
_auxOne = BigInteger.Pow(Matrix[1, 0], 2) + BigInteger.Pow(Matrix[1, 1], 2); //(c²+d²)
_auxTwo = Matrix[1, 1] * (2 * Matrix[1, 0] + Matrix[1, 1]); //(d*(2c+d))
Matrix[1, 0] = _auxOne;
Matrix[1, 1] = _auxTwo;
n = n / 2;
}
return Matrix[0, 0] + Matrix[0, 1];
}
_auxOne
and_auxTwo
. I still think this is not really a math question but about coding. – M. Winter Oct 23 '17 at 13:09