-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path064.py
92 lines (74 loc) · 2.3 KB
/
064.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
"""
Project Euler Problem 64
========================
All square roots are periodic when written as continued fractions and can
be written in the form:
N = a[0] + 1
a[1] + 1
a[2] + 1
a[3] + ...
For example, let us consider 23:
23 = 4 + 23 -- 4 = 4 + 1 = 4 + 1 1 1 + 23 - 3
23--4 7
If we continue we would get the following expansion:
23 = 4 + 1
1 + 1
3 + 1
1 + 1
8 + ...
The process can be summarised as follows:
a[0] = 4, 1 = 23+4 = 1 + 23--3
23--4 7 7
a[1] = 1, 7 = 7(23+3) = 3 + 23--3
23--3 14 2
a[2] = 3, 2 = 2(23+3) = 1 + 23--4
23--3 14 7
a[3] = 1, 7 = 7(23+4) = 8 + 23--4
23--4 7
a[4] = 8, 1 = 23+4 = 1 + 23--3
23--4 7 7
a[5] = 1, 7 = 7(23+3) = 3 + 23--3
23--3 14 2
a[6] = 3, 2 = 2(23+3) = 1 + 23--4
23--3 14 7
a[7] = 1, 7 = 7(23+4) = 8 + 23--4
23--4 7
It can be seen that the sequence is repeating. For conciseness, we use the
notation 23 = [4;(1,3,1,8)], to indicate that the block (1,3,1,8) repeats
indefinitely.
The first ten continued fraction representations of (irrational) square
roots are:
2=[1;(2)], period=1
3=[1;(1,2)], period=2
5=[2;(4)], period=1
6=[2;(2,4)], period=2
7=[2;(1,1,1,4)], period=4
8=[2;(1,4)], period=2
10=[3;(6)], period=1
11=[3;(3,6)], period=2
12= [3;(2,6)], period=2
13=[3;(1,1,1,1,6)], period=5
Exactly four continued fractions, for N 13, have an odd period.
How many continued fractions for N 10000 have an odd period?
"""
from math import sqrt
def period_of_root(num: int) -> int:
root = sqrt(num)
limit = int(root)
if root == limit:
return 0
count = 0
d = 1
m = 0
a = limit
while a != 2 * limit:
m = d * a - m
d = (num - m * m) // d
a = (limit + m) // d
count += 1
return count % 2
count = 0
for i in range(2, 10000):
if period_of_root(i) % 2 == 1:
count += 1
print(count)