우연히 구글 코드 잼에서 출제된 재미있는 문제를 발견했다.

출제된 문제에서는
( 3 + √5 )n -------- 식1

의 결과값에서 마지막 세자리 정수값을 찾는 문제.

예를 들어서 ( 3 + √5)2 인 경우 값은 27.4164079... 이므로 정답은 "027" 이 된다.

첫번째 시도

√5가 2.xxxx 인 점에 착안해서  식을 ( 5 + x)n 로 놓고 시도.
(x는 0보다 크고 1보다 작다)

핵심은 m자리 정수값 x와 m+1 자리에서 처음으로 0이 아닌 값이 등장하는 소수값 y 를 곱할 경우 0보다 작다는 점에 착안함.
(ex : 99 * 0.009 < 1 )

( 5 + x)n  을 변형하면

nCn·5n·x0 + nCn-1·5n-1·x1 + nCn-2·5n-2·x2 + ......+ nC1·51·xn-1 + nC0·50·xn

과 같다.

n+1 개의 각 단항식의 결과값을 정수부분과 소수부분으로 나워서 정수 부분만 더한다...

는게 전략이었으나 n+1 개의 단항식의 소수부분의 총합이 1보다 작음을 증명할 수 없어서(수학 능력 부족-_-) 다른 방법을 모색함..

두번째 시도

이 방법은 첫번째에서 막힌

n+1개의 단항식의 소수부분의 합이 1보다 작다

의 증명을 피하기 위해서 생각해낸 방법으로 더 간단하다.

우선 3 + √5 를 근으로 하는 2차 방정식을 하나 유도해보자.

ax2 + bx +c = 0 --------- 식1

식1에 3 + √5 를 대입한 후 유리수와 무리수를 분리하면 두개의 식을 얻는다.

14a + 3b + c = 0
6a + b = 0

두  식으로부터 계산에 편리한 a,b,c 값을 구하면

a = 1, b= -6 , c = 4

이므로 식1은 다음과 같다.

x2 - 6x + 4 = 0 --------- 식2

이 식을 다음과 같이 변형하면...

x2 = 6x - 4  --------- 식3

식3과 같고 우변의 x에 3 + √5 를 대입해서 정리하면

x2 = 6(3 + √5) - 4 = 14 + 6√5 ------ 식4

가 되시겠다.

이제 6√5의 정수부분만 구하면 문제는 초간단 해결!!!!

유효 소수점

식4에서 6√5 의 정수 부분을 구할 때 √5에서 소수점 몇째까지를 구해야 될까?

정수 부분의 자리수를 k 라고 할 때 소수점도 k 자리 만큼만 구하면 된다.

두자리 정수 중 가장 큰 수인 99를 예로 들면 이렇다.

두자리 정수 99와 0.9999999999...를 곱할 경우 정수부분 자리수에 영향을 미치는 소수점은 0.99까지이다.(소수점 두자리까지만 유효)

99 * 0.9 = 89.1
99 * 0.09 = 8.91
99 * 0.009 = 0.891------ dispose!
99 * 0.0009 = 0.0891------ dispose!
.....

세번째 이후의 나머지 소수점의 합은 정수값에 영향을 미치지 못하므로 무시할 수 있다.

√5 = 2.23606797749978969... 이므로 6√5를 곱하면

6 * 0.2 = 1.2 -------- 첫번째 자리까지만 유효
6 * 0.03 = 0.18 ------ dispose!
6 * 0.006 = 0.036 ------ dispose!
6 * 0.0000 = 0.0000 ------ dispose!
6 * 0.00006 = 0.00036 ------ dispose!
....

여기서 1.2가 되는 소수점 첫째자리까지만 유효하다.

√5 의 소수점 구하기

2 < √5 < 3 이므로  2.

2.2 < √5 < 2.3 이므로  2.2

2.23 < √5 < 2.24 이므로 2.23

2.236 < √5 < 2.237 이므로 2.236

이 과정은 √5 와 곱해지는 정수값의 자리수를 보고 필요할때마다 한자리씩 늘려나가면 계산 복잡도를 낮출 수 있다.

정리하면

x3 의 경우 식3의 양변에 x를 곱한다.

x3 = (6x -4)x
     = 6x2 - 4x
          = 6(6x-4) - 4x
    = 32x -24
              = 32(3 + √5) - 24
      = 72 + 32√5

32 가 두자리이므로 √5에서 두자리까지만 소수점을 구한 후 곱한다.

x3 ≒ 72 + 32*2.23 = 143.36

143이 구해졌다.



'Dev' 카테고리의 다른 글

drawing LineGraph using Javascript  (0) 2008.10.23
티스토리 메뉴 디자인  (0) 2008.06.30
useful firefox add-ons  (0) 2008.06.14
Posted by yeori
,