\>Rozcvièka: {\I nejpravìj¹í jednièka} ve~dvojkovém èísle (hodnota, nikoliv pozice):
\alik{
- x&=\0\1\9\9\9\0\1\1\0\0\9\9\9\0 \cr
- x - 1&=\0\1\9\9\9\0\1\0\1\1\9\9\9\1 \cr
- x \land (x - 1)&=\0\1\9\9\9\0\1\0\0\0\9\9\9\0 \cr
- x \oplus (x \land (x - 1))&=\0\0\9\9\9\0\0\1\0\0\9\9\9\0 \cr}
+ x&=\0\1\9\9\9\0\1\1\0\0\0\0\0\0 \cr
+ x - 1&=\0\1\9\9\9\0\1\0\1\1\0\0\0\1 \cr
+ x \land (x - 1)&=\0\1\9\9\9\0\1\0\0\0\0\0\0\0 \cr
+ x \oplus (x \land (x - 1))&=\0\0\9\9\9\0\0\1\0\0\0\0\0\0 \cr}
\>Nyní uká¾eme, jak RAM pou¾ívat jako vektorový poèítaè, který umí paralelnì
poèítat se v¹emi prvky vektoru, pokud se dají zakódovat do~jediného slova.
\:$\<Sum>(x)$ -- seète v¹echny slo¾ky vektoru (pøedpokládáme, ¾e se vejdou do~$b$~bitù):
\numlist\nalpha
-\:sèítáním modulo $\1^{n+1}$ (uvìdomte si, ¾e $\1\0^{n+1}\bmod \1^{n+1}=1$)
+\:vymodulením èíslem $\1^{b+1}$ (to funguje, proto¾e $\1\0^{b+1}\bmod \1^{b+1}=1$), nebo
\:násobením vhodnou konstantou:
\setbox0=\hbox{~$x_{n-1}$}
\slotwd=\wd0
\rule
\[r_{n-1}] \dd \[r_2] \[r_1] \[s_n] \dd \[s_3] \[s_2] \[s_1] \cr
}
-Zde je výsledkem je dokonce vektor v¹ech èásteèných souètù:
+Zde je výsledkem dokonce vektor v¹ech èásteèných souètù:
$s_k=\sum_{i=0}^{k-1}x_i$, $r_k=\sum_{i=k}^{n-1}x_i$.
\endlist
-~ \0 \[y_{n-1}] \0 \[y_{n-2}] \[\cdots] \0 \[y_1] \0 \[y_0] \cr
}
-Ve~vektoru $y$ nahradíme prokládací nuly jednièkami a odeèteme vektor~$y$.
-Ve~výsledku se jednièky zmìní na~nuly právì u tìch slo¾ek, kde $x_i < y_i$.
+Ve~vektoru $x$ nahradíme prokládací nuly jednièkami a odeèteme vektor~$y$.
+Ve~výsledku se tyto jednièky zmìní na~nuly právì u tìch slo¾ek, kde $x_i < y_i$.
Pak je ji¾ staèí posunout na~správné místo a okolní bity vynulovat.
\:$\<Rank>(\alpha,x)$ -- spoèítá, kolik slo¾ek vektoru~$x$ je men¹ích ne¾~$\alpha$:
-
-\alik{\<Rank>(\alpha,x) = \<Sum>(\<Cmp>(\<Replicate>(\alpha),x))\cr}
+$$\<Rank>(\alpha,x) = \<Sum>(\<Cmp>(\<Replicate>(\alpha),x)).$$
\:$\<Insert>(\alpha,x)$ -- zatøídí hodnotu $\alpha$ do~setøídìného vektoru~$x$:
existující hodnoty).
\:$\<Unpack>(\alpha)$ -- vytvoøí vektor, jeho¾ slo¾ky jsou bity zadaného èísla
-(jinými slovy prolo¾í bity $b$~nulami).
+(jinými slovy prolo¾í bity bloky $b$~nul).
-Nejdøíve èíslo~$\alpha$ replikuje, pak anduje vhodnou bitovou maskou,
+Nejdøíve èíslo~$\alpha$ replikujeme, pak andujeme vhodnou bitovou maskou,
aby v~$i$-té slo¾ce zùstal pouze $i$-tý bit a ostatní se vynulovaly,
-a pak provede $\<Cmp>$ s~vektorem samých nul.
+a pak provedeme $\<Cmp>$ s~vektorem reprezentovaným touté¾ bitovou maskou.
\:$\<Unpack>_\varphi(\alpha)$ -- podobnì jako pøedchozí operace, ale bity je¹tì
prohází podle nìjaké pevné funkce $\varphi$:
\:$\<Pack>(x)$ -- dostane vektor nul a jednièek a vytvoøí èíslo, jeho¾ bity
jsou právì slo¾ky vektoru (jinými slovy ¹krtne nuly mezi bity):
-Pøedstavím si, ¾e slo¾ky èísla jsou o~jeden bit krat¹í a provedu \<Sum>.
+Pøedstavíme si, ¾e slo¾ky èísla jsou o~jeden bit krat¹í a provedeme \<Sum>.
Napøíklad pro $n=4$ a $b=4$:
\setbox0=\hbox{$x_3$}
\>Nyní je¹tì nìkolik operací s~normálními èísly. Zatím pøedpokládejme,
¾e pro~$b$-bitová èísla na~vstupu budeme mít k~dispozici $b^2$-bitový
-pracovní prostor.
+pracovní prostor, tak¾e budeme moci pou¾ívat vektory s~$b$ slo¾kami
+po~$b$ bitech.
\itemize\ibull
\alpha\oplus(\alpha-1)&= \0\9\9\9\0\1\1\1\1\1\cr
}
-\:$\<MSB>(\alpha)$ -- Most Significant Bit (nejpravìj¹í):
+\:$\<MSB>(\alpha)$ -- Most Significant Bit (pozice nejvy¹¹í jednièky):
-Z~\<LSB> pomocí zrcadlení.
+Z~\<LSB> pomocí zrcadlení (operací \<Permute>).
\endlist