-
-
Notifications
You must be signed in to change notification settings - Fork 46.9k
Project Euler 65 Solution #3035
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
dhruvmanila
merged 11 commits into
TheAlgorithms:master
from
peteryao7:peteryao7_project-euler-67
Oct 24, 2020
Merged
Changes from 10 commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
fa750c9
Add solution for Project Euler 65, Fixes: #2695
peteryao7 ad934bf
Add URL to problem 65 and don't pass in parameter to solution()
peteryao7 6fbc596
Remove solution() tests
peteryao7 542ca5a
Add tests for solution(), add fstring and positional arg for solution
peteryao7 6ebfdb7
Merge branch 'master' into peteryao7_project-euler-67
peteryao7 e5d1933
Merge changes
peteryao7 5918f97
Rename directory and problem number to 065
peteryao7 a53bb63
Merge branch 'peteryao7_project-euler-67' of https://github.com/peter…
peteryao7 8cac24d
Remove directory
peteryao7 d81a171
Move up explanation to module code block
peteryao7 27d0614
Move solution() below helper function, rename variables
peteryao7 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,100 @@ | ||
""" | ||
Project Euler 65 | ||
https://projecteuler.net/problem=65 | ||
|
||
The square root of 2 can be written as an infinite continued fraction. | ||
|
||
sqrt(2) = 1 + 1 / (2 + 1 / (2 + 1 / (2 + 1 / (2 + ...)))) | ||
|
||
The infinite continued fraction can be written, sqrt(2) = [1;(2)], (2) | ||
indicates that 2 repeats ad infinitum. In a similar way, sqrt(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 sqrt(2). | ||
|
||
1 + 1 / 2 = 3/2 | ||
1 + 1 / (2 + 1 / 2) = 7/5 | ||
1 + 1 / (2 + 1 / (2 + 1 / 2)) = 17/12 | ||
1 + 1 / (2 + 1 / (2 + 1 / (2 + 1 / 2))) = 41/29 | ||
|
||
Hence the sequence of the first ten convergents for sqrt(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 10th convergent is | ||
1 + 4 + 5 + 7 = 17. | ||
|
||
Find the sum of the digits in the numerator of the 100th convergent | ||
of the continued fraction for e. | ||
|
||
----- | ||
|
||
The solution mostly comes down to finding an equation that will generate | ||
the numerator of the continued fraction. For the i-th numerator, the | ||
pattern is: | ||
|
||
n_i = m_i * n_(i-1) + n_(i-2) | ||
|
||
for m_i = the i-th index of the continued fraction representation of e, | ||
n_0 = 1, and n_1 = 2 as the first 2 numbers of the representation. | ||
|
||
For example: | ||
n_9 = 6 * 193 + 106 = 1264 | ||
1 + 2 + 6 + 4 = 13 | ||
|
||
n_10 = 1 * 193 + 1264 = 1457 | ||
1 + 4 + 5 + 7 = 17 | ||
""" | ||
|
||
|
||
def solution(max: int = 100) -> int: | ||
""" | ||
Returns the sum of the digits in the numerator of the max-th convergent of | ||
the continued fraction for e. | ||
|
||
>>> solution(9) | ||
13 | ||
>>> solution(10) | ||
17 | ||
>>> solution(50) | ||
91 | ||
""" | ||
n0 = 1 | ||
n1 = 2 | ||
|
||
for i in range(2, max + 1): | ||
temp = n0 | ||
m = 2 * i // 3 if i % 3 == 0 else 1 | ||
n0 = n1 | ||
n1 = m * n0 + temp | ||
|
||
return sum_digits(n1) | ||
|
||
|
||
def sum_digits(num: int) -> int: | ||
""" | ||
Returns the sum of every digit in num. | ||
|
||
>>> sum_digits(1) | ||
1 | ||
>>> sum_digits(12345) | ||
15 | ||
>>> sum_digits(999001) | ||
28 | ||
""" | ||
digit_sum = 0 | ||
while num > 0: | ||
digit_sum += num % 10 | ||
num //= 10 | ||
return digit_sum | ||
|
||
|
||
if __name__ == "__main__": | ||
print(f"{solution() = }") |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.