Estoy tratando de crear una función para probar si un entero dado es un número primo, intenté usar lo siguiente:
tpn <- function(prime.num){
if(prime.num==2){
print("PRIME")
} else {
if(prime.num%%(2:(prime.num-1))!=0){
print("PRIME")
} else {
print("NOT PRIME")
}}}
Esto no funciona, aunque no puedo entender por qué. Estoy comprobando si el número dado se puede dividir por cualquiera de los enteros hasta este número sin remanentes. Si no puede, entonces el número es primo.
Otra solución que encontré fue:
tpn <- function(pn){
if(sum(pn/1:pn==pn%/%1:pn)==2)
print("prime")
}
Esto funciona. Aunque, no puedo entender lo que realmente está probando.sum(pn/1:pn == pn%/%1:pn) == 2
Solución
Un número es divisible por un número si el resultado de la división es igual al resultado de la división entera. Cualquier entero se puede dividir por al menos dos números: y . Los números primos son aquellos que solo se pueden dividir por esos dos. Desglosando el código:a
b
a / b
a %/% b
pn
1
pn
pn / 1:pn
son los resultados de las divisiones por , , …,1
2
pn
pn %/% 1:pn
son los resultados de las divisiones enteras por , , …,1
2
pn
sum(pn / 1:pn == pn %/% 1:pn)
son cuántos de estos son iguales, es decir, el número de divisores enteros de . Si este número es , tienes un número primo.pn
2
Lo que estaba mal con su código: necesita probar si algo es o pero lo estaba pasando un vector completo. Además, su lógica estaba equivocada. Debería haber sido:if
TRUE
FALSE
is.prime <- function(num) {
if (num == 2) {
TRUE
} else if (any(num %% 2:(num-1) == 0)) {
FALSE
} else {
TRUE
}
}
Y una vez que haya decidido devolver una lógica, puede hacer que su código sea mucho más corto:
is.prime <- function(n) n == 2L || all(n %% 2L:max(2,floor(sqrt(n))) != 0)
(que incorpora el comentario de @Carl sobre no verificar todos los números).
Otras respuestas
También puede utilizar la función en el paquete matlab. Funciona también con argumentos vectoriales:isprime()
library(matlab)
as.logical(isprime(7))
as.logical(isprime(42))
#> as.logical(isprime(7))
#[1] TRUE
#> as.logical(isprime(42))
#[1] FALSE