¿Es un semiprime?

26

Sorprendentemente, no creo que tengamos una pregunta de para determinar si un número es semiprime .

Un semiprime es un número natural que es el producto de dos números primos (no necesariamente distintos).

Bastante simple, pero un concepto notablemente importante.

Dado un número entero positivo, determine si es un semiprime. Su salida puede ser de cualquier forma siempre que proporcione la misma salida para cualquier valor verdadero o falso. También puede suponer que su entrada es razonablemente pequeña como para que el rendimiento o el desbordamiento no sean un problema.

Casos de prueba:

input -> output
1     -> false
2     -> false
3     -> false
4     -> true
6     -> true
8     -> false
30    -> false   (5 * 3 * 2), note it must be EXACTLY 2 (non-distinct) primes
49    -> true    (7 * 7)      still technically 2 primes
95    -> true
25195908475657893494027183240048398571429282126204032027777137836043662020707595556264018525880784406918290641249515082189298559149176184502808489120072844992687392807287776735971418347270261896375014971824691165077613379859095700097330459748808428401797429100642458691817195118746121515172654632282216869987549182422433637259085141865462043576798423387184774447920739934236584823824281198163815010674810451660377306056201619676256133844143603833904414952634432190114657544454178424020924616515723350778707749817125772467962926386356373289912154831438167899885040445364023527381951378636564391212010397122822120720357
      -> true, and go call someone, you just cracked RSA-2048

Este es el , por lo que se aplican reglas estándar.

Lord Farquaad
fuente
44
@WheatWizard Hay una ligera diferencia en que uno pide 3 primos (no es una gran diferencia para casi todos los idiomas) y es solo para primos distintos (bastante diferente para algunos idiomas). Puedo discutirlo con usted en el chat si desea continuar una discusión más detallada.
HyperNeutrino
2
@WheatWizard Usted plantea un buen punto, pero de manera similar, ya tenemos muchos tipos de preguntas, y aunque, en contraste con lo que expresa, la mayoría de ellas agrega una contribución significativa a su área, esta pregunta tiene suficiente diferencia que creo que justifica una pregunta / publicación por separado.
HyperNeutrino
2
@hyperneutrino mirando las respuestas en ambos desafíos, parece que la diferencia es un solo número en el código fuente, 2 contra 3. Difícilmente llamaría a eso una gran diferencia.
Wheat Wizard
2
@WheatWizard También hay "distinto" vs "no distinto" ...
HyperNeutrino
3
@ LordFarquaad El hecho de que sea un duplicado no significa que sea malo. En mi opinión, ser un duplicado es algo bueno, significa que estás preguntando algo que la comunidad encuentra lo suficientemente interesante como para haberlo preguntado.
Wheat Wizard

Respuestas:

19

Brachylog , 2 bytes

Básicamente un puerto de la respuesta de Fatalize al desafío del número esférico.

ḋĊ

Pruébalo en línea!

¿Cómo?

ḋĊ - implicitly takes input
ḋ  - prime factorisation (with duplicates included)
 Ċ - is a couple
Jonathan Allan
fuente
1
Lenguaje adecuado para el trabajo: P
HyperNeutrino
2
@Uriel Ċes en realidad una lista integrada de dos variables; Al ser un lenguaje declarativo, la salida es, por defecto, una prueba de satisfacción (por ejemplo, por sí sola daría salida true.para enteros no negativos).
Jonathan Allan
¿Cómo son estos 2 bytes?
Harold
1
@harold Acabo de actualizar para hacer "bytes" en el enlace del encabezado a la página de códigos de Brachylog. Sería un basurero hexadecimal c6 eb.
Jonathan Allan
16

Casco , 4 bytes

Mira ma no Unicode!

=2Lp

Pruébalo en línea!

¿Cómo?

=2Lp - a one input function
   p - prime factorisation (with duplicates included)
  L  - length
=2   - equals 2?
Jonathan Allan
fuente
8

Mathematica, 16 bytes

PrimeOmega@#==2&

PrimeOmega cuenta el número de factores primos, contando la multiplicidad.

ngenisis
fuente
1
Dang, hay un incorporado?
JungHwan Min
1
@JungHwanMin Si solo hubieraSemiprimeQ
ngenisis
Agradable. No sabía sobrePrimeOmega
DavidC
7

Pyth , 4 bytes

q2lP

Banco de pruebas .


¿Cómo?

q2lPQ     - Q is implicit input.

q2        - Is equal to 2?
    lPQ   - The length of the prime factors of the input.
Sr. Xcoder
fuente
¡Maldita sea, builtins más cortos! :(
HyperNeutrino
7

Python 3 , 54 bytes

lambda n:0<sum((n%x<1)+(x**3==n)for x in range(2,n))<3

Pruébalo en línea!

El Verson anterior tenía algunos problemas de redondeo de números de cubo grande ( 125, 343, etc.)
Esto calcula la cantidad de divisores (no sólo los números primos), si tiene 1o 2se devuelve True.
La única excepción es cuando un número tiene más de dos factores primos pero solo dos divisores. En este caso, es un cubo perfecto de un primo (sus divisores son su raíz cúbica y su raíz cúbica al cuadrado). x**3==ncubrirá este caso, agregar uno a la entrada raíz del cubo empuja la suma hasta un recuento de 3 y detiene el falso positivo. gracias Jonathan Allan por escribir con esta hermosa explicación

Barra
fuente
Este reclamo 8 es semiprime
xnor
n**(1/3)%1>0<sum...Deberia trabajar.
Dennis
1
@xnor lo arregló.
Rod
Hizo una pequeña edición (por ejemplo, 6 cubos tiene muchos más divisores)
Jonathan Allan
6

Ruby , 56 48 bytes

->x{r=c=2;0while x%r<1?(x/=r;c-=1):x>=r+=1;c==0}

Pruébalo en línea!

Cómo funciona:

->x{                    # Lambda function
    r=c=2;              # Starting from r=2, c=2
    0 while             # Repeat (0 counts as a nop)
        x%r<1? (        # If x mod r == 0
            x/=r:       # Divide x by r
            c-=1        # decrease c
        ):              # else
            x>=r+=1     # increase r, terminate if r>x 
    );
    c==0                # True if we found 2 factors
}

Gracias Value Ink por la idea que ahorró 8 bytes.

GB
fuente
¿Por qué no simplemente ccomenzar en 0 y contar hacia arriba, en lugar de convertirlo en una matriz a la que agrega todos los factores? De esa manera, elimina la necesidad de usar sizeal final
Value Ink el
Tienes razón, es porque escribí la función de factorización para otro desafío y la reutilicé aquí.
GB
5

Mathematica, 31 29 bytes

Tr[Last/@FactorInteger@#]==2&
JungHwan Min
fuente
4

Neim , 4 bytes

𝐏𝐥δ𝔼

Pruébalo en línea!

Okx
fuente
¿Puedes explicar cómo son 4 bytes? ... Estoy totalmente confundido.
Sr. Xcoder
Lol Acabo de tener esto
HyperNeutrino
@ Mr.Xcoder Neim tiene una página de códigos personalizada
JungHwan Min
@ Mr.Xcoder Uso de la página de códigos Neim, esto es 𝐏, 𝐥, δ, y 𝔼como solo-bytes.
HyperNeutrino
@HyperNeutrino Acabo de ofuscar el 2 un poco, y ahora esta es la única respuesta sin 2 :)
Okx
4

Python 2 , 67 bytes

lambda k:f(k)==2
f=lambda n,k=2:n/k and(f(n,k+1),1+f(n/k,k))[n%k<1]

Pruébalo en línea!

-10 bytes gracias a @JonathanAllan!

El crédito para el algoritmo de factorización Prime corresponde a Dennis (en la versión inicial)

Sr. Xcoder
fuente
¿Usaste el código de la respuesta de Dennis ? Si es así, debe dar crédito.
Totalmente humano el
1
@totallyhuman Oh sí, lo siento. Lo usé en 2 respuestas diferentes hoy y le di crédito en una de ellas, pero me he olvidado de hacer eso aquí una vez más. ¡Gracias por ver eso!
Sr. Xcoder
1
67 bytes
Jonathan Allan
@JonathanAllan Wow, muchas gracias!
Sr. Xcoder
55 bytes
Halvard Hummel
4

JavaScript (ES6), 47 bytes

Devuelve un booleano.

n=>(k=1)==(d=n=>++k<n?n%k?d(n):d(n/k--)+1:0)(n)

Manifestación

Arnauld
fuente
4

Mathematica 32 bytes

Gracias a ngenesis por 1 byte guardado

Tr@FactorInteger[#][[;;,2]]==2&
DavidC
fuente
1
Ahorre un byte usando en ;;lugar de All.
ngenisis
3

05AB1E, 4 bytes

Òg2Q

Pruébalo en línea!

¿Cómo?

Ò       prime factors list (with duplicates)
 g      length
   Q    equal to
  2     2
Uriel
fuente
3

MATL, 5 bytes

Yfn2=

Pruébalo en línea!

Explicación

  • Yf - Factores primos.

  • n - Longitud.

  • 2= - ¿Es igual a 2?

Sr. Xcoder
fuente
3

Dyalog APL, 18 bytes

⎕CY'dfns'
2=≢3pco⎕

Pruébalo en línea!

¿Cómo?

⎕CY'dfns' - importación pco

3pco⎕- ejecutar pcoen entrada con argumento izquierdo 3 (factores primos)

2=≢ - longitud = 2?

Uriel
fuente
3

Gaia , 4 bytes

ḍl2=

4 bytes parece ser una longitud común, me pregunto por qué ...: P

Pruébalo en línea!

Explicación

ḍ     Prime factors
 l    Length
  2=  Equals 2?
Gato de negocios
fuente
4 bytes parece ser una longitud común, me pregunto por qué ... - Probablemente porque todas las respuestas son factores primos, la longitud es igual a 2.
Sr. Xcoder
@MrXcoder Sí, exactamente
Business Cat
4 de los cuales son míos BTW> _>
Sr. Xcoder
4 es también el primer semiprime. ¡Escalofriante!
Neil
3

Python con SymPy 1.1.1 ,  57  44 bytes

-13 bytes gracias a alephalpha (use 1.1.1's primeomega)

from sympy import*
lambda n:primeomega(n)==2

Pruébalo en línea!

Jonathan Allan
fuente
lambda n:primeomega(n)==2
alephalpha
Ah, eso me recuerda actualizar desde 1.0, ¡gracias!
Jonathan Allan
2

Ruby , 35 + 8 = 43 bytes

Utiliza la -rprimebandera para desbloquear la prime_divisionfunción.

->n{n.prime_division.sum(&:pop)==2}

Pruébalo en línea!

Tinta de valor
fuente
2

Java 8, 69 61 bytes

n->{int r=1,c=2;for(;r++<n;)for(;n%r<1;n/=r)c--;return c==0;}

-8 bytes gracias a @Nevay .

Pruébalo aquí

Kevin Cruijssen
fuente
1
Puede eliminar la instrucción else (que podría ser else++r;) para guardar 8 bytes n->{int r=1,c=2;for(;r++<n;)for(;n%r<1;n/=r)c--;return c==0;}.
Nevay
1

C #, 112 bytes

n=>{var r=Enumerable.Range(2,n);var l=r.Where(i=>r.All(x=>r.All(y=>y*x!=i)));return l.Any(x=>l.Any(y=>y*x==n));}

Con el formato aplicado:

n =>
{
    var r = Enumerable.Range (2, n);
    var l = r.Where (i => r.All (x => r.All (y => y * x != i)));
    return l.Any (x => l.Any (y => y * x == n));
}

Y como programa de prueba:

using System;
using System.Linq;


namespace S
{
    class P
    {
        static void Main ()
        {
            var f = new Func<int, bool> (
                n =>
                {
                    var r = Enumerable.Range (2, n);
                    var l = r.Where (i => r.All (x => r.All (y => y * x != i)));
                    return l.Any (x => l.Any (y => y * x == n));
                }
            );

            for (var i = 0; i < 100; i++)
                Console.WriteLine ($"{i} -> {f (i)}");
            Console.ReadLine ();
        }
    }
}

Cuál tiene la salida:

0 -> False
1 -> False
2 -> False
3 -> False
4 -> True
5 -> False
6 -> True
7 -> False
8 -> False
9 -> True
10 -> True
11 -> False
12 -> False
13 -> False
14 -> True
15 -> True
16 -> False
17 -> False
18 -> False
19 -> False
20 -> False
21 -> True
22 -> True
23 -> False
24 -> False
25 -> True
26 -> True
27 -> False
28 -> False
29 -> False
30 -> False
31 -> False
32 -> False
33 -> True
34 -> True
35 -> True
36 -> False
37 -> False
38 -> True
39 -> True
40 -> False
41 -> False
42 -> False
43 -> False
44 -> False
45 -> False
46 -> True
47 -> False
48 -> False
49 -> True
50 -> False
51 -> True
52 -> False
53 -> False
54 -> False
55 -> True
56 -> False
57 -> True
58 -> True
59 -> False
60 -> False
61 -> False
62 -> True
63 -> False
64 -> False
65 -> True
66 -> False
67 -> False
68 -> False
69 -> True
70 -> False
71 -> False
72 -> False
73 -> False
74 -> True
75 -> False
76 -> False
77 -> True
78 -> False
79 -> False
80 -> False
81 -> False
82 -> True
83 -> False
84 -> False
85 -> True
86 -> True
87 -> True
88 -> False
89 -> False
90 -> False
91 -> True
92 -> False
93 -> True
94 -> True
95 -> True
96 -> False
97 -> False
98 -> False
99 -> False
MetaColon
fuente
1

Retina , 45 bytes

.+
$*
^(11+)(\1)+$
$1;1$#2$*
A`\b(11+)\1+\b
;

Pruébalo en línea! El enlace incluye casos de prueba. Explicación:

.+
$*

Convierte a unario.

^(11+)(\1)+$
$1;1$#2$*

Intenta encontrar dos factores.

A`\b(11+)\1+\b

Asegúrese de que ambos factores sean primos.

;

Asegúrese de que se encontraron dos factores.

Neil
fuente
1

Python 2, 90 bytes

def g(x,i=2):
 while x%i:i+=1
 return i
def f(n,l=0):
 while 1%n:l+=1;n/=g(n)
 return l==2

ftoma un número entero nmayor o igual que 1, devuelve boolean.

Pruébalo en línea!

Casos de prueba:

>>> f(1)
False
>>> f(2)
False
>>> f(3)
False
>>> f(4)
True
>>> f(6)
True
>>> f(8)
False
>>> f(30)
False
>>> f(49)
True
>>> f(95)
True
nog642
fuente
1

J , 6 bytes

5 bytes funcionarán de forma única:

   2=#q: 8
0
   2=#q: 9
1

Creo que necesito seis cuando defino la función:

   semiprime =. 2=#@q:
   (,. semiprime) 1 + i. 20
 1 0
 2 0
 3 0
 4 1
 5 0
 6 1
 7 0
 8 0
 9 1
10 1
11 0
12 0
13 0
14 1
15 1
16 0
17 0
18 0
19 0
20 0
danés
fuente
1

Japt , 6 5 bytes

k ʥ2

Pruébelo en línea


Explicación

Hace casi lo mismo que la mayoría de las otras respuestas: kobtiene la matriz de factores primos, Êobtiene su longitud y ¥verifica la igualdad con 2.

Lanudo
fuente
÷k o)jtambién funciona, desafortunadamente tiene la misma duración :-(
ETHproductions
0

Perl 6 , 43 bytes

{my \f=first $_%%*,2..$_;?f&&is-prime $_/f}

Pruébalo en línea!

fes el factor más pequeño mayor que 1 del argumento de entrada $_, o Nilsi $_es 1. El valor de retorno de la función es verdadero sif es verdadero (es decir, noNil ) Y el argumento de entrada dividido por el factor es primo.

Si $_es primo, entonces fserá igual a $_, y $_ / fes 1, que no es primo, por lo que la fórmula también funciona en ese caso.

Sean
fuente