de Bruijn 시퀀스를 사용하여 정수


11

숀 앤더슨 공개 비트 해킹 만지작 찾을 에릭 콜의 알고리즘을 포함 log2vN 비트 정수 v 에서 O(lg(N)) 룩업 곱셈과 함께 동작한다.

이 알고리즘은 De Bruijn 시퀀스의 "마법"숫자를 사용합니다. 아무도 여기에 사용 된 시퀀스의 기본 수학 속성을 설명 할 수 있습니까?

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
아이디어는이 논문 supertech.csail.mit.edu/papers/debruijn.pdf 에서 나옵니다 . 크기의 디 Brujn 서열 크기의 모든 비트 열을 표현하는 방법은 K를 매우 간결 각 가능한 문자열 연속 시퀀스로서 회만 나타난다. 따라서 de Bruijn 시퀀스를 n 2 k 비트만큼 이동하고 마지막 k 비트를 읽으면 n에 대한 고유 식별자가 있습니다. 2kkn2kkn
Sasho Nikolov

1
그런데 이것은 만 계산합니다 . 작성된대로 32 비트 정수에서만 작동합니다. log2v
Sasho Nikolov

1
@Sasho 답으로 바꾸시겠습니까?
Yuval Filmus

@SashoNikolov 감사합니다, 질문에 천장 기능을 추가했습니다
Yury Bayda

답변:


9

알고리즘은 log 2 v 만 계산 하고 코드를 작성할 때 32 비트 단어에 맞는 v에 대해서만 작동합니다 .log2vv32

가장 먼저 나타나는 시프트 및 / 또는 시퀀스에는 선행 1 비트 최하위 비트까지 전파하는 기능이 있습니다. 수치 적으로, 이것은 2 log 2 v 1을 제공 합니다.v2log2v1

흥미로운 부분은 Leiserson, Prokop 및 Randall의 논문에서 나온 Bruijn 트릭입니다 (MIT 교수는 비트 해킹을하는 데 시간을 보냅니다). 브루 인 시퀀스 에 대해 알아야 할 것은 가능한 한 압축 된 방식으로 주어진 길이의 모든 가능한 시퀀스를 나타냅니다. 정확하게, 알파벳 에 대한 브루 인 시퀀스 는 길이가 2 k 인 이진 문자열 s 이므로 각 길이 k 이진 문자열은 연속 서브 스트링으로 정확히 한 번만 나타납니다 (랩이 허용됨). 이것이 유용한 이유는 X 가 있다면{0,1}s2kkX그 비트 표현이다 드 브루 인 서열 (패딩 제로)이면 상위 k 개의 비트 2 X가 고유하게 식별 I를 (만큼 I < K ).kk2나는엑스나는나는<케이


3
이 방식으로 어떤 드 브루 인 시퀀스를 사용할 수 있음을 참고 계산하기 위해 주어진 이에게 난을 . 그러나 계산 브루 순서 드 임의 사용할 수 없습니다 내가 주어진 2 - 1 . 여기 0x07C4ACDD = 00000111110001001010110011011101는 추가되는 추가 등록, 감사와 드 브루 인 순서 것 같다 - (1) 이 방법을 파괴하지 않습니다. i2ii2i11
Jukka Suomela

@ JukaSuomela에게 감사드립니다. 나는 그것에 대해 약간 혼란 스러웠습니다. 그래도 항상 에 1을 추가 할 수 있다고 생각합니다 . V
Sasho Nikolov

5

  • 11111011100110101100010100100000
    
  • 2나는나는=0,1,...,31

    00000100011001010011101011011111
    00001111101110011010110001010010
    
  • (2나는+11)나는=0,1,...,31

    00000111110001001010110011011101  (07C4ACDD)
    10000111110001001010110011011101
    01111000001110110101001100100011
    11111000001110110101001100100011
    

빠른 실험을 기반으로 한 몇 가지 관찰 (이것이 옳았기를 바랍니다) :

  1. X 유형의 정수는 65536입니다.

  2. X + Y 유형의 정수는 4096 개입니다. 이들은 정확히 '0000 ...'시퀀스로 시작하는 X 유형의 정수입니다.

    • 직감 : 선행 0, 회전 = 이동?
  3. X + Y + Z 유형의 256 개 정수가 있습니다. 이들은 정확히 '0000011111 ...'시퀀스로 시작하는 X 유형의 정수입니다.

    • 직감 : ??
  4. Y 유형의 모든 정수도 X 유형입니다.

  5. 그러나 X 유형이나 Y 유형이 아닌 Z 유형의 정수도 768 개입니다. 이들은 '1000011111 ...', '0111100000 ...'또는 '1111100000 ...'으로 시작합니다.


1
이것은 단지 2 ^ n과 반대로 De Bruijn과 2 ^ n-1의 곱셈이 작동하는 이유를 다루는 유일한 대답입니다. 누군가 위의 # 3의 "직관"을 확장 할 수 있다면 좋을 것입니다. 에릭 콜은 어떻게이 일을 했습니까? 시행 착오? 또는 2 ^ n-1을 곱하면 실제로 비트에 어떤 일이 발생하는지 이해하고 있습니까?
FarmerBob

1
  • 이 상수는 어디에서 오는가?

인용 : "2009 년 12 월 10 일, Mark Dickinson은 v를 2의 거듭 제곱이 아니라 다음 2의 거듭 제곱보다 1보다 작게 반올림하여 몇 가지 작업을 줄였습니다." [graphics.stanford.edu/~seander/bithacks.html]

이 Particullar 상수는 이진 알파벳이지만 추가 속성을 가진 De Bruijn 시퀀스입니다. 이 특별한 DB 시퀀스없이 원래 알고리즘을 구현할 수 있기 때문에 이것을 'Marc Dickinson Property'라고 부를 것입니다. 2 개의 추가 작업을 추가하면 일반적인 DB 시퀀스를 사용할 수 있습니다. 조작 : v ^ = (v >> 1); // 계단식 또는 시프트 후 설정된 MSB를 제외한 모든 비트를 clr합니다.

  • 결과 (bruteforce)

시퀀스 타입 | 아니요. 정수 | 아니요. DBSeq. 와 | 회전없이 | 디킨슨 속성
B 와 함께 (2, 3) | 256 | 16 | 2 | 1
B (2, 4) | 64Ki | 256 | 16 | 4
B (2, 5) | 04 기 | 64Ki | 02 기 | 256
B (2, 6) | 16Ei | 04 기 | 64Mi | ??

  • 특별한 재산

0엑스74 2케이1(모드232)2 k 132케이1여기에 이미지 설명을 입력하십시오2케이1

  • Dickinson 속성이있는 사 전적으로 가장 작은 이진 de Bruijn 시퀀스

    [B (2,3) : 0x1D] [B (2,4) : 0x0F2D] [B (2,5) : 0x7C4ACDD] [B (2,6) : 계속 검색]

당신이 그것들 또는 그와 유사한 것을 만들어 내기 위해 그것들이나 정리를 설명하기 위해 우아한 수학 공식을 원한다면, 이것이 숫자 이론과 아마도 내 기술 범위를 벗어난 다른 분야에 대한 깊은 통찰력이 필요할 것이라고 생각합니다. 내가 야생의 추측을 할 수있는 곳이라면 셀룰러 오토 마타에 의해 생성 될 수 있다고 생각합니다. 이것은 왜 대답이 아닙니까? 엄격한 기반을 가지고 있지만 그것이 왜 작동하는지 왜 제대로 작동하는지 직관적으로 이해하려고 노력하므로 안심하고 사용할 수 있습니다.

추신 : 나는 LUT 구조를 다루지 않았는데, 알고리즘의 작동 원리를 이해하면 쉽게 추론됩니다.


마지막으로 발견 : B (2,6) 0x3f08a4c6acb9dbd- 'dickinson 속성'이있는 64 비트 de bruijn 시퀀스. 나는 적어도 122K의 그러한 서열을 발견했다.
FranG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.