카테고리 없음

(정수론/파이썬) 소수 이후 합성수가 연이어 나올 때

미친토끼 2021. 9. 12. 16:23
# 소수 492,113부터는 합성수가 113개 연달아 나온다.
# 소수 다음에 합성수가 일정 횟수 이상 연이어 나온다면 그 앞뒤의 소수와 합성수 출현 횟수를 출력

# 해당 숫자가 소수인지 판정하는 함수
def isPrime(num):
  root_val = round(num ** 0.5) # 제곱근 값을 구한다
  for i in range(2, root_val+1): # 제곱근값+1 까지만 약수를 조사해도 충분하다
    if num % i == 0:  # 중간에 나눠지면 소수가 아니다
      return False
  return True   # 끝까지 나눠지지 않을 경우, 소수로 판정하고 리턴한다.


MAX_NUM = 1000000  # 까지 검사한다
LEAST = 90  # 합성수가 이 개수만큼 연이어 나온다면
c_count = 0   # 연이은 합성수 출현 횟수 초기화
lst = []      # 연이은 합성수 출현 횟수와 그 시작 소수 기록

for i in range(2, MAX_NUM):
  if isPrime(i) != True:  # 합성수라면
    c_count += 1
  else:      # 소수라면 
    if c_count >= LEAST:
      print(f"합성수 {c_count} 개: 소수 {prev_prime} ~ 소수 {i}")
      lst.append((prev_prime, c_count))
    prev_prime = i
    c_count = 0

# 연이은 합성수가 제일 많은 구간 찾기
max_count = 0    # 연이은 합성수 출현 횟수 초기화
prime_start = 2  # 첫 소수로 초기화

for start, count in lst:
  if max_count < count:
    max_count = count
    prime_start = start

print()
print(f"최대: 소수 {prime_start}에서부터 합성수 연이은 출현 횟수 : {max_count} 회")

결과:

합성수 95 개: 소수 360653 ~ 소수 360749
합성수 111 개: 소수 370261 ~ 소수 370373
합성수 99 개: 소수 396733 ~ 소수 396833
합성수 113 개: 소수 492113 ~ 소수 492227
합성수 97 개: 소수 604073 ~ 소수 604171
합성수 99 개: 소수 838249 ~ 소수 838349
합성수 95 개: 소수 860143 ~ 소수 860239
합성수 91 개: 소수 927869 ~ 소수 927961

최대: 소수 492113에서부터 합성수 연이은 출현 횟수 : 113 회