2 소수 구하기 알고리즘 Show 소수를 구하는 알고리즘은 약수의 개수로 판단하는 방법과 배수를 지워 가는 방법이 있습니다. 이 두 가지 알고리즘을 살펴보겠습니다. 알고리즘 ① 먼저 약수가 2개인 것으로 소수를 판별하는 방법입니다. 예를 들어 10이 소수인지 판단하려면 10을 1, 2, …, 9, 10으로 각각 나누어 보고 나머지가 0인 개수가 2개이면 소수라고 할 수 있습니다. 즉, 10을 1, 2, …, 9, 10으로 각각 나누고 나머지가 0이 나올 때마다 개수를 1 증가시킵니다. 그리고 최종적으로 개수가 2이면 소수리스트에 저장합니다. 즉, 약수의 개수가 2개이면 소수입니다. 10은 약수의 개수가 4개이므로 소수가 아니라고 판단합니다. 그렇다면 ‘5는 소수인가?’를 판단하려면 1, 2, 3, 4, 5로 나누어 약수의 개수가 2이면 소수라고 판단하면 되겠지요? 신간 소식 구독하기 뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요. Email address 프로젝트 오일러 문제들을 풀다보니 소수에 관련된 문제가 많이 나왔다. 처음 소수 구하는 알고리즘을 생각할 당시, 관련 지식이 미비해(공부한 지 너무 오래돼서) 구현한 알고리즘이 너무 조잡했다. (속도가 너무 느렸다.) 오늘 다시 차근차근 검색해 가며 다시 짜봤다. 가장 기초적인 방법1은 소수가 아니다. 2부터 자신의 수 이전까지 나눠서 떨어진다면 소수가 아니다. (소수는 1과 자신 외에 나눠지면 안된다.) 예 ) 15가 소수인지 판단하려면 15를 2로 나눠 나머지가 0인지 판단. 아니면 15를 3으로 나눠 나머지가 0인지 판단..소수가 아님 씩으로 판별을 하다보니 큰 숫자 (600851475143)가 나온다면 엄청난 계산을 해야 했다.
나눌 때 절반 까지만 나눔절반 이상의 숫자들은 확인할 필요가 없는 숫자이기 때문이다. 예를 들어 80이라는 숫자가 있다면, 자기자신을 제외하고 절반을 초과하는 숫자로 나눴을 때 나머지가 0이 되는 숫자가 나올 수가 없기 때문이다.
루트까지만 확인약수의 중심을 구하는 방법이다. 예를 들어 80이라는 숫자가 있다면, 약수들이 1, 2, 4, 5, 8, 10, 16, 20, 40, 80 이 된다. 이것은 1 x 80, 2 x 40, 4 x 20, 5 x 16, 8 x 10, 10 x 8, 16 x 5, 20 x 4, 40 x 2, 80 x 1이 되는 것이다. 이것을 보면 8 이후의 약수들은 8까지의 약수들의 역순(반비례)이다. 이는 80의 제곱근과 엇비슷하다. (80의 제곱근 8.94..........) 따라서 그 이후의 숫자들은 판별할 필요가 없다.
참고사이트 소수(Prime Number) 구하기 효율적 알고리즘 :: 코드자몽 Prime Number(소수) 판별법 알고리즘 Python 제곱과 루트 구하기 순환소수를 입력해주세요.순환부분을 3번 반복해주세요. (마지막 3번반복으로 자동인식) 입력 예시
분수로 변환하기핵심은 이것!
툴 제작과정툴을 만들게 된 계기에는 `이런 툴 원해요`에 등록되었고, 딱히 어렵다고 판단하진 않아서입니다. 이런 툴 원해요에 원하시는 툴을 설명해주시면, 자체적으로 가치판단하여 제작을 할 수 있습니다. 물론, 산업용 특수목적 계산기등도 가능합니다. (다만, 난이도와 이용자수, 비용등을 고려하여 제작여부는 보장드리지 않습니다.) 이런 툴 원해요에 달린 댓글한가지 고려했던점은, 학생들이 생각을 안하게 되고. 숙제로만 사용하지 않을까? 때문에 안만드려고 했었는데요. 최근에는 계산기를 잘 만들면, 원리를 이해시키는데 도움이 되지 않을까라는 생각이 들었습니다. 유명 수학/과학 유튜버 3Blue1Brown의 영상을 보시면 아시겠지만. 수학 및 과학적 원리를 시각적으로 표현해 이해를 돕는 영상을 주로 올리고 있습니다. 원리가 시각적으로 보여진다면, 이해와 응용에 도움이 될것으로 판단하였기 때문입니다. 이 툴은 학교나 학원의 선생님의 답안지 작성에도 사용할 수 있습니다. 생성된 결과를 우클릭하여 이미지를 저장하면, 그대로 사용가능한 답안 이미지가 됩니다. 원래 목적과는 다르게 이해에 도움이되는 시각적 효과를 주지 못한 것 같아 약간 아쉽습니다. 이러한 목적으로 제작되는 계산기는 이해 자료가 같이 생성되어야되기 때문에 제작에 시간이 오래걸릴수있으며, 고등학교 수학 문제(공식)만 다뤄도 하나부터 열까지 설명할 그래프 등 자료를 전부 만드려면 한달 넘게도 걸릴수있기 때문에.. 제작이 어려울 수 있습니다. 코드 1 - i(2 ~ N)를 j(2 ~ i)로 나누기N을 입력받고 i를 2~N까지 1씩 더한다. j가 2부터 i에 도달할때까지 1씩 더하면서 i와 나누어 떨어지면 (1과 자기 자신을 제외한 인수가 있으므로) 소수가 아님. 위 연산을 반복해서 0~N 까지 소수의 개수를 하나하나 판단하여 카운팅한다. 각 범위를 계산하며 시간을 측정해본 결과는 아래 표와 같다.
코드 2 - i (2 ~ N)를 j (2 ~ i / j)로 나누기현재 수 i가 2의 배수일 경우 i/2 * 2 = i, 3의 배수일 경우 i/3 * 3 = i, 5와 7의 배수일 경우는 i/5 * 5 = i, i/7 * 7 = i 가 성립한다. (4, 6등은 2와 3의 배수이므로 해당 범위에 포함된다.) 위 공식을 일반화시키면 아래와 같고, i/n * n = i 여기서 i의 소인수는 j와 i/j의 곱셈이므로 j는 i/j보다 클 수 없다는 가설을 적용하여 코드를 작성했다. (수가 커질수록 더 많은 범위의 계산이 생략되므로 속도가 빨라짐) 아래 표를 보면 코드1의 방식보다 좀 더 개선된 걸 볼 수 있다.
코드 3 - 에라토스테네스의 체에라토스테네스의 체를 활용하여 미리 계산된 소수 여부 테이블을 참조하는 방식으로 개수 확인한다. 작은 범위에서는 위의 알고리즘 들과 비슷하거나 느리지만 큰 수의 범위로 가면 훨씬 빠른걸 볼 수 있다.
참고
https://nitwit.tistory.com/17 암호학 - 소수 판별 프로그래밍 입문 단계에서 흔히들 과제로 많이 접해보는 문제이다. 특정 수를 입력했을때 이녀석이 소수인지 아닌지 판별하는 알고리즘을 짜보라는 식의 과제. 만약 여러분이라면 어떻게 풀겠 nitwit.tistory.com 왜 1은 소수가 아닌가?소수(prime)의 정의 때문이다. 소수는 1보다 큰 자연수 중 1과 자기자신만을 약수로 가지는 수로 정의된다. 1은 1보다 크지 않기때문에 소수가 아니다.
합성수가 뭐야?합성수(合成數, composite number)는 1보다 큰 자연수 중에서 소수가 아닌 수로, 약수의 개수가 3개 이상이고 둘 이상의 소수를 곱한 자연수이다. 1보다 큰 모든 정수는 소수이거나 합성수이다.
|