Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- NumPy
- 빅세타
- 코틀린 시작하기
- 빅오 표기법
- 이진 탐색
- nonhomogeneous linear system
- 랜덤 순서 배열
- one-to-one
- Big Theta
- matrix fo a linear transformation
- linear dependence
- matrix-vector product
- python
- trivial solution
- 코틀린 Hello World!
- 배열 섞기
- nontrivial solution
- 재귀함수
- homogeneous linear system
- Big-O 예제
- matrix trnasformations
- 빅오메가
- itertools
- Big Omega
- Big-Oh 예제
- solutions of matrix equation
- Big-Oh notation
- recursive algorithms
- 일차변환
- 알고리즘 분석의 실례
Archives
- Today
- Total
코딩 연습
(파이썬) 소수 발생기 본문
반응형
다음은 소수를 찾기 위해 내가 겪은 시행 착오 과정이다.
자연수 \(n\) 이 소수(prime number) 인지 체크하는 가장 단순한 방법은 \(n\) 이 \(1<k<n\) 인 모든 자연수 \(k\)로 나누어 떨어지지 않는 것을 보이는 것이다. 처음에 이런 방법으로 소수들을 찾고는 스스로 만족했었다.
그런데 가만히 생각해보니 \(\dfrac{n}{2}\) 보다 큰 수로는 \(n\) 이 나누어 떨어지지 않을 것이므로 \(k\) 의 범위를 \(1<k<\dfrac{n}{2}\) 로 바꿨다. 초등학생인 아들 녀석이 감탄했었다.
그런데 말입니다. \(1<k<\dfrac{n}{2}\) 의 모든 자연수들이 다 필요한 것이 아니었다. 이 중에서 소수들만 확인해 보면 되는 것이 아닌가?
- 그래서 소수들의 리스트(파이썬을 사용하고 있다.)를 만들어서 \(n\) 보다 작은 리스트의 요소 \(k\)들에 대해서만 \(n\) 이 \(k\)로 나누어 떨어지는지 확인하였다.
그래서 나온 코드이다.
primenumber=[] # 소수들이 들어갈 빈 리스를 하나 만들고,
for i in range(2, 100): # 2부터 99까지에서 소수들을 골라낼 거임
if i==2: # 만약 2라면 그냥 primenumber에 추가하고
primenumber.append(i)
else:
for j in primenumber:
if i%j==0: # primenumber의 요소들로 i 가 나누어 떨어지는지 확인하여
break # 나누어 떨어지면 소수가 아니므로 그냥 루프를 빠져 나오고
if j==primenumber[-1]: # 끝까지 나누어 떨어지는 놈이 없었는지 확인
primenumber.append(i) # 그렇다면 primenumber에 i를 추가한다.
print(primenumber)
그런데 말입니다. 또 생각을 해보니 만약 \(n\) 이 \(2\)로 나누어 떨어지지 않는다면 \(1<k<\dfrac{n}{2}\) 의 범위에서 생각하면 되고, \(3\) 으로 나누어 떨어지지 않는다면 \(1<k<\dfrac{n}{3}\) 의 범위에서 생각하면 되는 것이 아닌가? 이 과정을 소수 \(2, \; 3, \; 5,\; 7, \; \cdots\) 에 대해서 계속 해 주면 체크해야할 소수의 개수를 드라마틱(?)하게 줄일 수 있는 것이다.
그래서 다시 만들어 본 소수 발생기...
primenumber=[2]
for i in range(3, 1000000000):
j=0
index=i
while primenumber[j]<=index:
if i%primenumber[j]==0:
break
else:
index=int(i/primenumber[j])+1
if primenumber[j]>=index or primenumber[j+1]>index:
primenumber.append(i)
break
else:
j+=1
f=open("primenumber.txt", 'w')
f.write(str(primenumber))
f.close()
너무 많아서 파일을 열어서 파일에 써 버렸다.
실제로 해 봤더니 소수를 만드는 시간이 상당히 줄어드는 것을 확인할 수 있었다.
반응형
'Python' 카테고리의 다른 글
(파이썬) 최대공약수 구하기 (0) | 2016.03.15 |
---|---|
(파이썬) 완전제곱수 판별 (0) | 2016.03.15 |
(파이썬) 소수판정 (0) | 2016.03.15 |
(파이썬) 소인수 분해 (0) | 2016.03.15 |
(파이썬) 모든 조합의 경우 나열하기 (0) | 2016.03.15 |
Comments