TheAlgorithms-Python

Форк
0
99 строк · 2.5 Кб
1
"""
2
Project Euler Problem 65: https://projecteuler.net/problem=65
3

4
The square root of 2 can be written as an infinite continued fraction.
5

6
sqrt(2) = 1 + 1 / (2 + 1 / (2 + 1 / (2 + 1 / (2 + ...))))
7

8
The infinite continued fraction can be written, sqrt(2) = [1;(2)], (2)
9
indicates that 2 repeats ad infinitum. In a similar way, sqrt(23) =
10
[4;(1,3,1,8)].
11

12
It turns out that the sequence of partial values of continued
13
fractions for square roots provide the best rational approximations.
14
Let us consider the convergents for sqrt(2).
15

16
1 + 1 / 2 = 3/2
17
1 + 1 / (2 + 1 / 2) = 7/5
18
1 + 1 / (2 + 1 / (2 + 1 / 2)) = 17/12
19
1 + 1 / (2 + 1 / (2 + 1 / (2 + 1 / 2))) = 41/29
20

21
Hence the sequence of the first ten convergents for sqrt(2) are:
22
1, 3/2, 7/5, 17/12, 41/29, 99/70, 239/169, 577/408, 1393/985, 3363/2378, ...
23

24
What is most surprising is that the important mathematical constant,
25
e = [2;1,2,1,1,4,1,1,6,1,...,1,2k,1,...].
26

27
The first ten terms in the sequence of convergents for e are:
28
2, 3, 8/3, 11/4, 19/7, 87/32, 106/39, 193/71, 1264/465, 1457/536, ...
29

30
The sum of digits in the numerator of the 10th convergent is
31
1 + 4 + 5 + 7 = 17.
32

33
Find the sum of the digits in the numerator of the 100th convergent
34
of the continued fraction for e.
35

36
-----
37

38
The solution mostly comes down to finding an equation that will generate
39
the numerator of the continued fraction. For the i-th numerator, the
40
pattern is:
41

42
n_i = m_i * n_(i-1) + n_(i-2)
43

44
for m_i = the i-th index of the continued fraction representation of e,
45
n_0 = 1, and n_1 = 2 as the first 2 numbers of the representation.
46

47
For example:
48
n_9 = 6 * 193 + 106 = 1264
49
1 + 2 + 6 + 4 = 13
50

51
n_10 = 1 * 193 + 1264 = 1457
52
1 + 4 + 5 + 7 = 17
53
"""
54

55

56
def sum_digits(num: int) -> int:
57
    """
58
    Returns the sum of every digit in num.
59

60
    >>> sum_digits(1)
61
    1
62
    >>> sum_digits(12345)
63
    15
64
    >>> sum_digits(999001)
65
    28
66
    """
67
    digit_sum = 0
68
    while num > 0:
69
        digit_sum += num % 10
70
        num //= 10
71
    return digit_sum
72

73

74
def solution(max_n: int = 100) -> int:
75
    """
76
    Returns the sum of the digits in the numerator of the max-th convergent of
77
    the continued fraction for e.
78

79
    >>> solution(9)
80
    13
81
    >>> solution(10)
82
    17
83
    >>> solution(50)
84
    91
85
    """
86
    pre_numerator = 1
87
    cur_numerator = 2
88

89
    for i in range(2, max_n + 1):
90
        temp = pre_numerator
91
        e_cont = 2 * i // 3 if i % 3 == 0 else 1
92
        pre_numerator = cur_numerator
93
        cur_numerator = e_cont * pre_numerator + temp
94

95
    return sum_digits(cur_numerator)
96

97

98
if __name__ == "__main__":
99
    print(f"{solution() = }")
100

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.