Diferentes formas de definir números primos


32

Una de mis definiciones favoritas de los números primos es la siguiente:

  • 2 es el primo más pequeño.

  • Los números mayores que 2 son primos si no son divisibles por un primo más pequeño.

Sin embargo, esta definición parece arbitraria, ¿por qué 2? ¿Por qué no algún otro número? Bueno, intentemos con otros números que definirán n-primo de modo que

  • n es el n-primo más pequeño.

  • Los números mayores que n son n-primos si no son divisibles por un n-primo más pequeño.

Tarea

La tarea aquí es escribir un programa que tome dos entradas, un entero positivo n y un entero positivo a . Luego decidirá si a es n -prime. Su programa debería generar dos valores distintos, uno para "sí, es n-prime" y otro para "no, no es n-prime".

Esta es una pregunta de código de golf, por lo que las respuestas se puntuarán en bytes, siendo menos bytes mejores.

Pruebas

Aquí hay una lista de los primeros 31 primos para n = 2 a n = 12 (1 es el único número primo 1)

n=2: [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
n=3: [3,4,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127]
n=4: [4,5,6,7,9,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113]
n=5: [5,6,7,8,9,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113]
n=6: [6,7,8,9,10,11,13,15,17,19,23,25,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107]
n=7: [7,8,9,10,11,12,13,15,17,19,23,25,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107]
n=8: [8,9,10,11,12,13,14,15,17,19,21,23,25,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89,97]
n=9: [9,10,11,12,13,14,15,16,17,19,21,23,25,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89,97]
n=10: [10,11,12,13,14,15,16,17,18,19,21,23,25,27,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89]
n=11: [11,12,13,14,15,16,17,18,19,20,21,23,25,27,29,31,35,37,41,43,47,49,53,59,61,67,71,73,79,83,89]
n=12: [12,13,14,15,16,17,18,19,20,21,22,23,25,27,29,31,33,35,37,41,43,47,49,53,55,59,61,67,71,73,77]

44
n=6, a=15Es el primer caso de prueba interesante.
Neil

66
Es el primer lugar donde se rompe el no patrón "a es n-prime si f n≤a <2n o (a≥2n y a es primo)".
Misha Lavrov

2
"Los números mayores que 2 son primos si no son divisibles por un primo más pequeño". - Esta definición permite que cualquier número sea primo. ¿Quizás quieras decir iff en lugar de if ?

55
@ThePirateBay No me refiero al sentido matemático preciso de la palabra if. Lo voy a dejar
Wheat Wizard

1
@JeppeStigNielsen No es muy difícil probar esto. Todos los números compuestos que son primos n deben tener solo factores primos menores que n. También sabemos que ningún subconjunto de sus factores puede tener un producto mayor que n porque nuestro número sería divisible por eso. Por lo tanto, cada n-primo es 2-primo o el producto de 2 números menores que n. Solo hay un número finito de pares de números menores que n, por lo tanto, solo hay un número finito de números primos n compuestos. Espero que eso tenga sentido, tuve que abreviar para incluirlo en un comentario.
Wheat Wizard

Respuestas:




4

Python 3 , 45 bytes

lambda i,k:(i>k)<all(k%r for r in range(i,k))

Pruébalo en línea!

Cómo funciona

Esto toma dos enteros como entrada, i y k . Primero verifica si k ≥ i . Luego genera el rango [i, k) y para cada número entero N en este rango, verifica si N es coprimo para k . Si se cumplen ambas condiciones, entonces k es un i -prime.


¿No puedes usar en &lugar de andy en >=ilugar de >i-1?
Wheat Wizard

@WheatWizard >=i todavía tiene 4 bytes (debido al espacio).
Neil

@Neil Si cambias a &no necesitas el espacio.
Wheat Wizard


4

R , 44 37 bytes

function(a,n)a==n|a>n&all(a%%n:(a-1))

Pruébalo en línea!

-7 bytes gracias a Giuseppe

Devuelve TRUEsi

  • aes igual noa==n| )
  • aes mayor que n y ( a>n&) para cada número k desde nhasta a-1, ano es divisible por k (all(a%%n:(a-1)) )

Devoluciones de lo FALSEcontrario


Bienvenido a PPCG! Gran primera respuesta!
FantaC

3

J, 30 bytes

>:*(-{1=[:+/0=[:|/~]+i.@[)^:>:

Pruébalo en línea!

Toma el valor inicial como el argumento correcto y el valor para verificar en el argumento izquierdo.

Me equivoqué originalmente y no tomé en cuenta los argumentos de la izquierda menos que el primo inicial. Estoy algo descontento con la duración de mi solución ahora.

Explicación

Deje que xsea ​​el argumento izquierdo (el valor a verificar) y ysea ​​el argumento correcto (el primo inicial).

>:*(-{1=[:+/0=[:|/~]+i.@[)^:>:
                          ^:>:  Execute left argument if x >= y
                     i.@[         Create range [0..x]
                   ]+             Add y to it (range now: [y..x+y])
                |/~               Form table of residues
            0=                    Equate each element to 0
          +/                      Sum columns
      1=                          Equate to 1
    -{                            Take the element at position x-y
>:*                             Multiply by result of x >= y

Notas

El elemento en la posición x-yes el resultado de la prueba de primalidad para x(ya que agregamos yal rango original).

Multiplicar por x >: ygarantiza que obtengamos un valor de falsey ( 0) por xmenos de y.


3

JavaScript (ES6), 33 32 30 bytes

Toma entrada en la sintaxis de curry (n)(a). Devuelve un booleano.

n=>p=(a,k=a)=>k%--a?p(a,k):a<n

Manifestación


3

Haskell , 30 bytes

2 bytes guardados gracias a la idea de H.PWiz que fue tomada de la respuesta de flawr

n!a=[1]==[1|0<-mod a<$>[n..a]]

Pruébalo en línea!

Ok, ya que ha pasado un tiempo, y la única respuesta de Haskell hasta ahora es de 45 btyes, decidí publicar mi propia respuesta.

Explicación

Esta función comprueba que el único número entre n y a que a es divisible es a sí mismo.

Ahora la definición solo menciona n -primes más pequeños que a , entonces, ¿por qué estamos verificando todos estos números adicionales? ¿No tendremos problemas cuando a es divisible por algún compuesto n mayor que n ?

No lo haremos porque si hay un compuesto n mayor que n , debe ser divisible por un n -prime más pequeño por definición. Por lo tanto, si divide a, también debe hacerlo el n -prime más pequeño.

Si a es menor que n [n..a] , []entonces no puede ser igual, lo que [1]hace que la verificación falle.





1

dc , 40 34 37 bytes

[0p3Q]sf?se[dler%0=f1+dle>u]sudle>u1p

Hubiera incluido un enlace TIO, pero TIO parece estar llevando una distribución defectuosa de dcver cómo funciona esto según lo previsto en mi sistema, pero elQ comando funciona erróneamente en TIO. En cambio, aquí hay un enlace a un bashcampo de pruebas con una versión que funciona correctamente de dc:

Demo It!


1

APL (Dyalog) , 24 bytes

{⍵∊o/⍨1=+/¨0=o|⍨⊂o←⍺↓⍳⍵}

Pruébalo en línea!

¿Cómo?

⍳⍵ - 1aa

o←⍺↓- naa , guardar eno

o|⍨⊂o - módulo de cada elemento en o con cada elemento eno

0= - verifica donde es igual 0 (se divide)

+/¨ - suma el número de divisiones

1= - si solo tenemos uno, entonces el número solo se divide por sí mismo

o/⍨ - entonces mantenemos estas ocurrencias

⍵∊- está aen esa matriz residual?



0

JavaScript ES5, 34 bytes

for(a=i=(p=prompt)();a%--i;);i<p()

0

Añadir ++ , 20 bytes

L,2Dx@rBcB%B]b*!!A>*

Pruébalo en línea!

L,   - Create a lambda function
     - Example arguments:  [5 9]
  2D - Copy below; STACK = [5 9 5]
  x  - Repeat;     STACK = [5 9 [9 9 9 9 9]]
  @  - Reverse;    STACK = [[9 9 9 9 9] 5 19] 
  r  - Range;      STACK = [[9 9 9 9 9] [5 6 7 8 9]]
  Bc - Zip;        STACK = [[9 5] [9 6] [9 7] [9 8] [9 9]]
  B% - Modulo;     STACK = [4 3 2 1]
  B] - Wrap;       STACK = [[4 3 2 1]]
  b* - Product;    STACK = [24]
  !! - Boolean;    STACK = [1]
  A  - Arguments;  STACK = [1 5 9]
  >  - Greater;    STACK = [1 1]
  *  - Product;    STACK = [1]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.