Manchmal müssen Sie beim Schreiben eines Programms aus irgendeinem Grund eine Primzahl verwenden (z. B. Kryptografie). Ich gehe davon aus, dass Sie manchmal auch eine zusammengesetzte Nummer verwenden müssen. Manchmal muss Ihr Programm, zumindest hier bei PPCG, in der Lage sein, mit willkürlichen Änderungen umzugehen. Und unter Umständen, die für eine interessante PPCG-Frage geeignet sind, müssen möglicherweise sogar die von Ihnen verwendeten Zahlen beständig gegen Korruption sein ...
Definitionen
Eine zusammengesetzte Zahl ist eine Ganzzahl ≥ 4, die keine Primzahl ist, dh sie ist das Produkt von zwei kleineren Ganzzahlen größer als 1. Eine bitflipresistente zusammengesetzte Zahl ist wie folgt definiert: Es ist eine zusammengesetzte positive Ganzzahl, für die Sie sie schreiben in binär in der minimal möglichen Anzahl von Bits können Sie ein oder zwei beliebige Bits von der Zahl ändern, und die Zahl ist immer noch zusammengesetzt.
Beispiel
Betrachten Sie zum Beispiel die Zahl 84. In der Binärdatei ist das 1010100
. Hier sind alle Zahlen, die sich nicht mehr als 2 Bit davon unterscheiden:
0000100 4 2 × 2 0010000 16 4 × 4 0010100 20 4 × 5 0010101 21 3 × 7 0010110 22 2 × 11 0011100 28 4 × 7 0110100 52 4 × 13 1000000 64 8 × 8 1000100 68 4 × 17 1000101 69 3 × 23 1000110 70 7 × 10 1001100 76 4 × 19 1010000 80 8 × 10 1010001 81 9 × 9 1010010 82 2 × 41 1010100 84 7 × 12 1010101 85 5 × 17 1010110 86 2 × 43 1010111 87 3 × 29 1011000 88 8 × 11 1011100 92 4 × 23 1011101 93 3 × 31 1011110 94 2 × 47 1100100 100 10 × 10 1110000 112 8 × 14 1110100 116 4 × 29 1110101 117 9 × 13 1110110 118 2 × 59 1111100 124 4 × 31
Die erste Spalte ist die Zahl in binärer Form; Die zweite Spalte ist die Dezimalzahl. Wie die dritte Spalte angibt, sind alle diese Zahlen zusammengesetzt. Somit ist 84 eine bitflipresistente zusammengesetzte Zahl.
Die Aufgabe
Sie müssen eines der folgenden drei Programme oder Funktionen schreiben, je nachdem, was für Ihre Sprache am sinnvollsten ist:
- Ein Programm oder eine Funktion, die eine nichtnegative Ganzzahl n als Eingabe verwendet und die ersten n bitflipresistenten zusammengesetzten Zahlen ausgibt .
- Ein Programm oder eine Funktion, die eine nichtnegative Ganzzahl n als Eingabe verwendet und alle bitflipresistenten zusammengesetzten Zahlen kleiner als n ausgibt (oder, wenn Sie dies bevorzugen, kleiner oder gleich n , dh Sie können wählen, ob n in der Ausgabe enthalten sein soll, wenn Bitflip verwendet wird -beständig).
- Ein Programm oder eine Funktion, die keine Eingabe akzeptiert und alle bitflipresistenten zusammengesetzten Zahlen ausgibt. (Dies muss einen Ausgabemechanismus verwenden, der in der Lage ist, eine Ausgabe zu erzeugen, während das Programm noch ausgeführt wird, z. B. Drucken auf stdout, eine Lazy List oder einen Generator. Sie können nicht einfach die gesamte Liste berechnen und dann drucken.)
Testfälle
Hier sind die ersten paar bitflipresistenten Composite-Nummern:
84, 184, 246, 252, 324, 342, 424, 468, 588, 636, 664, 670, 712, 730, 934, 958
Klarstellungen
- Es sind nur die Zahlen, die Sie produzieren, die Bitflips widerstehen müssen. Hierbei geht es nicht darum, das Programm so zu gestalten, dass es gegenüber Bitflips resistent ist. Verwenden Sie die von Ihnen gewünschten Zahlen im Programm.
- Die von Ihnen ausgegebenen Zahlen müssen nicht gegen Bitflips in den "führenden Nullen" resistent sein. Stellen Sie sich vor, die Zahlen werden in der kleinstmöglichen Anzahl von Bits gespeichert, und nur diese Bits müssen gegen Umdrehen immun sein. Die ersten 1 Bits der ausgegebenen Zahlen müssen jedoch unempfindlich gegen Bitflips sein.
- Verwenden Sie einen beliebigen Algorithmus, der das richtige Ergebnis liefert. Sie werden hier nicht auf Effizienz bewertet.
- Wenn Sie nachweisen können, dass es endlich viele bitflipresistente zusammengesetzte Zahlen gibt, werden a) die Einschränkungen für das Ausgabeformat aufgehoben und b) die Liste kann hartcodiert werden (obwohl dies wahrscheinlich ausführlicher ist als nur die Berechnung). Diese Regel dient hauptsächlich der Vollständigkeit. Ich erwarte nicht, dass es relevant ist.
Siegbedingung
Das ist Code-Golf , also ist wie immer kürzer besser. Die Länge des Programms wird wie gewohnt in Bytes angegeben.
n
wenn sien
bitflipresistent sind? (dh machen Sie es "kleiner als oder gleich n"?)Antworten:
Gelee , 20? 22 Bytes
Probieren Sie es online!
Ergibt die ersten n solcher Zahlen.
Vielleicht
;0
kann die entfernt werden (ohne sie prüfen wir nicht, ob die Zahl selbst zusammengesetzt ist - gibt es Primzahlen mit allen zusammengesetzten Bit-Flips?)Es ist zu beachten, dass es nicht ausreicht, den Test
not(any(is prime))
mit dem Satz von Bit-gespiegelten Zahlen durchzuführen . Wir müssen auch testen, dass0
das nicht im Set ist.Dies liegt daran, dass
0
es nicht prim und nicht zusammengesetzt ist (1
ist auch, aber siehe unten).Die Notwendigkeit, nach etwas zu
0
suchen, lässt sich an einem Gegenbeispiel ablesen:131136
( 2 17 +2 6 ) hat das folgende Bit-Flip-Set:Alle, außer
0
zusammengesetzt, sind noch0
nicht prim.1
ist auch nicht primär und nicht zusammengesetzt und könnte im Set erscheinen. Wenn wir möchten, können wir dies jedoch so belassen, als wäre es ein Komposit:Alle Eingaben kleiner oder gleich
3
(wenn überhaupt berücksichtigt) enthalten0
sowieso (in der Tat alle kleiner als7
).um
1
in einem Bit Flip zu erreichen, muss die ursprüngliche Zahl die Form 2 k + 2 0 haben , und wenn diese größer ist als3
, dh k> 1 , dann können wir erreichen,3
indem wir das k- Bit abklappen und das 1- Bit setzen ( 2 1 + 2 0 = 3 ).Um
1
in zwei Bit-Flips zu erreichen, muss die ursprüngliche Zahl die Form 2 k haben. Wenn diese größer ist3
, können wir sie2
stattdessen in zwei Flips erreichen , und sie2
ist eine Primzahl.Gegenwärtig behandelt der Code beide
0
und1
zusammen unter Verwendung des "unbedeutenden" AtomsỊ
.Wie?
quelle
;0
ist -Œċ
erhält alle ungeordneten Paare mit Ersetzung der Indizes (J
), also für 84, die 7 Bits haben, die 28 sind (einschließlich [1,1] für die einzelnen Bit-Flips (aus dem "mit Ersatzteil"), nicht 29 (plus keine Änderung)Brachylog ,
3238 BytesProbieren Sie es online!
Dies ist eine Funktion / ein Prädikat
↰₀
, das einen Generator zurückgibt, der alle diese Zahlen generiert. (Der TIO-Link gibt nur die erste Zahl aus, sodass etwas beobachtet werden kann. Die lokale Ausführung hat jedoch viel mehr produziert.)Jetzt aktualisiert, um Zahlen, die innerhalb von zwei Bitflips von 0 oder 1 liegen (die weder Primzahlen noch zusammengesetzte Zahlen sind), korrekt zu behandeln.
Erläuterung
Hilfsprädikat
↰₂
(gibt eine Liste zurück, die bis auf ein Element der Eingabe entspricht)Ich würde es lieben, wenn es eine schnellere Möglichkeit gäbe, diese relativ einfache Rekursion durchzuführen, aber ich bin mir nicht sicher, ob es noch eine gibt. Die Spezifikation enthält einige vielversprechend aussehende Funktionen, die jedoch als nicht implementiert gekennzeichnet sind.
Hauptprogramm
↰₀
quelle
JavaScript (ES6), 96 Byte
Ein vollständiges Programm, das nach der Anzahl der übereinstimmenden Ganzzahlen fragt und diese nacheinander mit anzeigt
alert()
.Sofern Ihr Browser nicht für die Verwendung von Tail Call Optimization konfiguriert ist, wird dies möglicherweise aufgrund eines Rekursionsüberlaufs unterbrochen.
Unten finden Sie eine nicht rekursive Version (102 Bytes).
Annahme
Dieser Algorithmus basiert auf der Annahme, dass alle bitflipresistenten zusammengesetzten Zahlen gerade sind. Dies führt zu einer ziemlich wichtigen Vereinfachung: Anstatt jedes mögliche Bitpaar zu spiegeln, spiegeln wir nur Bit # 0 und ein anderes (oder überhaupt kein anderes Bit) und überprüfen, ob alle resultierenden Zahlen zusammengesetzt sind.
Ich kann jedoch keinen offensichtlichen Beweis dafür finden, dass es tatsächlich keine ungerade bitflipresistente zusammengesetzte Zahl gibt. Zufällig ist dies bei kleinen Zahlen nie der Fall (ich habe bis zu 1.000.000 überprüft), und es scheint, als würde die Wahrscheinlichkeit, eine zu finden, mit zunehmender Anzahl von Bits abnehmen (aber dies ist im Grunde nur meine Intuition darüber).
quelle
Jelly ,
2017 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Python 2, 113 Bytes
(Die zweite Zeile ist eine unbenannte Funktion, die eine Liste aller bitflipresistenten zusammengesetzten Zahlen zurückgibt, die kleiner sind als die Eingabe für die Funktion.)
Die Syntax
all(u%q for q in range(2,u))
wirdTrue
immer dann ausgewertet, wenn sieu
entweder Primzahl oder kleiner oder gleich ist2
, und ansonsten wird sie ausgewertetFalse
. (Es ist leer,True
wennu
kleiner oder gleich ist2
.)Mit anderen Worten,
all(u%q for q in range(2,u))
ist0
genau dann gleich, wenn zusammengesetztu
ist.Wenn die Eingabe der Funktion kleiner als ist
2
, gibt die Funktion eine leere Liste zurück (wie gewünscht). Nehmen wir also an, die EingabeN
ist mindestens2
, und nehmen wir an1 <= n < N
. Für jedesk
von0
bisn
(einschließlich) prüft der Code, obn
XOR mit zusammengesetztk
ist, und er prüft auch, obk
höchstens zwei1
in seiner Binärdarstellung sind. Wennn^k
es zusammengesetzt ist oder wennk
es mehr als zwei hat1
, geht es weiter zum nächsten Wert vonk
. Wenn es auf diese Weise alle Werte vonk
von0
durchläuftn
, wird esn
in die Liste aufgenommen.Auf der anderen Seite, wenn ein Wert von ihm
k
mit höchstens zwei1
ist , so dassn^k
nicht Verbund ist, dannn
ist nicht in der Liste enthält.quelle
Perl 6 ,
8785 BytesGibt alle Zahlen zurück, die kleiner oder gleich der eingegebenen Nummer sind.
Wie es funktioniert
Für jede Zahl n von 2 bis zur Eingabe wird Folgendes ausgeführt:
Erzeugt alle nicht negativen Ganzzahlen, die dieselbe oder eine kürzere Bitlänge als n haben .
Filtert Zahlen aus dieser Liste, für die weniger als drei Bits festgelegt sind (unter Verwendung eines regulären Ausdrucks).
XORs n mit jeder dieser Zahlen ergeben alle gültigen "Mutationen" von n .
Lässt n nur dann Teil der Ausgabeliste sein, wenn keine der Mutationen nicht zusammengesetzt ist (überprüfen Sie dies, indem Sie für jede Mutation x modulo eine All-Junction von Zahlen zwischen 2 und x -1 verwenden).
quelle
Mathematica, 115 Bytes
14 Byte gespeichert dank @MartinEnderSehr ineffizient, da alle Zahlen bis zu 2 ^ ceil (lg (n)) generiert werden.
Zweiter Code verwendet U + F4A1 (
Function
Funktion)quelle
Floroid ,
95109 BytesGibt eine Liste von bitflipresistenten Zahlen bis zurück
input - 1
. Behandelt auch die nervösen Situationen (0 und 1).Floroid ist eine alte Sprache von mir, die ich nur ein paar Mal benutzt habe. Ich habe es eine ganze Weile nicht angerührt, daher die Größe des Programms.
Übersetzt in den folgenden Python-Code, der meiner Meinung nach durch Rekursion reduziert werden könnte.
Jede hier verwendete Funktion ist in Floroid vordefiniert. Diese Seite enthält alle Funktionen und deren Definitionen.
quelle
MATL ,
30282726 BytesProbieren Sie es online!
Gibt alle bitflipresistenten zusammengesetzten Zahlen bis (und einschließlich) n aus. Verwendet Ideen aus beiden Jelly-Lösungen - betrachtet 0 nur als problematische Nicht-Primzahl; und erzeugt zuerst eine Liste von Zahlen in einem Abstand von 2, nimmt dann ein xor an.
Alternative Lösung durch Schleifen (30 Byte):
Gibt alle bitflipresistenten zusammengesetzten Zahlen bis (und einschließlich) n aus.
quelle
CJam ,
3433 BytesBerechnet alle bitflipresistenten Verbundwerkstoffe mit einer Genauigkeit von weniger als n .
Wie bei Jonathan Allan bin ich mir nicht sicher, ob es tatsächlich notwendig ist, auf 0 Bitflips zu prüfen. Wenn sich herausstellt, dass bei keiner Primzahl alle Bitflips zusammengesetzte Zahlen ergeben,
0+
kann die entfernt werden.Probieren Sie es online!
Erläuterung
quelle
MATL , 29 Bytes
Vielen Dank an Jonathan Allan für die Korrektur.
Dies nimmt eine Zahl n und gibt alle bitflipresistenten zusammengesetzten Zahlen bis zu n aus .
Wie es funktioniert
Probieren Sie es bei MATL Online!
quelle