Bestimmen Sie bei einem Halbwert N die kleinste positive ganze Zahl m , sodass die binäre Darstellung eines der beiden Faktoren von N in der binären Darstellung von N * m gefunden werden kann .
Beispiel
Betrachten wir das Semiprime N = 9799 .
Wir versuchen verschiedene Werte von m , beginnend mit 1:
m | N * m | N * m in binary
---+--------+------------------
1 | 9799 | 10011001000111
2 | 19598 | 100110010001110
3 | 29397 | 111001011010101
4 | 39196 | 1001100100011100
5 | 48995 | 1011111101100011
6 | 58794 | 1110010110101010
7 | 68593 | 10000101111110001
8 | 78392 | 10011001000111000
9 | 88191 | 10101100001111111
10 | 97990 | 10111111011000110
11 | 107789 | 11010010100001101
Wir hören hier auf, weil die binäre Darstellung des letzten Produkts 101001
die binäre Darstellung von 41 enthält , einer der beiden Faktoren von 9799 (der andere ist 239 ).
Die Antwort wäre also 11 .
Regeln und Notizen
- Versuche gerade Werte von ist sinnlos, m zu . Sie wurden der Vollständigkeit halber im obigen Beispiel gezeigt.
- Ihr Programm muss jedes N unterstützen, für das N * m innerhalb der Rechenkapazitäten Ihrer Sprache liegt.
- Es ist Ihnen gestattet, N vorher zu faktorisieren, anstatt jede mögliche Teilzeichenfolge der Binärdarstellung von N * m zu testen, um festzustellen , ob sich herausstellt, dass es sich um einen Faktor von handelt N handelt .
- Wie von MitchellSpector bewiesen , m immer vorhanden.
- Das ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes. Standardlücken sind verboten.
Testfälle
Die erste Spalte ist die Eingabe. Die zweite Spalte ist die erwartete Ausgabe.
N | m | N * m | N * m in binary | Factor
-----------+------+---------------+----------------------------------------------+-------
9 | 3 | 27 | [11]011 | 3
15 | 1 | 15 | [11]11 | 3
49 | 5 | 245 | [111]10101 | 7
91 | 1 | 91 | 10[1101]1 | 13
961 | 17 | 16337 | [11111]111010001 | 31
1829 | 5 | 9145 | 1000[111011]1001 | 59
9799 | 11 | 107789 | 1[101001]0100001101 | 41
19951 | 41 | 817991 | 1[1000111]101101000111 | 71
120797 | 27 | 3261519 | 11000[1110001]0001001111 | 113
1720861 | 121 | 208224181 | 11000110100[100111111101]10101 | 2557
444309323 | 743 | 330121826989 | 100110011011100110010[1101010010101011]01 | 54443
840000701 | 4515 | 3792603165015 | 11011100110000[1000110000111011]000101010111 | 35899
1468255967 | 55 | 80754078185 | 1001011001101010100010[1110001111]01001 | 911
Antworten:
Pyth, 13 Bytes
Demonstration
Erläuterung:
quelle
05AB1E ,
181615 Bytes-2 Bytes danke an Riley!
-1 Byte danke an Emigna!
Erläuterung:
Probieren Sie es online!
quelle
¹Ñ¦¨båO
sollte funktionieren, anstatt jeden Teilstring zu überprüfen.¼
und¾
mitN
.JavaScript (ES6),
969580 ByteEine Funktion, die eine rekursive Funktion zurückgibt, die eine rekursive Funktion verwendet, die eine rekursive Funktion verwendet. Ich beginne mich wirklich zu fragen, ob die
.toString(2)
Strecke kürzer sein würde ...Weisen Sie eine Variable zu, z. B.,
f=n=>...
und rufen Sie mit einem zusätzlichen Paar von Parens auff(9)()
. Wenn dies nicht zulässig ist (der Meta-Post befindet sich bei + 6 / -2), können Sie diese 83-Byte-Version mit Standardaufruf verwenden:Beide Versionen funktionieren mit Ausnahme der letzten drei Testfälle für alle. Sie können diese Testfälle auch versuchen , durch eine Änderung
x>>1
zu(x-x%2)/2
.quelle
Bash + Unix Dienstprogramme,
8584 BytesProbieren Sie es online!
Ich werde auch darauf hinweisen, dass m für jedes Semiprime n immer existiert. Hier ist der Grund:
Schreibe n = pq, wobei p und q Primzahl sind und p <= q.
Sei b die Anzahl der Stellen in der Binärdarstellung von n-1. Dann besteht p * (2 ^ b) + k in der Binärdarstellung von p für ein beliebiges k zwischen 0 und n-1 einschließlich aus der Binärdarstellung von p, gefolgt von b zusätzlichen Bits, die k darstellen.
Also beginnen die Zahlen p * (2 ^ b) + k für 0 <= k <= n-1, wenn sie in Binärschrift geschrieben sind, alle mit der Binärdarstellung von p. Da es sich jedoch um n aufeinanderfolgende Zahlen handelt, muss eine davon ein Vielfaches von n sein.
Daraus folgt, dass wir ein Vielfaches von n haben, dessen binäre Darstellung mit der binären Darstellung von p beginnt.
Basierend darauf kann man eine Obergrenze für m von 2 sqrt (n) finden. (Man kann wahrscheinlich eine viel engere Obergrenze als diese bekommen.)
quelle
Haskell, 161 Bytes
Einfache Prüfung. Zuerst Faktor, dann linear ab 1 suchen und für beide Faktoren das Minimum des Wertes nehmen.
Dauert ein paar Sekunden für den letzten Testfall (
1468255967
),ghci
berichtet(15.34 secs, 18,610,214,160 bytes)
mein Laptop.quelle
Mathematica, 83 Bytes
quelle
Brachylog (2), 14 Bytes
Probieren Sie es online!
Es gibt mehr als einen Weg, dies in 14 Bytes in Brachylog zu schreiben, also habe ich mich für den effizientesten entschieden. Wie bei Brachylog-Übermittlungen üblich, handelt es sich um eine Funktionsübermittlung. Sein Eingang ist das Semiprime, sein Ausgang ist der Multiplikator.
Erläuterung
Die Auswertungsreihenfolge von Prolog und Brachylog wird durch die erste Einschränkung festgelegt, die nicht sofort aus der Eingabe abgeleitet werden kann. In diesem Programm ist dies eine Einschränkung für das Ergebnis einer Multiplikation. Der Interpreter versucht daher, die Operanden der Multiplikation so nahe wie möglich an 0 zu halten. Wir kennen einen der Operanden und der andere ist die Ausgabe, also finden wir die kleinste Ausgabe, die wir können, genau das, was wir wollen.
quelle
PowerShell , 136 Byte
Probieren Sie es online!
Sehr langwierig, da die Konvertierung in eine Binärdatei in PowerShell funktioniert. : - /
Nimmt die Eingabe
$n
, Schleifen durch2
zu$n-1
und holt die Faktoren!($n%$_)
. Sendet diese in eine Schleife|%{...}
undconvert
s jeder von ihnen zu einer binären (Basis-2
) Zeichenfolge. Speichert diese binären Zeichenfolgen in$a
.Dann betreten wir eine
for(){...}
Endlosschleife. Jede Iteration, erhöhen wir++$m
multiplizieren , dass durch$n
, undconvert
das auf eine binäre Zeichenfolge, gespeichert in$b
. Dann istif
diese Zeichenfolge regex-like
alle Zeichenfolgen$a
, die wir ausgeben$m
undexit
.quelle
Perl 6 , 66 Bytes
Regex-basiert.
Super langsam, weil es die Faktoren von n brachial erzwingt bei jeder Regex-Match-Position jeder Zahl, die ausprobiert wird, erneut brutal .
Das einmalige Berechnen der Faktoren verbessert die Leistung, macht sie jedoch zu 72 Byte:
quelle