파이썬 점화식, sqrt(2) 의 연분수 표현 구하기

조회수 529회

이미지

동그라미 친 a0,a1,a2...,a50 까지 구하는 코드를 짜고 싶어요.

i=0
for i in range(51):
     j=i+1
    xj=1/(xi-ai)
    aj=int(xi)
    print (aj)

대충 이런식으로 하면 될 것 같았는데 어림도 없네요. 고수분들 좀 도와주세요.

1 답변

    • sqrt(2) 의 float 근사값으로 구해보기.
    >>> b = [ 2**.5 ]
    >>> a = []
    >>> a
    []
    >>> b
    [1.4142135623730951]
    >>> for n in range(51):
        aa = int(b[n])
        a.append(aa)
        bb = 1/(b[n] - aa)
        b.append(bb)
    
    
    >>> a
    [1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
     2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
     2, 1, 1, 1, 3, 3, 1, 3, 1, 1, 
     2, 1809, 1, 2, 5, 2, 2, 1, 2, 1, 
     3, 3, 4, 1, 1, 3, 12, 2, 2, 10, 
    32]
    

    질문에서의 베타n 을 b 라는 이름의 리스트에 담아서, b[0], b[1], b[2] 등등이 베타0, 베타1, 베타2 등이 되도록 하고, 마찬가지로 알파n 을 a 라는 이름의 리스트에 담아서, a[0], a[1], a[2] 등이 알파0, 알파1, 알파2 값을 나타내도록 합니다.

    • 초기에는 b에 첫원소인 루트(2) 만 넣어놓고, b 는 빈 리스트로 만들어 놓습니다.
    • for 루프 안에서 b[0] 에 대응되는 a[0] 를 int(b[0]) 로 구해서 a 의 첫 원소로 넣어, a[0] 를 만듭니다.
    • a[0] 가 구해지면, b[1] 을 주어진 1/(b[0] - a[0]) 식으로 구해서 b[1] 값을 구해서 b[1] 을 넣습니다.
    • n 값을 0, 1, 2 로 증가시키면서 계속 연산하여, a, b 리스트를 채웁니다.

    이렇게 해서 구해지는 a 리스트의 값은 위의 결과와 같습니다.


    하지만 이 결과는 우리가 잘 알고 있는 sqrt(2) 의 연분수 ([1:2,2,2,2...])와 다릅니다. 정확한 sqrt(2) 가 아닌 1.414... 인 근사값을 이용했기 때문에 뒤로 가서 2가 아닌 다른 값이 나옵니다.

    주어진 수식에서 b0 != b1 이지만 b1 == b2 인 것을 볼 수 있습니다. b2에서 b3 를 구하는 식은 b1에서 b2 를 구하는 식과 동일하기 때문에, b1 == b2 == b3 == b4 == ... 인 사실을 알 수 있습니다. 그래서 sqrt(2) 의 연분수는 복잡한 수식없이 구할 수 있습니다.

    꼭 수식과 연산을 통해 정확한 연분수의 값을 구하는 방법을 원한다면은... 좀 더 고민이 필요하겠네요.

    • 앗! 감사합니다! 하나 여쭤보고 싶은 부분이 있습니다. 처음에 b=[2**.5] 라고 설정하셨는데, 2**.5가 의미하는 바가 무엇인가요?? 2**은 제곱근 2를 의미하는 것 같은데 뒷 부분 .5 가 어떤 역할을 하는 건가요??ㅎㅎ 김예지 2022.6.3 21:28
    • sqrt(2) = 2^(1/2) 입니다. 파이썬에서는 ^ 기호가 xor 비트연산 기호이기 때문에, "몇승"을 ** 으로 표기합니다. 2**(1/2) 로 써도 되는데, 괄호를 쓰기 귀찮아서 그냥 2**0.5 로 쓴 것입니다. nowp 2022.6.3 23:05

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)