소수는 그리스 시대부터 본인과 1로만 나눠줘서 절대 깨지지 않는 합성수와 다른 완전성 때문에 큰 관심을 갖게 되었다. 즉, 합성수는 소수의 곱으로 인수분해를 통해 구할 수 있기 때문에 소수를 알게 되면 모든 숫자를 이해하게 되는 것이라 여겨졌다. 소수는 수(자연수)의 근원이다.
정수론 혹은 수론(Number Theory)에서 소수는 중요한 의미를 갖는다. 역사적으로 중요한 소수에 대한 상식적인 내용은 다음과 같다.
\[Li(N) = \int_{0}^{N} {\frac{1}{\log x}}dx\]
에라토스테네스의 체는 고대 그리스 수학자 에라토스테네스(Eratosthenes)가 발견한 소수를 찾는 알고리즘이다.
function(num){
sieve_of_eratosthenes <- rep(TRUE, num)
values <-1] <- FALSE
values[ 2
prev_prime <-for(i in prev_prime:sqrt(num)){
seq.int(from = 2 * prev_prime, to = num, by = prev_prime)] <- FALSE
values[ prev_prime + min(which(values[(prev_prime + 1) : num]))
prev_prime <-
}return(which(values))
}
sieve_of_eratosthenes(10)
[1] 2 3 5 7
소수를 생성하는 R 팩키지는 다음과 같다.
library(schoolmath)
library(primefactr)
library(sfsmisc)
library(primes)
library(numbers)
library(spuRs)
library(randtoolbox)
library(matlab)
numbers
팩키지를 사용해서 10까지 소수를 찾아보자.
library(numbers)
::Primes(n1 = 10) numbers
[1] 2 3 5 7
유클리드(Euclid)에 의해서 “소수는 무한히 많다”라는 사실이 증명되었다. 과연 그럴까 다음 가정을 기반으로 증명해보자.
산술의 기본 정리(fundamental theorem of arithmetic)는 모든 양의 정수는 유일한 소인수 분해를 갖는다는 정리이다. 예를 들어, 1200은 다음과 같이 소수의 곱으로 표현되는데 순서를 바뀌는 것을 제외하면 유일하다.2
\[1200 = 2^4 \cdot 3 \cdot 5^2 = (2 \cdot 2 \cdot 2 \cdot 2) \cdot 3 \cdot (5 \cdot 5) = 5 \cdot 2 \cdot 5 \cdot 2 \cdot 3 \cdot 2 \cdot 2 = \ldots\]
상기 사실을 근거로 소수는 무한히 많다는 사실을 증명할 수 있다.
어떤 양수 \(x\)에 대해 \(x\)보다 작은 소수의 개수는 대략 \(\frac{x}{\log x}\)개가 있다는 것을 표로 정리하면 다음과 같다. 즉, 1~10 사이는 2,3,5,7 소수가 4개 1~100 사이는 25개 … 와 같이 정리된다.
library(tidyverse)
library(rvest)
"https://en.wikipedia.org/wiki/Prime_number_theorem"
prime_number_theorem_url <-
Sys.setlocale("LC_ALL", locale = "C")
[1] "C"
prime_number_theorem_url %>%
gauss_tbl <- read_html(encoding = "UTF-8") %>%
html_nodes(xpath = '//*[@id="mw-content-text"]/div[1]/dl[53]/dd/table') %>%
html_table(fill = TRUE, header = TRUE) %>%
.[[1]] %>%
select(1,2,4)
Sys.setlocale("LC_ALL", locale = "Korean")
[1] "LC_COLLATE=Korean_Korea.949;LC_CTYPE=Korean_Korea.949;LC_MONETARY=Korean_Korea.949;LC_NUMERIC=C;LC_TIME=Korean_Korea.949"
%>%
gauss_tbl as_tibble() %>%
mutate(x = as.character(x)) %>%
mutate(power = str_remove(x, pattern = "10")) %>%
mutate(power = ifelse(power > 0, power, 1) %>% as.integer) %>%
mutate(x = 10 ** power) %>%
reactable::reactable()
자연수 \(N\)까지 포함된 소수의 갯수를 세어보자. 이를 그래프로 만들어 시각화한다.
library(numbers)
library(tidyverse)
function(num) {
count_prime_numbers <-Primes(num) %>% length
}
2:10000
numbers_seq <-
tibble(numbers = numbers_seq,
prime_tbl <-prime_numbers = map_int(numbers_seq, count_prime_numbers))
%>%
prime_tbl ggplot(aes(x= numbers, y=prime_numbers)) +
geom_line() +
geom_point(size = 0.1) +
theme_light() +
labs(title = "자연수 N 까지 소수의 갯수",
x = "자연수",
y = "소수의 갯수") +
scale_x_continuous(labels = scales::comma) +
scale_y_continuous(labels = scales::comma)
데이터 과학자 이광춘 저작
kwangchun.lee.7@gmail.com