2014-11-13 44 views
8

aşağıdaki linki 2'ye göre^n modülüne hesaplamak için nasıl gösterir biraz hack etmektir - 1 paralel: ModulusDivisionParallelHesaplama modülü

bu biraz manipülasyon nasıl çalıştığını açıklamak ve nasıl Can Belirli bir payda verilen verilen döngüyü açmak için (bkz. aşağıdaki örnek, bit maskeleri nereden geliyor)? 0xf için döngü geri açılması ve

Örnek:

y = x mod 0xF 
y = x & 0x0F0F0F0F + ((x & 0xF0F0F0F0) >> 4) 
y = y & 0x00FF00FF + ((y & 0xFF00FF00) >> 8) 
y = y & 0x0000FFFF + ((y & 0xFFFF0000) >> 16) 
y = y & 0xF 
+0

Evet, bunu biliyordum. Şu anda şubeler ve 2^n-1 formunda bir maske kullanan bir montaj modülü yöntemini optimize etmeye çalışıyorum. Bu yüzden dallardan kurtulmaya çalışıyorum ve bunun yerine bu yöntemi kullanıyorum. –

+0

İlginç. 2^n-1 modülünü kullanan ne tür bir uygulama olduğunu sorabilir miyim? Bunun yerine 2^n veya asal sayı kullanmamanın bir nedeni var mı? – JS1

+3

@ JS1 Bu olağandışı değil. Birçok örneği: Genel olarak bir bayt-bilge Reed-Solomon kodu (veri hatası tanıma ve düzeltme) ve Galois alan tabanlı algoritmalar. Kodlama (RS) peri basit kod-bilge, esas olarak döngüler, eklemeler ve modulo oluşur (kod çözme sırasında her zaman yerine önceden bazı statik veriler hesaplanır) – deviantfan

cevap

3

İlk olarak, bir açıklama:

s = 4 Aşağıdaki Açma elemanı almak (yani, modülü 0xF eşittir):

m = (n & 0x0F0F0F0F) + ((n >> 4) & 0x0F0F0F0F) 
m = ((n >> 16) + (n & 0x0000FFFF) 
m = ((n >> 8) + (n & 0x000000FF) 
m = ((n >> 4) + (n & 0x0000000F) 
m = ((n >> 4) + (n & 0x0000000F) 
m = ((n >> 4) + (n & 0x0000000F) 
m = ((n >> 4) + (n & 0x0000000F) 
m = m == 0xF ? 0 : m; 

Bu, sorunuzda sahip olduğunuzdan çok farklı. Bunun nedenini açıklamak için:

Matematik numaralarını hiç duydunuz; burada bir sayının tüm rakamlarını eklerseniz ve 9'a bölünebilirse, o zaman orijinal numara da olur? Bu çalışır çünkü hem orijinali hem de toplamı 9'a bölen kalanlar aynıdır. Aslında, burada yaptığımız şey, sadece farklı bir üste - örneğinizde, onaltılık taban ile.

matematik kung-fu şudur:

nihai değere Her onaltılık rakamın katkısı V * 16^P olarak temsil edilebilir. Not: 16^P = 1 (mod 15), bu nedenle her onaltılık hane değerinin nihai değere olan katkısı sadece V (mod 15)'dur. Diğer bir deyişle, tüm basamaklardan toplam katkı almak için hepsini (mod 15)'a ekleyin.

Bitsel işlemler, bunu logaritmik adım adımlarında gerçekleştirmenin akıllıca bir yoludur: onaltılı basamakların ilk yarısını ikinci yarısına art arda ekleyin.

9'ın hilesiyle ilgili problem, iki basamaklı bir sayı ile sonuçlanabilir: 99 = 9 + 9 = 18 (mod 10)! Sonra tekrar sadece hile yapmak: 18 = 1 + 8 = 9 (mod 10).

Benzer şekilde, kalan sayı bir basamak olana kadar m = ((n >> 4) + (n & 0x0000000F)'un 'ekstra' yinelemelerini takip ediyoruz.

Artık geriye kalan tek ayrıntı, 0xF sonucunu alırsak bunun yerine 0x0 olmasını istiyoruz.