The square root of 2 can be written as an infinite continued fraction.
2 = 1 + | 1 | |||
2 + | 1 | |||
2 + | 1 | |||
2 + | 1 | |||
2 + ... |
The infinite continued fraction can be written, 2 = [1;(2)], (2) indicates that 2 repeats ad infinitum. In a similar way, 23 = [4;(1,3,1,8)].
It turns out that the sequence of partial values of continued fractions for square roots provide the best rational approximations. Let us consider the convergents for 2.
1 + | 1 | = 3/2 |
2 |
1 + | 1 | = 7/5 | |
2 + | 1 | ||
2 |
1 + | 1 | = 17/12 | ||
2 + | 1 | |||
2 + | 1 | |||
2 |
1 + | 1 | = 41/29 | |||
2 + | 1 | ||||
2 + | 1 | ||||
2 + | 1 | ||||
2 |
Hence the sequence of the first ten convergents for 2 are:
What is most surprising is that the important mathematical constant,
e = [2; 1,2,1, 1,4,1, 1,6,1 , ... , 1,2k,1, ...].
The first ten terms in the sequence of convergents for e are:
The sum of digits in the numerator of the 10th convergent is 1+4+5+7=17.
Find the sum of digits in the numerator of the 100th convergent of the continued fraction for e.
using System;
namespace project_euler
{
class Program
{
static void Main()
{
//Problem 65
DateTime start = DateTime.Now;
//e = [2;1,2,1,1,4,1,1,6,1,....,1,2k,1,...]
//numerator_n = a_n * numerator_n-1 + numerator_n-2
//denominator_n = a_n * denominator_n-1 + denominator_n-2
BigInt numerator_2 = 2, numerator_1 = 3, numerator=0;
//BigInt denominator_1 = 1,denominator_2 = 1, denominator;
int sum = 0;
for (int i = 2; i < 100; i++)
{
int a = (i + 1) % 3 == 0 ? 2 * ((i + 1) / 3) : 1;
numerator = numerator_1 * a + numerator_2;
numerator_2 = numerator_1;
numerator_1 = numerator;
//denominator = a * denominator_1 + denominator_2;
//denominator_2 = denominator_1;
//denominator_1 = denominator;
//Console.WriteLine(numerator);
//Console.WriteLine("-----------------------------------------");
//Console.WriteLine(denominator);
}
char[] c = numerator.ToString().ToCharArray();
foreach (char c1 in c)
sum += int.Parse(c1.ToString());
Console.WriteLine(sum);
TimeSpan time = DateTime.Now - start;
Console.WriteLine("This took {0}", time);
Console.ReadKey();
}
}
}
No comments:
Post a Comment