public void Go() { var gen = new BigInteger[, ] { { 0, 1 }, { 1, 1 }, }; var f1 = new BigInteger[, ] { { 0, 0 }, { 0, 1 }, }; const int desiredLen = 1000; const int maxN = 100000; var result = 0; EnumerableHelper.BinarySearch(maxN, n => { var fibn = GetFib(gen, f1, n); var len = fibn.ToString().Length; result = n; if (len < desiredLen) { return(1); // go right } return(-1); // go left }); Console.WriteLine(result); Console.WriteLine(new { n = 11, len = GetFib(gen, f1, 11).ToString().Length }); Console.WriteLine(new { n = 12, len = GetFib(gen, f1, 12).ToString().Length }); Console.WriteLine(new { n = result - 1, len = GetFib(gen, f1, result - 1).ToString().Length }); Console.WriteLine(new { n = result, len = GetFib(gen, f1, result).ToString().Length }); }