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.