Acest cod reutilizează funcția care elimină toate cifrele pentru un număr, prezentată în Euler Problema 30. Soluția pentru această problemă utilizează și is.prime Funcție pentru a testa dacă un număr este un prim, dezvoltat pentru Euler Problema 7.
Următoarele funcții auxiliare ajută la rezolvarea problemei:
esieve: Generați primeis_prime: Verifică dacă un număr este primrotate_left: Rotește un număr
# Sieve of Eratosthenes
esieve <- function(x) {
if (x == 1) return(NULL)
if (x == 2) return(n)
l <- 2:x
i <- 1
p <- 2
while (p^2 <= x) {
l <- l(l == p | l %% p!= 0)
i <- i + 1
p <- l(i)
}
return(l)
}
## Check if a number is prime
is_prime <- function(x) {
if (x <= 1) return(FALSE)
if (x == 2 | x == 3) return(TRUE)
primes <- esieve(ceiling(sqrt(x)))
return(all(x %% primes != 0))
}
## Rotate a number to the left
rotate_left <- function(x) {
if (x <= 9) return(x)
i <- 1
y <- vector()
while(x >= 1) {
d <- x %% 10
y(i) <- d
i <- i + 1
x = x %/% 10
}
as.numeric(paste(y(c((length(y) - 1):1, length(y))), collapse = ""))
}
## Check circularity
is_circular_prime <- function(x) {
n <- trunc(log10(x)) + 1
p <- vector(length = n)
for (r in 1:n) {
p(r) <- is_prime(x)
x <- rotate_left(x)
}
all(p)
}
primes <- esieve(1E6)
length(which(sapply(primes, is_circular_prime)))
Programul principal se desfășoară prin fiecare dintre cele 78.498 de prime sub un milion, își economisește cifrele într -un vector și apoi rulează numerele pentru a testa primalitatea fiecărei rotații.
