Wenn man mentale Berechnungen macht, kann man:
- Bei einer Ganzzahl k summieren Sie alle Ziffern (in Basis 10). Wenn das Ergebnis ein Vielfaches von 3 ist, ist k ein Vielfaches von 3.
Kennen Sie einen Algorithmus, der ähnlich arbeitet, aber mit Binärziffern (Bits) arbeitet?
Zuerst dachte ich daran, die vorgefertigten Funktionen meiner Sprache zu verwenden, um Integer in ASCII zu konvertieren, um die Konvertierung von Basis 2 nach Basis 10 durchzuführen, und dann den Trick der mentalen Berechnung anzuwenden. Aber natürlich könnte ich dann auch die Basisumwandlung 2 auf 10 selbst codieren. Ich habe es noch nicht getan, aber ich werde es versuchen.
Dann habe ich an die euklidische Division in Basis 2 gedacht ...
Ich frage mich jedoch, ob es andere Mittel gibt, Algorithmen.
algorithms
Stephane Rolland
quelle
quelle
Antworten:
Betrachten Sie die folgenden zwei Beobachtungen (als Übung für den Leser):
Wir schließen daraus, dass eine Zahl (in binärer Form) nur dann durch drei teilbar ist, wenn die Summe der Bits an den geraden Stellen der Summe der Bits an den ungeraden Stellen Modulo 3 entspricht.
quelle
Was ist mit einem endlichen Automaten für den Job?
Natürlich ist die Magie nur Berechnungsmodulo 3. Das Hinzufügen des Symbols hinter der Zeichenfolge x bedeutet, dass der "Binärwert" der Zeichenfolge von v a l ( x ) für x zu 2 ⋅ v a l ( x ) + a für x a geht . Folglich vom Zustand p und das Symbol } und einem ∈ { 0 , 1 } . Anmerkung x ∈ { 0 , 1 }ein x v a l ( x ) x 2 ⋅ v a l ( x ) + a x a p bewegen wir uns a zu Zustand 2 p + a mod 3 für p ∈ { 0 , 1 , 2ein 2 p + a mod 3 p ∈ { 0 , 1 , 2 } a∈{0,1} ist eine Zeichenkette, wobei v a l ( x ) ∈ N sein Wert alsBinärzeichenketteist.x∈{0,1}∗ val(x)∈N
quelle
In der Binärdarstellung ergeben die Zahlen 1, 100, 10000 (= 100 × 100), 1000000 (= 100 × 100 × 100) usw. nach Division durch 11 (drei) den gleichen Rest. Wenn wir also eine Binärzahl in Teile gerader Länge aufteilen , ergibt die Summe der Teile den gleichen Rest wie die ursprüngliche Zahl.
(Wenn Sie die Zahl teilen, fügen Sie am Anfang so viele Nullen wie nötig hinzu . Beispielsweise teilen Sie 10111 in die Gruppen 01,01,11 oder 0001,0111 auf.)
Mathematisch aufgeteilt nur die Zahl in Gruppen von zwei Ziffern, fügen Sie dann die Gruppen; und wiederhole dies, bis dein Ergebnis 00 oder 11 ist = die ursprüngliche Zahl war ein Vielfaches von drei; oder 01 oder 10 = die ursprüngliche Zahl war kein Vielfaches von drei.
Bei einem Computerprogramm kann die Verwendung von Gruppen mit acht, sechzehn oder zweiunddreißig Bits für Ihre CPU schneller sein . Wenn beispielsweise die Acht-Bit-Addition am schnellsten ist, addieren Sie einfach alle Bytes und wiederholen Sie den Vorgang, bis das Ergebnis in ein Byte passt. Bestimmen Sie dann mit einer Anweisung den verbleibenden Rest, nachdem Sie durch drei geteilt haben.
(Hinweis: Wir gehen hier von vorzeichenlosen Ganzzahlen aus. Bei einer vorzeichenbehafteten Zahl muss etwas mehr darauf geachtet werden. Beispiel: 129 ist ein Vielfaches von 3, -127 jedoch nicht, obwohl die Bits 10000001 für früher als vorzeichenloses Byte und bedeuten Letzteres als vorzeichenbehaftetes Byte.)
quelle
Obwohl nicht binärspezifisch, ist wiederholtes Subtrahieren im Zweifel immer ein todsicherer Weg, um die Division mit dem Rest zu berechnen (und somit, wenn eine Zahl ein Vielfaches von 3 ist).
quelle