Eine Proth-Nummer , benannt nach François Proth, ist eine Zahl, die ausgedrückt werden kann als
N = k * 2^n + 1
Dabei k
ist eine ungerade positive ganze Zahl und n
ist eine positive ganze Zahl, so dass 2^n > k
. Lassen Sie uns ein konkreteres Beispiel verwenden. Nehmen Sie 3. 3 ist eine Proth-Nummer, weil es als geschrieben werden kann
(1 * 2^1) + 1
und 2^1 > 1
ist zufrieden. 5 Ist auch eine Proth-Nummer, weil sie geschrieben werden kann als
(1 * 2^2) + 1
und 2^2 > 1
ist zufrieden. 7 ist jedoch keine Proth-Nummer, da die einzige Möglichkeit ist, sie in das Formular N = k * 2^n + 1
einzutragen
(3 * 2^1) + 1
und 2^1 > 3
ist nicht zufrieden.
Ihre Herausforderung ist recht einfach: Sie müssen ein Programm oder eine Funktion schreiben, die anhand einer positiven Ganzzahl bestimmt, ob es sich um eine Proth-Zahl handelt oder nicht. Sie können Eingaben in jedem vernünftigen Format vornehmen und sollten einen Wahrheitswert ausgeben, wenn es sich um eine Proth-Zahl handelt, und einen falschen Wert, wenn dies nicht der Fall ist. Wenn Ihre Sprache hat, jede „Proth Zahl - Erfassungs“ -Funktionen Sie können sie verwenden.
Testen Sie IO
Hier sind die ersten 46 Proth-Nummern bis 1000. ( A080075 )
3, 5, 9, 13, 17, 25, 33, 41, 49, 57, 65, 81, 97, 113, 129, 145, 161, 177, 193, 209, 225, 241, 257, 289, 321, 353, 385, 417, 449, 481, 513, 545, 577, 609, 641, 673, 705, 737, 769, 801, 833, 865, 897, 929, 961, 993
Jede andere gültige Eingabe sollte einen falschen Wert ergeben.
Wie üblich ist dies Codegolf, daher gelten Standardlücken, und die kürzeste Antwort in Bytes gewinnt!
Zahlentheorie Fun-Fact-Randnotiz:
Die größte bekannte Primzahl, die keine Mersenne-Primzahl ist 19249 * 2^13018586 + 1
, ist eine Proth-Zahl!
quelle
Python, 22 Bytes
Dies ist eine Portierung meiner Gelee-Antwort . Teste es auf Ideone .
Wie es funktioniert
Sei j eine streng positive ganze Zahl. j + 1 schaltet alle nachfolgenden gesetzten Bits von j und das benachbarte nicht gesetzte Bit um . Zum Beispiel 10011 2 + 1 = 10100 2 .
Da ~ j = - (j + 1) = -j - 1 , -j = ~ j + 1 ist , wendet -n das obige auf das bitweise NICHT von j an (wodurch alle Bits umgeschaltet werden ), wodurch alle Bits vor dem letzten umgeschaltet werden 1 .
Indem Sie j & -j - das bitweise UND von j und -j - nehmen, werden alle Bits vor und nach dem zuletzt gesetzten Bit auf Null gesetzt (da ungleich in j und -j ), wodurch sich die höchste Potenz von 2 ergibt , die j gleichmäßig teilt .
Für Eingabe N wollen wir das Obige auf N - 1 anwenden , um 2 n zu finden , die höchste Potenz von 2 , die N - 1 teilt . Wenn m = N - 1 , -m = - (N - 1) = 1 - N , so ergibt (N - 1) & (1 - N) 2 n .
Alles, was zu testen bleibt, ist, ob 2 n > k ist . Wenn k> 0 ist , ist dies genau dann wahr, wenn (2 n ) 2 > k2 n ist , was selbst genau dann gilt, wenn (2 n ) 2 ≥ k2 n + 1 = N ist .
Schließlich, wenn (2 N ) 2 = N = k2 n + 1 , 2 n muß ungerade sein ( 1 ) , so dass die Paritäten der beiden Seiten kann übereinstimmen, was impliziert , dass k = 0 und N = 1 . In diesem Fall (N - 1) & (1 - N) = 0 0 = 0 und ((N - 1) & (1 - N)) 2 = 0 <1 = N .
Daher ist ((N - 1) & (1 - N)) 2 > N genau dann wahr, wenn N eine Proth-Zahl ist.
Ohne Berücksichtigung von Gleitkommaungenauigkeiten entspricht dies dem Code
N-1&1-N>N**.5
in der Implementierung.quelle
Python 2, 23 Bytes
quelle
Mathematica,
5048454038353129 BytesMathematica ist im Allgemeinen schlecht, wenn es um Code-Golf geht, aber manchmal gibt es eine integrierte Funktion, mit der die Dinge wirklich gut aussehen.
Ein Test:
Bearbeiten: Eigentlich, wenn ich Dennis 'bitweise UND Idee stehle , kann ich es auf
232220 Bytes reduzieren.Mathematica,
232220 Bytes (danke A Simmons )quelle
g=
, eine reine Funktion ist in Ordnung!Select[Range@1000,f]
.05AB1E ,
1410 BytesDank Emigna für das Speichern von 4 Bytes!
Code:
Verwendet die CP-1252- Codierung. Probieren Sie es online! .
Erläuterung:
Für die Erklärung verwenden wir die Nummer 241 . Wir dekrementieren zuerst die Zahl um eins mit
<
. Das ergibt 240 . Nun berechnen wir die Primfaktoren (mit Duplikaten) mitÒ
. Die Hauptfaktoren sind:Wir haben sie in zwei Teile geteilt. Mit erhalten
2Q·0K
wir die Liste von zwei:Mit erhalten
®2K
wir die Liste der verbleibenden Nummern:Schließlich nehmen Sie das Produkt von beiden.
[2, 2, 2, 2]
ergibt 16 . Das Produkt der[3, 5]
Ergebnisse in 15 .Dieser Testfall ist seit 16 > 15 wahr .
quelle
<©Ó¬oD®s/›
oder<DÓ0èoDŠ/›
für 10.Brain-Flak ,
460350270266264188176 BytesProbieren Sie es online!
Erläuterung
Das Programm durchläuft Potenzen von zwei und vier, bis es eine Potenz von zwei größer als N-1 findet. Wenn es gefunden wird, überprüft es mit modulo die Teilbarkeit von N-1 durch die Zweierpotenz und gibt das Ergebnis aus
Dieses Programm ist nicht stapelrein. Wenn Sie weitere 4 Bytes hinzufügen, können Sie den Stapel bereinigen:
quelle
MATL , 9 Bytes
Wahrheitsausgabe ist
1
. Falsch ist0
oder leere Ausgabe. (Die einzigen Eingaben, die eine leere Ausgabe erzeugen, sind1
und2
; der Rest erzeugt entweder0
oder1
).Probieren Sie es online!
Erläuterung
Sei x die Eingabe. Sei y die größte Potenz von 2, die x −1 teilt , und z = ( x −1) / y . Beachten Sie, dass z automatisch ungerade ist. Dann ist x genau dann eine Proth-Zahl, wenn y > z ist , oder äquivalent, wenn y 2 > x −1 ist.
quelle
Brachylog , 28 Bytes
Probieren Sie es online!
Überprüfen Sie alle Testfälle auf einmal. (Leicht verändert.)
Erläuterung
Brachylog, ein Derivat von Prolog, ist sehr gut darin, Dinge zu beweisen.
Hier beweisen wir diese Dinge:
quelle
Haskell,
5546 BytesEdit: Dank nimi jetzt 46 Bytes
quelle
sum[1| ... ]
. Hier können wir noch weiter gehen und die Gleichheit Tests vor der Bewegung|
und überprüfen Sie mit ,or
wenn einer von ihnen ist wahr:f x=or[k*2^n+1==x|k<-...,n<-...,2^n>k]
.ECMAScript Regex,
484341 BytesDie regulären Ausdrücke von Neil und H.PWiz (beide auch ECMAScript) sind für sich genommen wunderschön. Es gibt einen anderen Weg , es zu tun, die von einem recht ordentlich Zufall war 1 Byte mehr als Neils, und jetzt mit H.PWiz vorgeschlagenen Golf (danke!), Ist 1 Byte
mehrweniger als H.PWiz ist.Warnung: Trotz der geringen Größe dieses Regex enthält er einen großen Spoiler . Ich empfehle dringend zu lernen, wie man unäre mathematische Probleme in ECMAScript Regex löst, indem man die anfänglichen mathematischen Einsichten unabhängig voneinander herausfindet. Es war eine faszinierende Reise für mich, und ich möchte sie keinem verderben, der sie möglicherweise selbst ausprobieren möchte, insbesondere nicht jenen, die sich für Zahlentheorie interessieren. In diesem früheren Beitrag finden Sie eine Liste der nacheinander mit Spoiler-Tags gekennzeichneten empfohlenen Probleme, die nacheinander gelöst werden müssen.
So lesen keine weiteren , wenn Sie nicht einige erweiterte einstellige regex Magie für Sie verwöhnen wollen . Wenn Sie versuchen möchten, diese Magie selbst herauszufinden, empfehle ich dringend, zunächst einige Probleme in ECMAScript regex zu lösen, wie in dem oben verlinkten Beitrag beschrieben.
Dieser reguläre Ausdruck funktioniert also ganz einfach: Er subtrahiert zunächst einen. Dann findet es den größten ungeraden Faktor, k . Dann dividieren wir durch k (unter Verwendung des Divisionsalgorithmus, der kurz in einem mit einem Spoiler-Tag versehenen Absatz meines Postings mit Regex-Fakultätszahlen erklärt wird ). Wir machen schleichend eine gleichzeitige Behauptung, dass der resultierende Quotient größer als k ist . Wenn die Division übereinstimmt, haben wir eine Proth-Nummer. wenn nicht, machen wir nicht.
Ich konnte 2 Bytes aus dieser Regex (43 → 41) mit einem von Grimy gefundenen Trick löschen , der die Division weiter verkürzen kann, falls der Quotient garantiert größer oder gleich dem Divisor ist.
Probieren Sie es online!
quelle
Julia, 16 Bytes
Dank an @Dennis für die Antwort und einige Golftipps!
quelle
&
den gleichen Vorrang wie*
.-~-x
anstelle von verwenden(1-x)
. Es gibt auch√x
stattdessenx^.5
, aber es werden keine Bytes gespeichert.R
5250 BytesDas Programm beginnt , indem man
N-1
(hier genanntP
undx
) durch2
so lange wie möglich, um das zu finden , einen2^n
Teil der Gleichung, so dassk=(N-1)/2^n
, und berechnet dann , ob oder nichtk
schlechter ist als2^n
, mit der Tatsache , dass2^n>x/2^n <=> (2^n)²>x <=> 2^2n>x
quelle
P=
am Anfang ziehen und das Ende ändern2^n>x
und wie 5 oder 6 BytesRegex (ECMAScript),
4038 Bytes-2 Bytes dank Deadcode
Probieren Sie es online!
Kommentierte Version:
quelle
^x(?=((xx)+?)(\1\1)*$)(?!(\1x\2*)\4*$)
( OnlineJ, 10 Bytes
Basierend auf der bitweisen Lösung von @Dennis .
Übernimmt eine Eingabe
n
und gibt 1 zurück, wenn es sich um die Proth-Nummer handelt, ansonsten 0.Verwendung
Erläuterung
quelle
AND
. cool!Retina 0.8.2 , 47 Bytes
In Unary konvertieren.
In Binärdatei konvertieren.
Führen Sie die Proth-Generierungsformel wiederholt in umgekehrter Reihenfolge aus.
Passen Sie den Basisfall der Proth-Generierungsformel an.
Bearbeiten: Ich denke, es ist tatsächlich möglich, eine Proth-Nummer direkt mit einer unären Nummer mit einem einzelnen Regex abzugleichen. Ich benötige derzeit 47 Bytes, 7 Bytes mehr als mein aktueller Retina-Code, um zu überprüfen, ob eine unäre Nummer eine Proth-Nummer ist:
quelle
ECMAScript Regex, 42 Bytes
Probieren Sie es online! (Mit Retina)
Ich subtrahiere im Wesentlichen 1, dividiere durch die größtmögliche ungerade Zahl
k
und überprüfe dann, ob mindestensk+1
noch etwas übrig ist.Es stellt sich heraus, dass mein regulärer Ausdruck dem von Neil am Ende seiner Antwort sehr ähnlich ist . Ich benutze
x(xx)*
statt(x*)\2x
. Und ich benutze eine kürzere Methode, um zu überprüfenk < 2^n
quelle
(\3\3)*)$
auf(\3\3)*$)
$=
und$.=
. Es kann noch besser verbessert werden .Brain-Flak , 128 Bytes
Probieren Sie es online!
Ich habe einen ganz anderen Algorithmus verwendet als die ältere Brain-Flak-Lösung .
Grundsätzlich dividiere ich durch 2 (aufrunden), bis ich eine gerade Zahl treffe. Dann vergleiche ich einfach das Ergebnis der letzten Division mit den beiden mit der Häufigkeit, mit der ich geteilt habe.
Erläuterung:
quelle
Ahorn, 100 Bytes (einschließlich Leerzeichen)
Gut verteilt für Lesbarkeit:
Gleiche Idee wie mehrere andere; Teilen Sie X durch 2, bis X nicht mehr gleichmäßig durch 2 teilbar ist, und überprüfen Sie dann die Kriterien 2 ^ n> x.
quelle
Java 1.7,
4943 BytesWeitere 6 Bytes Staub dank @charlie.
Versuch es! (ideone)
Zwei Wege, gleich lang. Wie bei den meisten Antworten hier gehen die Credits für den Ausdruck natürlich an @Dennis.Die Wurzel der rechten Seite des Ausdrucks ziehen:
Anwenden der Zweierpotenz auf die linke Seite des Ausdrucks:
Kann ein einzelnes Byte ausschalten, wenn ein positiver numerischer Wert für 'truthy' und ein negativer Wert für 'falsy' steht:
Leider kann man dies wegen 'Narrowing Primitive Conversion' nicht einfach in Java schreiben und korrekte Ergebnisse erhalten:
Und jeder Versuch, 'p' zu verbreitern, führt zu einem Kompilierungsfehler, da bitweise Operatoren nicht unterstützt werden, z. B. für Floats oder Doubles :(quelle
boolean f(int p){return Math.sqrt(p--)<(p&-p);}
boolean g(int p){return p--<(p&-p)*(p&-p);}
Math.*
Anrufe loszuwerden . konnte nur nicht herausfinden, wie! Vielen Dank!Hy , 37 Bytes
Probieren Sie es online!
Port of @Dennis 'Antwort.
quelle
C (GCC) , 29
30BytesProbieren Sie es online!
quelle
Japt ,
12109 BytesProbieren Sie es online!
Port of Dennis 'Jelly antworte nochmal. - 1 Danke an @Shaggy.
quelle
-1
kann seinÉ
.Cjam, 11 Bytes
Wie viele von uns ist Dennis 'exzellente Lösung ein Huckepack:
Probieren Sie es online aus
quelle
C (137 Bytes)
Kam erst, um die Antworten zu lesen, nachdem ich es versucht hatte.
Unter Berücksichtigung
N=k*2^n+1
der bedingten vonk<2^n
(k=1,3,5..
undn=1,2,3..
Mit haben
n=1
wir einenk
zum Testen zur Verfügung. Wenn wir uns steigernn
, bekommen wir ein paar mehrk's
zum Testen:n = 1; k = 1
n = 2; k = 1 k = 3
n = 3; k = 1 k = 3 k = 5 k = 7
...
Diese Möglichkeiten Durchlaufen können wir sicher sein , N keine Prouth Zahl ist , wenn für eine gegebene
n
diek=1
Zahl erhalten wird , größer als N und keine andere Iteration ein Spiel war.Also mein Code "brute-forces" seinen Weg in die Suche nach N.
Nach dem Lesen der anderen Antworten und dem Erkennen, dass Sie N-1 mit 2 faktorisieren können,
n
um die Bedingung zu finden und sie dann zu erfüllenk<2^n
, denke ich, dass mein Code mit dieser Methode kleiner und effizienter sein könnte.Es war einen Versuch wert!
Getestet alle angegebenen Nummern und ein paar "non-Prouth" -Nummern. Die Funktion gibt 1 zurück, wenn die Zahl eine Prouth-Zahl ist, und 0, wenn dies nicht der Fall ist.
quelle
Javascript ES7, 16 Bytes
Port meiner Julia-Antwort, die ein Port von @ Dennis's Jelly-Antwort ist.
Danke @Charlie für 2 Bytes gespeichert!
quelle
n=x=>x-1&1-x>x**.5; n(3)
gibt mir0
(eigentlich gibt es mir 0 unabhängig von der Eingabe)n=x=>x-1&1-x>Math.pow(x,0.5); n(3)
(x-1&1-x)
wie ohne es der Operator-Vorrang tatsächlich ist:(x-1)&((1-x)>x**.5)
x=>x--**.5<(x&-x)
oderx=>x**.5<(--x&-x)
C # (.NET Core) , 17 Byte
Probieren Sie es online!
Port von MegaToms C-Antwort .
Ich habe versucht, eine LINQ-basierte Lösung zu finden, aber das war zu gut.
quelle
Tinte , 60 Bytes
Probieren Sie es online!
Basierend auf der Maple-Antwort von @ DSkoog - es war nicht das erste seiner Art, das veröffentlicht wurde, aber es war das erste seiner Art, das ich gesehen habe.
Ungolfed
quelle
x86-Maschinencode, 15 Byte
Diese Bytes definieren eine Funktion, die das Eingabeargument (eine vorzeichenlose Ganzzahl) im
EDI
Register gemäß der Standardaufrufkonvention von System V für x86-Systeme verwendet undEAX
wie alle x86-Aufrufkonventionen das Ergebnis im Register zurückgibt .In Assembler Mnemonics:
Probieren Sie es online!
Es ist eine ziemlich unkomplizierte Lösung - und konzeptionell der C-Version von MegaTom ähnlich . Tatsächlich könnten Sie dies in C so etwas wie das Folgende schreiben:
Aber der obige Maschinencode ist besser als das, was Sie von einem C-Compiler erwarten, selbst wenn er so eingestellt ist, dass er die Größe optimiert.
Der einzige "Cheat" ist, -1 als "Wahrheitswert" und 0 als "Falschwert" zurückzugeben. Dieser Trick ermöglicht die Verwendung des 2-Byte-
SBB
Befehls im Gegensatz zum 3-Byte-SETB
Befehl.quelle