欧拉计划 64

所有的平方根写作连分数的时候都是周期性的,并且可以写成如下形式:

√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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值