Eine Pillai-Primzahl ist eine Primzahl für die es ein positives so dass und.
Mit anderen Worten, eine ganze Zahl ist eine Pillai-Primzahl, wenn es eine Primzahl ist , wenn eine andere positive ganze Zahl so dass die Fakultät von plus durch teilbar ist und wenn nicht durch teilbar ist .
Entscheiden Sie bei einer positiven Ganzzahl als Eingabe, ob es sich um eine Pillai-Primzahl handelt. Die Sequenz der Pillai-Primzahlen ist OEIS A063980 .
Zum Beispiel ist eine Pillai-Primzahl, weil:
- Es ist eine Primzahl mit nur 2 Faktoren.
- und erfüllen die obigen Bedingungen: und teilt ; und teilen auch nicht.23 | ( 14 ! + 1 ) 14 22 23 | ( 18 ! + 1 ) 18 22
Testfälle
Wahrheit:
23 59 83 109 139 593
Falsch:
5 7 8 73 89 263 437
Für die wahrheitsgemäßen Fälle sind die jeweiligen m 's [(23, [14, 18]), (59, [15, 40, 43]), (83, [13, 36, 69]), (109, [86]), (139, [16]), (593, [274])]
.
Sie können entweder dem Standardformat für die Ausgabe von Entscheidungsproblemen folgen (dh Wahrheits- / Fehlerwerte) oder einen konsistenten Wert für Pillai-Primzahlen und einen ansonsten nicht konsistenten Wert oder umgekehrt haben .
Sie können in jeder Programmiersprache antreten und über jede Standardmethode Eingaben und Ausgaben vornehmen. Beachten Sie jedoch, dass diese Lücken standardmäßig verboten sind. Dies ist Codegolf , daher gewinnt die kürzeste Übermittlung (in Bytes) für jede Sprache .
quelle
[(23, 14), (23, 18), (59, 15), (59, 40), (59, 43), (83, 13), (83, 36), (83, 69), (109, 86), (139, 16), (593, 274)]
. Ich habe sie auch der Herausforderung hinzugefügt.Antworten:
Python 2 ,
115111110109 Bytes-6 Bytes dank Mr. Xcoder
Probieren Sie es online!
Die Funktionen bestehen aus zwei Teilen
~-n%x<1or~f(x)%n>0
, die überprüfen, ob die "Pillai-Bedingungen"n
nicht erfüllt sind, undn%x>0
für die Erstvalidierung.Danach
all
auf beiden Elemente angewandt wird, wird das erste Element enthaltenFalse
/0
wenn es ist eine gültige „Pillai - Nummer“ und die zweiten enthältTrue
/1
wenn einen
Primzahl ist.Diese werden an
cmp
das-1
in diesem Cenario zurückgegeben (ist eine gültige Pillai-Primzahl). Die anderen Kombinationen[[0, 0], [1, 0], [1, 1]]
geben0
oder zurück1
quelle
Jelly ,
118 BytesGibt für Pillai prime 0 zurück , andernfalls 1 .
Probieren Sie es online!
Wie es funktioniert
quelle
Pari / GP , 44 Bytes
Probieren Sie es online!
quelle
Brachylog , 19 Bytes
Probieren Sie es online!
Ziemlich einfache Übersetzung der Frage:
quelle
J ,
3026 Bytes-4 Bytes dank FrownyFrog
Probieren Sie es online!
Erläuterung:
quelle
1~:|
, um 2 Bytes zu sparen.(]|1+!@[)
ist nur(|1+!)~
~
und es macht Sinn mit Ihrem vorherigen Kommentar.Python 2 ,
65645352 BytesDie Ausgabe erfolgt über das Vorhandensein oder Fehlen eines Fehlers.
Probieren Sie es online!
quelle
Python 2 ,
109107 BytesProbieren Sie es online!
Erläuterung
Der
l
findet die Fakultät der übergebenen Zahl, so dass5
die Eingabe zurückkehrt120
.Bei der
all(p%i for i in range(2,p-1))
Überprüfung, ob eine Zahl eine Primzahl ist, ignorieren wir 0 und 1, da unsere anderen Bedingungen diese bereits ausschließen.Schließlich verwenden wir
any(~-p%m>-~l(m)%p==0for m in range(2,p))
, um alle potenziellen m zu durchlaufen, um zu sehen, ob irgendwelche unsere Bedürfnisse befriedigen.~-p
bedeutetp+1
. Dann prüfen wir, ob es größer ist als-~l(m)%p
(was übersetzt wird(m!-1)%p
, und vergleichen es dann mit0
. Grundsätzlich~-p%m
muss es größer als 0 sein und-~l(m)%p
muss 0 sein.Quellen
Verbesserungen
quelle
Wie Sie wahrscheinlich im tio-Link sehen können, passieren nicht alle Fälle, das liegt daran, dass js keine großen Zahlen verarbeiten kann.
es gibt eine doppelte Prüfung
F%n>n-2&(F+1)%n<1
, um falsch positive zu verhindern (aber nicht umgekehrt bei Problemen mit großen Zahlen, wir brauchen wirklich(F+1)%n<1
kleinere Zahlen, die die Anzahl der Lösungsbytes auf 60 reduzierenJavaScript (Node.js) ,
9088867268 BytesProbieren Sie es online!
quelle
Brachylog , 13 Bytes
Probieren Sie es online!
Gelingt dies für Pillai-Primzahlen, wobei das kleinste m durch die Ausgabevariable bereitgestellt wird, und schlägt für alles andere fehl. Da ein großer Teil der Einsparungen von Bytes gegenüber der Sundar-Lösung darin besteht, dass wiederholt die Primfaktoren einiger ziemlich großer Zahlen berechnet werden, ist dies bei größeren Eingaben unglaublich langsam. (Ich werde diese Fälle wahrscheinlich auf meiner lokalen Brachylog-Installation ausführen, wenn mein Laptop nicht mit Batterie betrieben wird.)
quelle
[Perl], 45 Bytes
Das Zahlentheorie-Modul hat die Prädikate als eingebaute Funktionen (is_pillai gibt entweder 0 oder das kleinste m zurück, löst also auch A063828). Der zugrunde liegende C- und Perl-Code wird (natürlich) nicht verwendet. Der C-Code sieht folgendermaßen aus:
(Ersetzen Sie UV generisch durch uint64_t oder ähnliches, und HALF_WORD entscheidet, ob wir den Mulmod in einfache native Operationen optimieren können).
Der reine Perl-Code ähnelt:
quelle
C (gcc) , 64 Bytes
Probieren Sie es online!
quelle
Flüstert v2 , 230 Bytes
Probieren Sie es online!
Dies gibt eine leere Liste für Nicht-Pillai-Primzahlen und ansonsten eine nicht leere Liste zurück.
Wie es funktioniert
Whispers wurde für die Manipulation von reellen / komplexen Zahlen entwickelt, wobei ein wenig Array-Befehle hinzugefügt wurden, um eine gute Messung zu ermöglichen, daher die wiederholte Verwendung von
Each
die generierten Listen durchlaufen werden können.Hintergrundinformationen zu Whispers:
Whispers unterscheidet sich in seinem Ausführungspfad geringfügig von den meisten anderen Sprachen. Anstatt jede Zeile linear durchzuarbeiten und nur nach Bedingungen zu verzweigen, beginnt Whispers in der letzten Zeile der Datei mit
>
(die Regeln sind etwas komplizierter, aber das ist alles, was wir jetzt wissen müssen) und den Bedeutungen von Zahlen unterscheiden sich je nachdem, ob die Zeile mit>
oder beginnt>>
.Wenn die Zeile mit oder beginnt
>
, ist dies eine konstante Zeile. Sie gibt jedes Mal den gleichen Wert zurück. Hier stellen Zahlen ihre numerische Form dar, sodass die erste Zeile immer 1 zurückgibt> 1
> Input
zurückgibt.Wenn die Zeile
>>
jedoch mit beginnt , werden Zahlen als Verweise auf andere Zeilen behandelt, sozusagen als Funktionsaufrufe. In der Zeile>> 1…2
wird der…
Befehl beispielsweise nicht für die Ganzzahlen 1 und 2 ausgeführt , sondern für die von den Zeilen 1 und 2 zurückgegebenen Werte . In diesem Fall sind diese Werte die Ganzzahl 1 und die ganze Zahl, die wir als Eingabe übergeben haben.In diesem Beispiel betrachten wir die Eingabe von 23 . Beachten Sie, dass aufgrund der Vorverarbeitung von Whispers die zweite Zeile (
> Input
) in konvertiert wird> 23
.Unser erster Befehl ist in Zeile 3:
>> 1…2
.…
ist der dyadische Bereich, in diesem Fall von 1 bis 23 , was {1, 2, ... 22, 23} ergibt . Als nächstes fahren wir mit den Zeilen 9 bis 12 fort :Hier haben wir 4 aufeinanderfolgende
Each
Anweisungen, von denen jede über das vorherige Ergebnis iteriert und im Wesentlichen die 4 Befehle über das Array in Zeile 3 abbildet : den Bereich. Die ersten drei Anweisungen sind einfache Karten mit den Zeilen 4 , 5 und 6 :Diese drei Befehle, über eine ganze Zahl n , Ausbeuten (n! +1) |x , wo ! bezeichnet Fakultät , ∣ bezeichnet Teilbarkeit und x ist die Eingabe. Schließlich hat Linie 12 eine dyadische Kartenstruktur .
Eine dyadische Kartenstruktur besteht aus drei ganzen Zahlen: Das Ziel (links und rechts) verweist jeweils auf andere Zeilen. Hier zippen wir links und rechts, um eine Liste von Paaren zu erstellen, und reduzieren dann jedes Paar um den dyadischen Befehl (das Ziel). Wenn hier die Eingabe 23 ist , lauten die Listen {1, 2, ... 22, 23} und {0, 0, ... 1, 0}, und der Befehl lautet
Dies multipliziert das linke Argument mit dem rechten. Dies erzeugt ein Array von Ganzzahlen, wobei 0 bei den Indizes von Ganzzahlen, deren Fakultäten inkrementiert sind, nicht durch die Eingaben teilbar sind, und den ursprünglichen Index, in dem sie sich befinden. Wir werden dieses Array nennen A . Als nächst wir die entfernen 0 s von A , indem die Mengendifferenz zwischen {0} und A :
In unserem Beispiel ergibt dies die Menge {14, 18, 22} . Als nächstes nehmen wir den Rest der Eingabe, der durch jeden Wert in der Menge geteilt wird, und prüfen, ob dieser Rest ungleich 1 ist :
Wieder haben wir eine Liste von entweder 0 oder 1 s und müssen die 0 s entfernen und die 1 s durch die ursprünglichen Werte ersetzen . Hier wiederholen wir den Code, den wir oben gesehen haben, aber mit
>> 18∖13
anstatt12
. Schließlich setzen wir diesen resultierenden Satz für eine abschließende Prüfung in eine Liste um. Leider muss unser Code auch zusammengesetzte Zahlen ablehnen, die alle diese Kriterien erfüllen, z. B. 437 . Also addieren wir unsere letzte Prüfung und multiplizieren unsere letzte Liste mit der Primalität der Eingabe. Aufgrund der Funktionsweise der Python-Multiplikation für Listen ersetzt 0 diese durch eine leere Liste und 1 hat keine Auswirkung. Wir berechnen also die Primalität der Eingabe und multiplizieren diese mit der Liste von ms für die Eingabe und Ausgabe des Endergebnisses:quelle
APL (NARS), 65 Zeichen, 130 Byte
Hier 23x würde es bedeuten, 23r1 und damit den Bruch 23/1, also alle anderen; Prüfung:
quelle
C # (Visual C # Interactive Compiler) , 138 + 22 = 160 Byte
TIO hat die System.Numerics-Bibliothek in seiner Version von Mono nicht implementiert, sodass Sie die Ergebnisse sehen können.
Probieren Sie es online aus!Hier stattdessen.Erläuterung:
quelle
CJam , 37 Bytes
Ausgänge ,
11
wenn der Eingang ein pillai Primzahl ist, sonst00
,01
oder10
Erläuterung:
Probieren Sie es online!
quelle