Chinaunix首页 | 论坛 | 博客
  • 博客访问: 86570
  • 博文数量: 47
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 625
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-11 12:11
文章分类

全部博文(47)

文章存档

2008年(47)

我的朋友

分类:

2008-11-24 13:46:57

Problem 64

27 February 2004

All square roots are periodic when written as continued fractions and can be written in the form:

N = a0 +
1

  a1 +
1

    a2 +
1

      a3 + ...

For example, let us consider 23:

23 = 4 + 23 — 4 = 4 + 
1

 = 4 + 
1

 
1

23—4
  1 + 
23 – 3

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:

a0 = 4,  
1

23—4
 = 
23+4

7
 = 1 + 
23—3

7
a1 = 1,  
7

23—3
 = 
7(23+3)

14
 = 3 + 
23—3

2
a2 = 3,  
2

23—3
 = 
2(23+3)

14
 = 1 + 
23—4

7
a3 = 1,  
7

23—4
 = 
7(23+4)

7
 = 8 +  23—4
a4 = 8,  
1

23—4
 = 
23+4

7
 = 1 + 
23—3

7
a5 = 1,  
7

23—3
 = 
7(23+3)

14
 = 3 + 
23—3

2
a6 = 3,  
2

23—3
 = 
2(23+3)

14
 = 1 + 
23—4

7
a7 = 1,  
7

23—4
 = 
7(23+4)

7
 = 8 +  23—4

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?    

def getPeriodLength(num):
    #获取num平方根的分数循环长度
    z     = int(num**0.5)
    if z*z == num:
        return 0
    count = 0
    d     = {}#用于保存中间已计算变量
    fm    = (num, z)#分母
    fz    = 1#分子
    while 1:
        k = [fm, fz]
        if d.has_key(str(k)):
            return count
        else:
            count += 1
            d[str(k)] = True
            t = (num - z**2)/fz
            z = (int((num**0.5+z)/t))*t - z
            fm = (num, z)
            fz = t

def fun64():
    result = 0
    for i in range(2,10001):
        if getPeriodLength(i)%2 != 0:
            result += 1
    return result

answer is 1322
time:2.85899996758
阅读(877) | 评论(0) | 转发(0) |
0

上一篇:Problem 62

下一篇:Problem 66

给主人留下些什么吧!~~