所有的平方根写作连分数的时候都是周期性的,并且可以写成如下形式:
√N = a0 +
1
a1 +
1
a2 +
1
a3 + …
例如 √23:
如果继续下去我们得到如下展开式:
可以看出这个序列是重复的。简明起见,我们用 √23 = [4;(1,3,1,8)], 来表示(1,3,1,8)这个部分不断重复出现。
前十个无理平方根的连续分数表示为:
√2=[1;(2)], 周期=1
√3=[1;(1,2)], 周期=2
√5=[2;(4)], 周期=1
√6=[2;(2,4)], 周期=2
√7=[2;(1,1,1,4)], 周期=4
√8=[2;(1,4)], 周期=2
√10=[3;(6)], 周期=1
√11=[3;(3,6)], 周期=2
√12= [3;(2,6)], 周期=2
√13=[3;(1,1,1,1,6)], 周期=5
可以看出对于 N ≤ 13, 有四个连分数的周期是奇数。
对于 N ≤ 10000,有多少连分数的周期是奇数?
num = 0
for a0 in range(2, 100):
for N in range((a0 - 1) ** 2 + 1, a0 ** 2):
n_list = [[1, -(a0 - 1)]]
while 1:
denominator = (N - n_list[-1][-1] ** 2) / n_list[-1][0]
numerator = - n_list[-1][-1] - \
(a0 - 1 - n_list[-1][-1]) // denominator * denominator
l = [denominator, numerator]
if l in n_list:
break
n_list.append(l)
if (len(n_list) - n_list.index(l)) % 2:
num += 1
print(num)