Project Euler 7: 10,001st Prime Number
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Project Euler 7 delves into the wonderful world of prime numbers. These numbers are interesting because they don't follow a predictable pattern. There is no algorithm to calculate primes, which is what makes them valuable in cryptography.
As the numbers get larger, the gaps between consecutive primes also increase. There are, however, some interesting patterns. There seem to be infinitely many twin primes, which are prime numbers that with a difference of two, such as (3, 5), (5, 7) and (11, 13). Another pattern in prime numbers are sexy primes, which differ by six: e.g. (5,11), (7, 13) and (11, 17). They are called sexy not because these primes are particularly attractive but because of the Latin word for six.
Project Euler 7 Definition
By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13. What is the 1,0001st prime number?
Solution
Finding the nth prime number can only be solved using brute force because primes do not follow a predictable pattern. We don't have to check whether a number is divisible by any number between 1 and itself. We only have to check whether a number is divisible by all primes between 2 and its square root. The is.prime()
function determines whether a number is a prime number by checking that it is not divisible by any prime number up to the square root of the number. The sieve of Eratosthenes used in Euler Problem 3 generates the prime numbers. The next step cycles through all odd numbers and increments a counter when we find a prime, stopping at 10001.
## Project Euler 7: 10,0001st Prime Number source("problem003.R", echo = FALSE) is.prime <- function(n) { if (n <= 1) return(FALSE) if (n == 2) return(TRUE) primes <- esieve(ceiling(sqrt(n))) return(prod(n %% primes != 0) == 1) } answer <- 1 n <- 1 # Start counter while (n < 10001) { # Find 10001 prime numbers answer <- answer + 2 # Next number if(is.prime(answer)) { n <- n + 1 # Increment counter } } print(answer)
Sexy Primes
The largest gap between two primes for the first 10,001 is 72. Sexy primes with a gap of 6 are the most common, as shown in the figure below.
## Sexy Primes library(ggplot2) library(dplyr) primes <- esieve(answer) p <- length(primes) gaps <- tibble(Gap = primes[2:p] - primes[1:(p - 1)], Sexy = Gap %% 6 == 0) %>% count(Gap, Sexy) ggplot(gaps, aes(factor(Gap), n, fill = Sexy)) + geom_col() + scale_fill_manual(values = c( "#7391AB", "#A62102"), name = "Sexy Prime Gap") + theme_minimal(base_size = 10) + labs(title = "Frequency of prime gaps for the first 10,000 primes", x = "Prime Gap", y = "Frequency") guide_legend(title = "Sexy Primes") ggsave("images/problem-007.png", width = 6, height = 4)
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.