The third problem in Project Euler is an interesting one:
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?
In order to compute prime factors, we can use a sieving method. The simplest and oldest sieving algorithm is the sieve of Erastothenes, which we can implement in R as follows:
sieve <- function(n) {
if (n <= 1) {
return(numeric(0))
}
if (n == 2) {
return(c(2))
}
a <- seq(2,n)
b <- c()
b[1] <- 2
i <- 1
while (length(a) > 0) {
b[i] <- a[1]
i <- i + 1
a <- a[!(a %% a[1] == 0)]
}
b
}
So now we need to compute the largest prime factor of 600851475143
. An upper bound for the factorisation is \(p \leq \lfloor\sqrt{x}\rfloor\), so we can halt our search at this point (alternatively, we may be able to begin our search here and work downwards). Let’s do it the obvious (and inefficient) way, starting at 1 and working up to \(\lfloor\sqrt{x}\rfloor\), building up a list of prime factors along the way:
pfactor <- function(x) {
factors <- c()
j <- 1
primes <- sieve( floor(sqrt(x)) )
for (prime in primes) {
if (x %% prime == 0) {
factors[j] <- prime
j <- j + 1
}
}
factors
}
Now to compute the maximum factor, we just take the maximum of this list:
max( pfactor(600851475143) )