Verwenden der de Bruijn-Sequenz, um das


11

Sean Anderson veröffentlichte Bit Hacks twiddling der Eric Cole-Algorithmus enthält , die finden eines N - Bit - Integer - v in O ( lg ( N ) ) Operationen mit mehrfach und Nachschlagen.log2vNvO(lg(N))

Der Algorithmus basiert auf einer "magischen" Zahl aus der De Bruijn-Sequenz. Kann jemand grundlegende mathematische Eigenschaften der hier verwendeten Sequenz erklären?

uint32_t v; // find the log base 2 of 32-bit v
int r;      // result goes here

static const int MultiplyDeBruijnBitPosition[32] = 
{
  0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30,
  8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31
};

v |= v >> 1; // first round down to one less than a power of 2 
v |= v >> 2;
v |= v >> 4;
v |= v >> 8;
v |= v >> 16;

r = MultiplyDeBruijnBitPosition[(uint32_t)(v * 0x07C4ACDDU) >> 27];

2
2kkn2kkn

1
log2v

1
@Sasho In eine Antwort verwandeln?
Yuval Filmus

@SashoNikolov Danke, fügte der Frage eine Deckenfunktion hinzu
Yury Bayda

Antworten:


9

log2vv32

v2log2v1

{0,1}s2kkXkk2iXii<k


3
i2ii2i11

v

5

c

  • c

    11111011100110101100010100100000
    
  • 2ici=0,1,...,31

    00000100011001010011101011011111
    00001111101110011010110001010010
    
  • (2i+11)ci=0,1,...,31

    00000111110001001010110011011101  (07C4ACDD)
    10000111110001001010110011011101
    01111000001110110101001100100011
    11111000001110110101001100100011
    

Einige Beobachtungen basierend auf schnellen Experimenten (ich hoffe, ich habe diese richtig verstanden):

  1. Es gibt 65536 Ganzzahlen vom Typ X.

  2. Es gibt 4096 Ganzzahlen vom Typ X + Y. Dies sind genau die Ganzzahlen vom Typ X, die mit der Sequenz '0000 ...' beginnen.

    • Intuition: mit führenden Nullen, Rotation = Verschiebung?
  3. Es gibt 256 Ganzzahlen vom Typ X + Y + Z. Dies sind genau die Ganzzahlen vom Typ X, die mit der Sequenz '0000011111 ...' beginnen.

    • Intuition: ??
  4. Alle ganzen Zahlen vom Typ Y sind ebenfalls vom Typ X.

  5. Es gibt jedoch auch 768 Ganzzahlen vom Typ Z, die weder vom Typ X noch vom Typ Y sind. Diese beginnen mit '1000011111 ...', '0111100000 ...' oder '1111100000 ...'


1
Dies ist die einzige Antwort, die sich damit befasst, warum die Multiplikation von De Bruijn mit 2 ^ n-1 funktioniert, im Gegensatz zu 2 ^ n, was nur eine Verschiebung ist. Ich würde es lieben, wenn jemand die "Intuition" von # 3 oben erweitern könnte. Wie kam Eric Cole darauf? Versuch und Irrtum? Oder etwas Verständnis dafür, was tatsächlich mit den Bits passiert, wenn Sie mit 2 ^ n-1 multiplizieren?
FarmerBob

1
  • Woher kommt diese Konstante?

Zitat: "Am 10. Dezember 2009 hat Mark Dickinson einige Operationen rasiert, indem er verlangt hat, dass v auf eins weniger als die nächste Potenz von 2 anstatt auf die Potenz von 2 aufgerundet wird." [graphics.stanford.edu/~seander/bithacks.html]

Diese besondere Konstante ist eine De Bruijn-Sequenz mit binärem Alphabet, aber mit einer zusätzlichen Eigenschaft. Ich werde es die 'Marc Dickinson-Eigenschaft' nennen, da der ursprüngliche Algorithmus ohne diese speziellen DB-Sequenzen implementiert werden könnte. Durch Anhängen von 2 zusätzlichen Operationen können wir jede gewöhnliche DB-Sequenz verwenden. Operation: v ^ = (v >> 1); // clr alle Bits außer MSB, die nach der Kaskadierung oder Verschiebung gesetzt wurden.

  • Ergebnisse (Bruteforce)

Seq.Type | Ganzzahlen | DBSeq. mit | ohne Rotationen | mit Dickinson Property
B (2, 3) | 256 | 16 | 2 | 1
B (2, 4) | 64Ki | 256 | 16 | 4
B (2, 5) | 04Gi | 64Ki | 02Ki | 256
B (2, 6) | 16Ei | 04Gi | 64Mi | ??

  • Das besondere Eigentum

0x7C4ACDD 2k1(mod232)32k1Geben Sie hier die Bildbeschreibung ein2k - )1

  • Lexikographisch kleinste binäre de Bruijn-Sequenzen mit Dickinson-Eigenschaft

    [B (2,3): 0x1D] [B (2,4): 0x0F2D] [B (2,5): 0x7C4ACDD] [B (2,6): Immer noch auf der Suche]

Wenn Sie auf eine elegante mathematische Formel hoffen würden, um sie zu beschreiben, oder auf einen Satz, um sie oder ähnliches zu erzeugen, würde dies meiner Meinung nach einen tiefen Einblick in die Zahlentheorie und möglicherweise in andere Bereiche erfordern, die über meine Fähigkeiten hinausgehen. Wenn ich eine wilde Vermutung anstellen sollte, würde ich wetten, dass sie von zellulären Automaten erzeugt werden könnten. Dies ist keine Antwort warum? auf einer rigorosen Basis, aber ein Versuch, intuitiv zu verstehen, warum es funktioniert und warum es richtig funktioniert, damit Sie es mit Zuversicht verwenden können.

PS Ich habe die LUT-Konstruktion nicht behandelt, die sich leicht ableiten lässt, wenn Sie die Funktionsprinzipien von Algorithmen verstehen.


Endlich gefunden: B (2,6) 0x3f08a4c6acb9dbd - eine 64-Bit-De-Bruijn-Sequenz mit der 'Dickinson-Eigenschaft'. Ich habe mindestens 122K solcher Sequenzen gefunden.
FranG
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.