5승근 루트 177777.123의 값을
소수점 아래 3째 자리까지 구하기
nth root function을 정의하여 구하는
다소 어려운 방법은
유튜브에 강의 영상을 업로드 해놓았습니다.
[구독], [좋아요] 많이 눌러 주세요.
https://www.youtube.com/watch?v=uZnSlsIWaxU
중학생 때
루트2 값 구하는 과정을 이해하지 못하였고
나이 50을 넘도록 깨우치지 못하였습니다.
그래서 최근에 후배 수학도들을 위하여
쉽게 깨우치는 방법을 계속해서 연구하고 있는 중입니다.
그중
가장 간단한 방법을 소개합니다.
루트 2 (즉 2승근 루트 2)뿐만 아니라
3승근 루트 2,
4승근 루트 2,
5승근 루트 2,
...
의 값들도 구할 수 있는
일반적인 방법입니다.
단언컨대
초등학생도
이해할 수 있는
매우 쉬운 방법입니다.
예를 들어
다음을 만족하는 양의실수 x의
소수점 아래 세번째 자리까지의 값을 구하려고 해봅시다.
양의 실수 x의 값을
보통 다음과 같이 표현하고
'5승근 루트 177777.123'이라고 읽습니다.
문제에 등장할 때
직접적으로는
아래 표현을 더 자주 사용합니다.
즉 위의 값을
z.abc 형태로
소수점 아래 세 번째 자리까지 구하는 것이 목표입니다.
z, a, b, c를 구하기 위해 필요한
부등식은 다음과 같습니다.
z^5 ≦ 177777
(za)^5 ≦ 17777712300
(zab)^5 ≦ 1777771230000000
(zabc)^5 ≦ 177777123000000000000
자세한 설명
시작합니다.
루트 안의 자리수 채우기
일단
루트 안의
소수점 아래 자리수를 늘려야 합니다.
소수점 아래 3자리까지의 값(z.abc)을 구하려 하므로
루트 안의 소수점 아래 자리수는
최소한 5 * 3 = 15자리까지 필요합니다.
그런데 현재
루트 안의
소수점 아래 자리수는 3자리 뿐입니다.
따라서 아래와 같이
그 뒤 쪽에 0을 12개 채우고 시작합니다.
⓪
정수 부분 z부터 구합니다.
정수부분을 구할 때는
루트 안의 소수점을 기준으로
앞 쪽 정수부분
즉 177777 부분만 필요합니다.
다음을 만족하는 최대 정수 z를 구합니다.
z^5 ≦ 177777
11^5 = 161051
12^6 = 248832
따라서 z = 11입니다.
혹은
넘어서기 시작하는 값 z = 12를 구한 후
그보다 1 작은 값 z = 11을 취하면
부등식을 만족하는 최대값 z가 됩니다.
①
소수 첫째 자리 a를 구합니다.
루트 안의 소수점 아래 처음 5개의 숫자가 더 필요합니다.
다음을 만족하는 최대 정수 a를 구합니다.
(za)^5 ≦ 17777712300
그런데
z = 11이므로
다음을 만족하는 최대 정수 a를 구합니다.
(11a)^5 ≦ 17777712300
(단 부등식 좌변에 있는 11a는
11*a를 의미하는 것이 아니라
백의자리 1, 십의자리 1, 일의 자리 a임을 의미합니다.)
112^5 = 17623416832
113^5 = 18424351793
따라서 a=2입니다.
②
소수 둘째 자리 b를 구합니다.
루트 안의 소수점 아래 5개의 숫자를 더 동원합니다.
(즉 루트 안의 소수점 아래 총 10개의 숫자를 동원합니다.)
다음을 만족하는 최대 정수 b를 구합니다.
(zab)^5 ≦ 1777771230000000
z = 11, a=2이므로
다음을 만족하는 최대 정수 b를 구합니다.
(112b)^5 ≦ 1777771230000000
(단 부등식 좌변에 있는 112b는
112*b를 의미하는 것이 아니라
천의 자리 1, 백의자리 1, 십의자리 2, 일의 자리 a임을 의미합니다.)
1121^5 = 1770223341829601
1122^5 = 1778133174361632
따라서 b=1입니다.
③
소수 세째 자리 c를 구합니다.
루트 안의 소수점 아래 5개의 숫자를 더 동원합니다.
(즉 루트 안의 소수점 아래 총 15개의 숫자를 동원합니다.)
다음을 만족하는 최대 정수 c를 구합니다.
(zabc)^5 ≦ 177777123000000000000
z = 11, a=2, b=1이므로
다음을 만족하는 최대 정수 c를 구합니다.
(1121c)^5 ≦ 177777123000000000000
(단 부등식 좌변에 있는 1121c는
1121*c를 의미하는 것이 아니라
만의 자리 1, 천의자리 1, 백의자리 2, 십의 자리 1, 일의자리 c임을 의미합니다.)
11219^5 = 177734092113310052099
(11210 + 10)^5 = 177813317436163200000
c = 10이면 위 부등식을 넘어서기 시작하므로
그 보다 1 작은 값...
즉 c=9입니다.
즉
다음 수의 소수점 아래 세째자리까지의 값은
11.219 입니다.
Python Code
# n승근 루트 r의 값을 소수점 아래 dot_digit 자리까지 구하는 함수 def nRr(n, r, dot_digit=50): result = "" temp_result = "0"
s_r = str(r) s_r_z = "" # s_k의 정수 부분 문자열 s_r_f = "" # s_k의 소수 부분 문자열
s_r_dot_idx = s_r.find(".") if s_r_dot_idx > 0: s_r_z = s_r[0:s_r_dot_idx] s_r_f = s_r[s_r_dot_idx + 1:] else: s_r_z = s_r
# 실제 계산
# 정수 부분 값 my_val = int(s_r_z)
z = 0 # z = 1부터 해도 된다. while True: if z**n > my_val: temp_result = f"{temp_result}{z - 1}" result = f"{result}{z - 1}" break else: z += 1
if dot_digit == 0: return result
# 소수점 아래 dot_digit 자리까지 구하기 result = f"{result}."
s_r_f_extended_len = dot_digit * n if len(s_r_f) < s_r_f_extended_len: s_r_f = f"{s_r_f}{'0' * (s_r_f_extended_len - len(s_r_f))}"
for i in range(dot_digit): my_val = int(f"{s_r_z}{s_r_f[0:i*n + n]}") for d in range(0, 11): # d = 1 부터 해도 된다. if int(f"{temp_result}{d}")**n > my_val: temp_result = f"{temp_result}{d-1}" result = f"{result}{d - 1}" break
return result
if __name__ == "__main__": n = 5 k = 177777.123 dot_digit = 100
s_time = time.time() print(f"{n}승근 루트{k}의 값(소수점 아래 {dot_digit}자리까지):\n", nRr(n, k, dot_digit=dot_digit)) print("걸린시간: ", time.time() - s_time) |
결과:
5승근 루트177777.123의 값(소수점 아래 100자리까지): 11.2195431898477288634734452739796287611276487960898746215979105389872002720362627013977886997208330516 걸린시간: 0.0010006427764892578 |
첫댓글 nth_root_function을 이용하여
(참조: https://www.youtube.com/watch?v=uZnSlsIWaxU)
5승근 루트 177777.123의 값을
소수점 아래 5000자리까지 구해보았더니
걸린 시간은 약 27.35초 입니다.
---------------------------------------------------------------
여기에서 소개한 방법으로
구해보았더니
걸린 시간은 약 17.09초 입니다.
PLAY