카테고리 없음
(정수론/파이썬) 특정 숫자 이하 제곱수 개수 세기
미친토끼
2021. 9. 13. 21:47
# '친절한 수론 길라잡이' 연습문제 13.1.b
# "대부분의 정수는 제곱수가 아니다."라는 명제가 참임을 다음 셈 함수를 이용하여 설명하여라.
# S(x) = # {x보다 작은 제곱수}
# x가 큰 수일 때 S(x)와 근사적으로 같은 간단한 x의 함수를 찾아보아라.
# 숫자를 입력하면 그 이하에 있는 제곱수를 모두 찾아 그 갯수를 출력한다.
# 가령 16을 입력하면, 1, 4, 9, 16의 4개를 출력한다.
# S(x)에서 x에 다양한 값을 넣어봐서, 그에 따른 출력 개수와의 상관 관계를 파악한다.
# num 이하에서 제곱수를 찾아 그 개수를 출력한다.
def square_number_count(num):
root_val = int(num ** 0.5)
answers = []
for i in range(1, root_val+1):
answer = i ** 2
answers.append((i, answer))
return len(answers), answers
print(square_number_count(16))
print(square_number_count(25))
print(square_number_count(1000))
print()
lst_len = []
lst_x = []
# S(x)에 다양한 값을 넣어봐서, 제곱수 개수와의 대략적인 상관 관계를 찾는다.
for x in range(100, 20000, 1000):
length, res = square_number_count(x)
print(f"{length} / {x} = {round(length/x, 4)}")
lst_len.append(length)
lst_x.append(x)
'''출력
(4, [(1, 1), (2, 4), (3, 9), (4, 16)])
(5, [(1, 1), (2, 4), (3, 9), (4, 16), (5, 25)])
(31, [(1, 1), (2, 4), (3, 9), (4, 16), (5, 25), (6, 36), (7, 49), (8, 64), (9, 81), (10, 100), (11, 121), (12, 144), (13, 169), (14, 196), (15, 225), (16, 256), (17, 289), (18, 324), (19, 361), (20, 400), (21, 441), (22, 484), (23, 529), (24, 576), (25, 625), (26, 676), (27, 729), (28, 784), (29, 841), (30, 900), (31, 961)])
10 / 100 = 0.1
33 / 1100 = 0.03
45 / 2100 = 0.0214
55 / 3100 = 0.0177
64 / 4100 = 0.0156
71 / 5100 = 0.0139
78 / 6100 = 0.0128
84 / 7100 = 0.0118
90 / 8100 = 0.0111
95 / 9100 = 0.0104
100 / 10100 = 0.0099
105 / 11100 = 0.0095
110 / 12100 = 0.0091
114 / 13100 = 0.0087
118 / 14100 = 0.0084
122 / 15100 = 0.0081
126 / 16100 = 0.0078
130 / 17100 = 0.0076
134 / 18100 = 0.0074
138 / 19100 = 0.0072
'''
# 제곱수의 개수 변화를 보면 처음에는 0.1이었다가 0.01을 거쳐 점차 줄어들고 있다.
import numpy as np
import matplotlib.pyplot as plt
import math
print()
val_x = []
val_count = []
for x in range(100, 20000, 1000):
count = x/(np.log(x)**2)
print(x, " ", count)
val_x.append(x)
val_count.append(count)
plt.plot(lst_x, lst_len)
plt.plot(val_x, val_count)
plt.show()