Tuesday 21 April 2009

PROJECT EULER #65

Link to Project Euler problem 65

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:

1, 3/2, 7/5, 17/12, 41/29, 99/70, 239/169, 577/408, 1393/985, 3363/2378, ...

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:

2, 3, 8/3, 11/4, 19/7, 87/32, 106/39, 193/71, 1264/465, 1457/536, ...

The sum of digits in the numerator of the 10^(th) convergent is 1+4+5+7=17.

Find the sum of digits in the numerator of the 100^(th) 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: