Ist es ein Semiprime?

26

Überraschenderweise glaube ich nicht, dass wir eine Frage haben, um festzustellen, ob eine Zahl semiprime ist .

Ein Semiprime ist eine natürliche Zahl, die aus zwei (nicht unbedingt unterschiedlichen) Primzahlen besteht.

Einfach genug, aber ein bemerkenswert wichtiges Konzept.

Bestimmen Sie bei einer positiven Ganzzahl, ob es sich um ein Semiprime handelt. Ihre Ausgabe kann in beliebiger Form erfolgen, sofern sie für alle wahrheitsgemäßen oder falschen Werte dieselbe Ausgabe liefert. Sie können auch davon ausgehen, dass Ihre Eingabe ausreichend klein ist, damit Leistung oder Überlauf kein Problem darstellen.

Testfälle:

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

Dies ist , daher gelten die Standardregeln!

Lord Farquaad
quelle
4
@WheatWizard Es gibt einen kleinen Unterschied, dass man nach 3 Primzahlen fragt (kein großer Unterschied für fast alle Sprachen) und es nur für unterschiedliche Primzahlen ist (für einige Sprachen ziemlich unterschiedlich). Ich kann es mit Ihnen im Chat besprechen, wenn Sie eine ausführlichere Diskussion fortsetzen möchten.
HyperNeutrino
2
@WheatWizard Sie sprechen einen guten Punkt an, aber in ähnlicher Weise haben wir bereits eine Reihe von Fragen, und obwohl die meisten von ihnen im Gegensatz zu Ihrer Aussage einen signifikanten Beitrag zu ihrer Fläche leisten, hat diese Frage einen ausreichenden Unterschied dass ich glaube, dass es eine separate frage / post rechtfertigt.
HyperNeutrino
2
@hyperneutrino Wenn man die Antworten auf beide Herausforderungen betrachtet, sieht es so aus, als ob der Unterschied eine einzelne Zahl im Quellcode ist, 2 vs 3. Ich würde das kaum einen großen Unterschied nennen.
Weizen-Zauberer
2
@ WheatWizard Es gibt auch "verschiedene" vs "nicht verschiedene" ...
HyperNeutrino
3
@ LordFarquaad Nur weil es ein Duplikat ist, heißt das nicht, dass es schlecht ist. In meinen Augen ist ein Duplikat eine gute Sache, es bedeutet, dass Sie eine Sache fragen, die die Community interessant genug findet, um bereits danach gefragt zu haben.
Weizen Zauberer

Antworten:

19

Brachylog , 2 Bytes

Grundsätzlich eine Portierung aus Fatalizes Antwort auf die Sphenic-Number-Challenge.

ḋĊ

Probieren Sie es online!

Wie?

ḋĊ - implicitly takes input
ḋ  - prime factorisation (with duplicates included)
 Ċ - is a couple
Jonathan Allan
quelle
1
Richtige Sprache für den Job in der Tat: P
HyperNeutrino
2
@Uriel Ċist eine integrierte Liste von zwei Variablen. Da es sich um eine deklarative Sprache handelt, ist die Ausgabe standardmäßig ein Test für die Zufriedenheit (z. B. würde sie allein true.für nicht negative ganze Zahlen ausgegeben ).
Jonathan Allan
Wie ist das 2 Bytes?
Harold
1
@harold Ich habe gerade aktualisiert, um "Bytes" im Header-Link zu Brachylogs Code-Seite zu machen. Ein Hex-Dump wäre c6 eb.
Jonathan Allan
16

Schale , 4 Bytes

Schau ma kein Unicode!

=2Lp

Probieren Sie es online!

Wie?

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

Mathematica, 16 Bytes

PrimeOmega@#==2&

PrimeOmega zählt die Anzahl der Primfaktoren und zählt die Multiplizität.

Genisis
quelle
1
Verdammt, da ist ein eingebautes?
JungHwan Min
1
@JungHwanMin Wenn es nur gabSemiprimeQ
Genisis
Nett. Ich wusste nicht überPrimeOmega
DavidC
7

Pyth , 4 Bytes

q2lP

Testsuite .


Wie?

q2lPQ     - Q is implicit input.

q2        - Is equal to 2?
    lPQ   - The length of the prime factors of the input.
Mr. Xcoder
quelle
Verdammt, kürzere Baujahre! :(
HyperNeutrino
7

Python 3 , 54 Bytes

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

Probieren Sie es online!

Die vorherige verson hatte einige Runden Probleme auf großen Würfel Zahlen ( 125, 343usw.)
Diese berechnet die Menge von Teilern (nicht nur Primzahlen), wenn es hat 1oder 2es zurückgibt True.
Die einzige Ausnahme ist, wenn eine Zahl mehr als zwei Primfaktoren, aber nur zwei Teiler enthält. In diesem Fall ist es ein perfekter Würfel einer Primzahl (seine Teiler sind die Kubikwurzel und die Kubikwurzel im Quadrat). x**3==nIn diesem Fall wird durch Hinzufügen von Eins zum Kubikwurzeleintrag die Summe auf 3 hochgezählt und das falsch-positive Ergebnis gestoppt. danke Jonathan Allan für das Schreiben mit dieser schönen Erklärung

Stange
quelle
Dieser Anspruch 8 ist
semiprime
n**(1/3)%1>0<sum...sollte arbeiten.
Dennis
1
@xnor hat es behoben.
Rod
Eine winzige Änderung vorgenommen (z. B. 6 Würfel hat viele weitere Teiler)
Jonathan Allan
6

Ruby , 56 48 Bytes

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

Probieren Sie es online!

Wie es funktioniert:

->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
}

Vielen Dank, Value Ink, für die Idee, mit der 8 Byte eingespart wurden.

GB
quelle
Warum nicht einfach cbei 0 beginnen und hochzählen, anstatt es zu einem Array zu machen, zu dem Sie alle Faktoren hinzufügen? Auf diese Weise kann die Notwendigkeit herausnehmen zu verwenden , sizeam Ende
Wert Ink
Sie haben recht, weil ich die Faktorisierungsfunktion für eine andere Herausforderung geschrieben und sie hier wieder verwendet habe.
GB
5

Mathematica, 31 29 Bytes

Tr[Last/@FactorInteger@#]==2&
JungHwan min
quelle
4

Neim , 4 Bytes

𝐏𝐥δ𝔼

Probieren Sie es online!

Okx
quelle
Können Sie erklären, wie das 4 Bytes sind? ... Ich bin total verwirrt.
Mr. Xcoder
Lol ich hatte gerade diese
HyperNeutrino
@ Mr.Xcoder Neim hat eine benutzerdefinierte Code-Seite
JungHwan Min
@ Mr.Xcoder die Neim Codepage verwenden, das ist 𝐏, 𝐥, δ, und 𝔼als Single-Byte.
HyperNeutrino
@HyperNeutrino Ich habe gerade die 2 ein wenig verschleiert, und jetzt ist dies die einzige Antwort ohne 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]

Probieren Sie es online!

-10 Bytes dank @JonathanAllan!

Credit for the Prime factorization algorithm goes to Dennis (in the initial version)

Mr. Xcoder
quelle
Did you use the code from Dennis' answer? If so, you should give credit.
totallyhuman
1
@totallyhuman Oh yeah, sorry. I used it in 2 different answers today and I gave him credit in one of them, but I have forgotten to do that here once more. Thanks for spotting that!
Mr. Xcoder
1
67 bytes
Jonathan Allan
@ JonathanAllan Wow, vielen Dank!
Mr. Xcoder
55 Bytes
Halvard Hummel
4

JavaScript (ES6), 47 bytes

Gibt einen Booleschen Wert zurück.

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

Demo

Arnauld
quelle
4

Mathematica 32 Bytes

Dank ngenesis für 1 Byte gespeichert

Tr@FactorInteger[#][[;;,2]]==2&
DavidC
quelle
1
Save one byte by using ;; instead of All.
ngenisis
3

Jelly, 5 bytes

ÆfL=2

Try it online!

Explanation

ÆfL=2  Main link
Æf     Prime factors
  L    Length
   =   Equals
    2  2
HyperNeutrino
quelle
3

05AB1E, 4 bytes

Òg2Q

Try it online!

How?

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

MATL, 5 bytes

Yfn2=

Try it online!

Explanation

  • Yf - Prime factors.

  • n - Length.

  • 2= - Is equal to 2?

Mr. Xcoder
quelle
3

Dyalog APL, 18 bytes

⎕CY'dfns'
2=≢3pco⎕

Try it online!

How?

⎕CY'dfns' - import pco

3pco⎕ - run pco on input with left argument 3 (prime factors)

2=≢ - length = 2?

Uriel
quelle
3

Gaia, 4 bytes

ḍl2=

4 bytes seems to be a common length, I wonder why... :P

Try it online!

Explanation

ḍ     Prime factors
 l    Length
  2=  Equals 2?
Business Cat
quelle
4 Bytes scheint eine gemeinsame Länge zu sein, ich frage mich, warum ... - Wahrscheinlich, weil alle Antworten Primfaktoren sind, Länge gleich 2 ist?
Mr. Xcoder
@ MrXcoder Ja, genau
Business Cat
4 davon sind meine BTW> _>
Mr. Xcoder
4 ist auch die erste Halbzeit. Gespenstisch!
Neil
3

Python mit SymPy 1.1.1 ,  57  44 bytes

-13 Bytes dank Alephalpha (benutze 1.1.1's primeomega)

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

Probieren Sie es online!

Jonathan Allan
quelle
lambda n:primeomega(n)==2
Alephalpha
Ah, das erinnert mich an ein Upgrade von 1.0, danke!
Jonathan Allan
2

Ruby, 35+8 = 43 bytes

Uses the -rprime flag to unlock the prime_division function.

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

Try it online!

Value Ink
quelle
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 thanks to @Nevay.

Try it here.

Kevin Cruijssen
quelle
1
Sie können die else-Anweisung (die sein könnte else++r;) entfernen , um 8 Bytes zu sparen 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));}

Mit angewandter Formatierung:

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));
}

Und als Testprogramm:

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 ();
        }
    }
}

Welches hat die Ausgabe:

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
quelle
1

Netzhaut , 45 Bytes

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

Probieren Sie es online! Link enthält Testfälle. Erläuterung:

.+
$*

In Unary konvertieren.

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

Versuchen Sie, zwei Faktoren zu finden.

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

Stellen Sie sicher, dass beide Faktoren richtig sind.

;

Stellen Sie sicher, dass zwei Faktoren gefunden wurden.

Neil
quelle
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

fNimmt eine ganze Zahl ngrößer oder gleich, 1wird ein boolescher Wert zurückgegeben.

Probieren Sie es online!

Testfälle:

>>> 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
quelle
1

J , 6 Bytes

5 Bytes funktionieren einmalig:

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

Ich glaube, ich brauche sechs, wenn ich die Funktion definiere:

   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
Däne
quelle
1

Japt , 6 5 Bytes

k ʥ2

Testen Sie es online


Erläuterung

Macht so ziemlich das Gleiche wie die meisten anderen Antworten: kerhält die Reihe der Primfaktoren, Êerhält ihre Länge und ¥prüft auf Gleichheit mit 2.

Zottelig
quelle
÷k o)jfunktioniert auch, leider ist es gleich lang :-(
ETHproductions
0

Perl 6 , 43 Bytes

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

Probieren Sie es online!

fIst der kleinste Faktor größer als 1 des Eingabearguments $_oder ist er 1. Der Rückgabewert der Funktion ist wahr, wenn wahr ist (dh nicht ) UND das durch den Faktor geteilte Eingabeargument ist prim.Nil$_fNil

Wenn $_selbst eine Primzahl ist, dann fwird gleich sein $_, und $_ / fist 1, was nicht prim ist, so dass die Formel auch in diesem Fall funktioniert.

Sean
quelle