Blum Blum Shub
Pseudorandom number generator
- 10 min read
- 2 chapters
Related on Lably
Through Prime number, Parity bit and Congruence relation
Blum Blum Shub takes the form
- ,
where M = pq is the product of two large primes p and q. At each step of the algorithm, some output is derived from xn+1; the output is commonly either the bit parity of xn+1 or one or more of the least significant bits of xn+1.
The seed x0 should be an integer that is co-prime to M (i.e. p and q are not factors of x0) and not 1 or 0.
The two primes, p and q, should both be congruent to 3 (mod 4) (this guarantees that each quadratic residue has one square root which is also a quadratic residue), and should be safe primes with a small gcd((p-3)/2, (q-3)/2) (this makes the cycle length large).
An interesting characteristic of the Blum Blum Shub generator is the possibility to calculate any xi value directly (via Euler's theorem):
- ,
where is the Carmichael function. (Here we have ).
Security
There is a proof reducing its security to the computational difficulty of factoring. When the primes are chosen appropriately, and O(log log M) lower-order bits of each xn are output, then in the limit as M grows large, distinguishing the output bits from random should be at least as difficult as solving the quadratic residuosity problem modulo M.
The performance of the BBS random-number generator depends on the size of the modulus M and the number of bits per iteration j. While lowering M or increasing j makes the algorithm faster, doing so also reduces the security. A 2005 paper gives concrete, as opposed to asymptotic, security proof of BBS, for a given M and j. The result can also be used to guide choices of the two numbers by balancing expected security against computational cost.
Sign in to keep reading
One more chapter is free with a Lably account.
Example
Let , and (where is the seed). We can expect to get a large cycle length for those small numbers, because . The generator starts to evaluate by using and creates the sequence , , , = 9, 81, 236, 36, 31, 202. The following table shows the output (in bits) for the different bit selection methods used to determine the output.
The following is a Python implementation that does check for primality.
<span id="mwfQ"></span><span class="kn" id="mwfg">import</span><span class="w" id="mwfw"> </span><span class="nn" id="mwgA">sympy</span> <span class="k" id="mwgQ">def</span><span class="w" id="mwgg"> </span><span class="nf" id="mwgw">blum_blum_shub</span><span class="p" id="mwhA">(</span><span class="n" id="mwhQ">p1</span><span class="p" id="mwhg">:</span> <span class="nb" id="mwhw">int</span><span class="p" id="mwiA">,</span> <span class="n" id="mwiQ">p2</span><span class="p" id="mwig">:</span> <span class="nb" id="mwiw">int</span><span class="p" id="mwjA">,</span> <span class="n" id="mwjQ">seed</span><span class="p" id="mwjg">:</span> <span class="nb" id="mwjw">int</span><span class="p" id="mwkA">,</span> <span class="n" id="mwkQ">iterations</span><span class="p" id="mwkg">:</span> <span class="nb" id="mwkw">int</span><span class="p" id="mwlA">)</span> <span class="o" id="mwlQ">-></span> <span class="nb" id="mwlg">list</span><span class="p" id="mwlw">[</span><span class="nb" id="mwmA">int</span><span class="p" id="mwmQ">]:</span> <span class="w" id="mwmg"> </span><span class="sd" id="mwmw">"""Blum Blum Shub is a pseudorandom number generator."""</span> <span class="k" id="mwnA">assert</span> <span class="n" id="mwnQ">p1</span> <span class="o" id="mwng">%</span> <span class="mi" id="mwnw">4</span> <span class="o" id="mwoA">==</span> <span class="mi" id="mwoQ">3</span> <span class="k" id="mwog">assert</span> <span class="n" id="mwow">p2</span> <span class="o" id="mwpA">%</span> <span class="mi" id="mwpQ">4</span> <span class="o" id="mwpg">==</span> <span class="mi" id="mwpw">3</span> <span class="k" id="mwqA">assert</span> <span class="n" id="mwqQ">sympy</span><span class="o" id="mwqg">.</span><span class="n" id="mwqw">isprime</span><span class="p" id="mwrA">(</span><span class="n" id="mwrQ">p1</span> <span class="o" id="mwrg">//</span> <span class="mi" id="mwrw">2</span><span class="p" id="mwsA">)</span> <span class="k" id="mwsQ">assert</span> <span class="n" id="mwsg">sympy</span><span class="o" id="mwsw">.</span><span class="n" id="mwtA">isprime</span><span class="p" id="mwtQ">(</span><span class="n" id="mwtg">p2</span> <span class="o" id="mwtw">//</span> <span class="mi" id="mwuA">2</span><span class="p" id="mwuQ">)</span> <span class="n" id="mwug">n</span> <span class="o" id="mwuw">=</span> <span class="n" id="mwvA">p1</span> <span class="o" id="mwvQ">*</span> <span class="n" id="mwvg">p2</span> <span class="n" id="mwvw">numbers</span> <span class="o" id="mwwA">=</span> <span class="p" id="mwwQ">[]</span> <span class="k" id="mwwg">for</span> <span class="n" id="mwww">_</span> <span class="ow" id="mwxA">in</span> <span class="nb" id="mwxQ">range</span><span class="p" id="mwxg">(</span><span class="n" id="mwxw">iterations</span><span class="p" id="mwyA">):</span> <span class="n" id="mwyQ">seed</span> <span class="o" id="mwyg">=</span> <span class="p" id="mwyw">(</span><span class="n" id="mwzA">seed</span><span class="o" id="mwzQ">**</span><span class="mi" id="mwzg">2</span><span class="p" id="mwzw">)</span> <span class="o" id="mw0A">%</span> <span class="n" id="mw0Q">n</span> <span class="k" id="mw0g">if</span> <span class="n" id="mw0w">seed</span> <span class="ow" id="mw1A">in</span> <span class="n" id="mw1Q">numbers</span><span class="p" id="mw1g">:</span> <span class="nb" id="mw1w">print</span><span class="p" id="mw2A">(</span><span class="sa" id="mw2Q">f</span><span class="s2" id="mw2g">"The RNG has fallen into a loop at </span><span class="si" id="mw2w">{</span><span class="nb" id="mw3A">len</span><span class="p" id="mw3Q">(</span><span class="n" id="mw3g">numbers</span><span class="p" id="mw3w">)</span><span class="si" id="mw4A">}</span><span class="s2" id="mw4Q"> steps"</span><span class="p" id="mw4g">)</span> <span class="k" id="mw4w">return</span> <span class="n" id="mw5A">numbers</span> <span class="n" id="mw5Q">numbers</span><span class="o" id="mw5g">.</span><span class="n" id="mw5w">append</span><span class="p" id="mw6A">(</span><span class="n" id="mw6Q">seed</span><span class="p" id="mw6g">)</span> <span class="k" id="mw6w">return</span> <span class="n" id="mw7A">numbers</span> <span class="nb" id="mw7Q">print</span><span class="p" id="mw7g">(</span><span class="n" id="mw7w">blum_blum_shub</span><span class="p" id="mw8A">(</span><span class="mi" id="mw8Q">11</span><span class="p" id="mw8g">,</span> <span class="mi" id="mw8w">23</span><span class="p" id="mw9A">,</span> <span class="mi" id="mw9Q">3</span><span class="p" id="mw9g">,</span> <span class="mi" id="mw9w">100</span><span class="p" id="mw-A">))</span>The following Common Lisp implementation provides a simple demonstration of the generator, in particular regarding the three bit selection methods. The requirements imposed upon the parameters p, q and s (seed) are not checked.
<span id="mwAQA"></span><span class="p" id="mwAQE">(</span><span class="nb" id="mwAQI">defun</span><span class="w" id="mwAQM"> </span><span class="nv" id="mwAQQ">get-number-of-1-bits</span><span class="w" id="mwAQU"> </span><span class="p" id="mwAQY">(</span><span class="nv" id="mwAQc">bits</span><span class="p" id="mwAQg">)</span> <span class="w" id="mwAQk"> </span><span class="s" id="mwAQo">"Returns the number of 1-valued bits in the integer-encoded BITS."</span> <span class="w" id="mwAQs"> </span><span class="p" id="mwAQw">(</span><span class="k" id="mwAQ0">declare</span><span class="w" id="mwAQ4"> </span><span class="p" id="mwAQ8">(</span><span class="k" id="mwARA">type</span><span class="w" id="mwARE"> </span><span class="p" id="mwARI">(</span><span class="nc" id="mwARM">integer</span><span class="w" id="mwARQ"> </span><span class="mi" id="mwARU">0</span><span class="w" id="mwARY"> </span><span class="nb" id="mwARc">*</span><span class="p" id="mwARg">)</span><span class="w" id="mwARk"> </span><span class="nv" id="mwARo">bits</span><span class="p" id="mwARs">))</span> <span class="w" id="mwARw"> </span><span class="p" id="mwAR0">(</span><span class="k" id="mwAR4">the</span><span class="w" id="mwAR8"> </span><span class="p" id="mwASA">(</span><span class="nc" id="mwASE">integer</span><span class="w" id="mwASI"> </span><span class="mi" id="mwASM">0</span><span class="w" id="mwASQ"> </span><span class="nb" id="mwASU">*</span><span class="p" id="mwASY">)</span><span class="w" id="mwASc"> </span><span class="p" id="mwASg">(</span><span class="nb" id="mwASk">logcount</span><span class="w" id="mwASo"> </span><span class="nv" id="mwASs">bits</span><span class="p" id="mwASw">)))</span> <span class="p" id="mwAS0">(</span><span class="nb" id="mwAS4">defun</span><span class="w" id="mwAS8"> </span><span class="nv" id="mwATA">get-even-parity-bit</span><span class="w" id="mwATE"> </span><span class="p" id="mwATI">(</span><span class="nv" id="mwATM">bits</span><span class="p" id="mwATQ">)</span> <span class="w" id="mwATU"> </span><span class="s" id="mwATY">"Returns the even parity bit of the integer-encoded BITS."</span> <span class="w" id="mwATc"> </span><span class="p" id="mwATg">(</span><span class="k" id="mwATk">declare</span><span class="w" id="mwATo"> </span><span class="p" id="mwATs">(</span><span class="k" id="mwATw">type</span><span class="w" id="mwAT0"> </span><span class="p" id="mwAT4">(</span><span class="nc" id="mwAT8">integer</span><span class="w" id="mwAUA"> </span><span class="mi" id="mwAUE">0</span><span class="w" id="mwAUI"> </span><span class="nb" id="mwAUM">*</span><span class="p" id="mwAUQ">)</span><span class="w" id="mwAUU"> </span><span class="nv" id="mwAUY">bits</span><span class="p" id="mwAUc">))</span> <span class="w" id="mwAUg"> </span><span class="p" id="mwAUk">(</span><span class="k" id="mwAUo">the</span><span class="w" id="mwAUs"> </span><span class="nb" id="mwAUw">bit</span><span class="w" id="mwAU0"> </span><span class="p" id="mwAU4">(</span><span class="nb" id="mwAU8">mod</span><span class="w" id="mwAVA"> </span><span class="p" id="mwAVE">(</span><span class="nv" id="mwAVI">get-number-of-1-bits</span><span class="w" id="mwAVM"> </span><span class="nv" id="mwAVQ">bits</span><span class="p" id="mwAVU">)</span><span class="w" id="mwAVY"> </span><span class="mi" id="mwAVc">2</span><span class="p" id="mwAVg">)))</span> <span class="p" id="mwAVk">(</span><span class="nb" id="mwAVo">defun</span><span class="w" id="mwAVs"> </span><span class="nv" id="mwAVw">get-least-significant-bit</span><span class="w" id="mwAV0"> </span><span class="p" id="mwAV4">(</span><span class="nv" id="mwAV8">bits</span><span class="p" id="mwAWA">)</span> <span class="w" id="mwAWE"> </span><span class="s" id="mwAWI">"Returns the least significant bit of the integer-encoded BITS."</span> <span class="w" id="mwAWM"> </span><span class="p" id="mwAWQ">(</span><span class="k" id="mwAWU">declare</span><span class="w" id="mwAWY"> </span><span class="p" id="mwAWc">(</span><span class="k" id="mwAWg">type</span><span class="w" id="mwAWk"> </span><span class="p" id="mwAWo">(</span><span class="nc" id="mwAWs">integer</span><span class="w" id="mwAWw"> </span><span class="mi" id="mwAW0">0</span><span class="w" id="mwAW4"> </span><span class="nb" id="mwAW8">*</span><span class="p" id="mwAXA">)</span><span class="w" id="mwAXE"> </span><span class="nv" id="mwAXI">bits</span><span class="p" id="mwAXM">))</span> <span class="w" id="mwAXQ"> </span><span class="p" id="mwAXU">(</span><span class="k" id="mwAXY">the</span><span class="w" id="mwAXc"> </span><span class="nb" id="mwAXg">bit</span><span class="w" id="mwAXk"> </span><span class="p" id="mwAXo">(</span><span class="nb" id="mwAXs">ldb</span><span class="w" id="mwAXw"> </span><span class="p" id="mwAX0">(</span><span class="nb" id="mwAX4">byte</span><span class="w" id="mwAX8"> </span><span class="mi" id="mwAYA">1</span><span class="w" id="mwAYE"> </span><span class="mi" id="mwAYI">0</span><span class="p" id="mwAYM">)</span><span class="w" id="mwAYQ"> </span><span class="nv" id="mwAYU">bits</span><span class="p" id="mwAYY">)))</span> <span class="p" id="mwAYc">(</span><span class="nb" id="mwAYg">defun</span><span class="w" id="mwAYk"> </span><span class="nv" id="mwAYo">make-blum-blum-shub</span><span class="w" id="mwAYs"> </span><span class="p" id="mwAYw">(</span><span class="k" id="mwAY0">&key</span><span class="w" id="mwAY4"> </span><span class="p" id="mwAY8">(</span><span class="nv" id="mwAZA">p</span><span class="w" id="mwAZE"> </span><span class="mi" id="mwAZI">11</span><span class="p" id="mwAZM">)</span><span class="w" id="mwAZQ"> </span><span class="p" id="mwAZU">(</span><span class="nv" id="mwAZY">q</span><span class="w" id="mwAZc"> </span><span class="mi" id="mwAZg">23</span><span class="p" id="mwAZk">)</span><span class="w" id="mwAZo"> </span><span class="p" id="mwAZs">(</span><span class="nv" id="mwAZw">s</span><span class="w" id="mwAZ0"> </span><span class="mi" id="mwAZ4">3</span><span class="p" id="mwAZ8">))</span> <span class="w" id="mwAaA"> </span><span class="s" id="mwAaE">"Returns a function of no arguments which represents a simple</span> <span class="s" id="mwAaI"> Blum-Blum-Shub pseudorandom number generator, configured to use the</span> <span class="s" id="mwAaM"> generator parameters P, Q, and S (seed), and returning three values:</span> <span class="s" id="mwAaQ"> (1) the number x[n+1],</span> <span class="s" id="mwAaU"> (2) the even parity bit of the number,</span> <span class="s" id="mwAaY"> (3) the least significant bit of the number.</span> <span class="s" id="mwAac"> ---</span> <span class="s" id="mwAag"> Please note that the parameters P, Q, and S are not checked in</span> <span class="s" id="mwAak"> accordance to the conditions described in the article."</span> <span class="w" id="mwAao"> </span><span class="p" id="mwAas">(</span><span class="k" id="mwAaw">declare</span><span class="w" id="mwAa0"> </span><span class="p" id="mwAa4">(</span><span class="k" id="mwAa8">type</span><span class="w" id="mwAbA"> </span><span class="p" id="mwAbE">(</span><span class="nc" id="mwAbI">integer</span><span class="w" id="mwAbM"> </span><span class="mi" id="mwAbQ">0</span><span class="w" id="mwAbU"> </span><span class="nb" id="mwAbY">*</span><span class="p" id="mwAbc">)</span><span class="w" id="mwAbg"> </span><span class="nv" id="mwAbk">p</span><span class="w" id="mwAbo"> </span><span class="nv" id="mwAbs">q</span><span class="w" id="mwAbw"> </span><span class="nv" id="mwAb0">s</span><span class="p" id="mwAb4">))</span> <span class="w" id="mwAb8"> </span><span class="p" id="mwAcA">(</span><span class="k" id="mwAcE">let</span><span class="w" id="mwAcI"> </span><span class="p" id="mwAcM">((</span><span class="nv" id="mwAcQ">M</span><span class="w" id="mwAcU"> </span><span class="p" id="mwAcY">(</span><span class="nb" id="mwAcc">*</span><span class="w" id="mwAcg"> </span><span class="nv" id="mwAck">p</span><span class="w" id="mwAco"> </span><span class="nv" id="mwAcs">q</span><span class="p" id="mwAcw">))</span><span class="w" id="mwAc0"> </span><span class="c1" id="mwAc4">;; M = p * q</span> <span class="w" id="mwAc8"> </span><span class="p" id="mwAdA">(</span><span class="nv" id="mwAdE">x[n]</span><span class="w" id="mwAdI"> </span><span class="nv" id="mwAdM">s</span><span class="p" id="mwAdQ">))</span><span class="w" id="mwAdU"> </span><span class="c1" id="mwAdY">;; x0 = seed</span> <span class="w" id="mwAdc"> </span><span class="p" id="mwAdg">(</span><span class="k" id="mwAdk">declare</span><span class="w" id="mwAdo"> </span><span class="p" id="mwAds">(</span><span class="k" id="mwAdw">type</span><span class="w" id="mwAd0"> </span><span class="p" id="mwAd4">(</span><span class="nc" id="mwAd8">integer</span><span class="w" id="mwAeA"> </span><span class="mi" id="mwAeE">0</span><span class="w" id="mwAeI"> </span><span class="nb" id="mwAeM">*</span><span class="p" id="mwAeQ">)</span><span class="w" id="mwAeU"> </span><span class="nv" id="mwAeY">M</span><span class="w" id="mwAec"> </span><span class="nv" id="mwAeg">x[n]</span><span class="p" id="mwAek">))</span> <span class="w" id="mwAeo"> </span><span class="nf" id="mwAes">#'</span><span class="p" id="mwAew">(</span><span class="k" id="mwAe0">lambda</span><span class="w" id="mwAe4"> </span><span class="p" id="mwAe8">()</span> <span class="w" id="mwAfA"> </span><span class="c1" id="mwAfE">;; x[n+1] = x[n]^2 mod M</span> <span class="w" id="mwAfI"> </span><span class="p" id="mwAfM">(</span><span class="k" id="mwAfQ">let</span><span class="w" id="mwAfU"> </span><span class="p" id="mwAfY">((</span><span class="nv" id="mwAfc">x[n+1]</span><span class="w" id="mwAfg"> </span><span class="p" id="mwAfk">(</span><span class="nb" id="mwAfo">mod</span><span class="w" id="mwAfs"> </span><span class="p" id="mwAfw">(</span><span class="nb" id="mwAf0">*</span><span class="w" id="mwAf4"> </span><span class="nv" id="mwAf8">x[n]</span><span class="w" id="mwAgA"> </span><span class="nv" id="mwAgE">x[n]</span><span class="p" id="mwAgI">)</span><span class="w" id="mwAgM"> </span><span class="nv" id="mwAgQ">M</span><span class="p" id="mwAgU">)))</span> <span class="w" id="mwAgY"> </span><span class="p" id="mwAgc">(</span><span class="k" id="mwAgg">declare</span><span class="w" id="mwAgk"> </span><span class="p" id="mwAgo">(</span><span class="k" id="mwAgs">type</span><span class="w" id="mwAgw"> </span><span class="p" id="mwAg0">(</span><span class="nc" id="mwAg4">integer</span><span class="w" id="mwAg8"> </span><span class="mi" id="mwAhA">0</span><span class="w" id="mwAhE"> </span><span class="nb" id="mwAhI">*</span><span class="p" id="mwAhM">)</span><span class="w" id="mwAhQ"> </span><span class="nv" id="mwAhU">x[n+1]</span><span class="p" id="mwAhY">))</span> <span class="w" id="mwAhc"> </span><span class="c1" id="mwAhg">;; Compute the random bit(s) based on x[n+1].</span> <span class="w" id="mwAhk"> </span><span class="p" id="mwAho">(</span><span class="k" id="mwAhs">let</span><span class="w" id="mwAhw"> </span><span class="p" id="mwAh0">((</span><span class="nv" id="mwAh4">even-parity-bit</span><span class="w" id="mwAh8"> </span><span class="p" id="mwAiA">(</span><span class="nv" id="mwAiE">get-even-parity-bit</span><span class="w" id="mwAiI"> </span><span class="nv" id="mwAiM">x[n+1]</span><span class="p" id="mwAiQ">))</span> <span class="w" id="mwAiU"> </span><span class="p" id="mwAiY">(</span><span class="nv" id="mwAic">least-significant-bit</span><span class="w" id="mwAig"> </span><span class="p" id="mwAik">(</span><span class="nv" id="mwAio">get-least-significant-bit</span><span class="w" id="mwAis"> </span><span class="nv" id="mwAiw">x[n+1]</span><span class="p" id="mwAi0">)))</span> <span class="w" id="mwAi4"> </span><span class="p" id="mwAi8">(</span><span class="k" id="mwAjA">declare</span><span class="w" id="mwAjE"> </span><span class="p" id="mwAjI">(</span><span class="k" id="mwAjM">type</span><span class="w" id="mwAjQ"> </span><span class="nb" id="mwAjU">bit</span><span class="w" id="mwAjY"> </span><span class="nv" id="mwAjc">even-parity-bit</span><span class="p" id="mwAjg">))</span> <span class="w" id="mwAjk"> </span><span class="p" id="mwAjo">(</span><span class="k" id="mwAjs">declare</span><span class="w" id="mwAjw"> </span><span class="p" id="mwAj0">(</span><span class="k" id="mwAj4">type</span><span class="w" id="mwAj8"> </span><span class="nb" id="mwAkA">bit</span><span class="w" id="mwAkE"> </span><span class="nv" id="mwAkI">least-significant-bit</span><span class="p" id="mwAkM">))</span> <span class="w" id="mwAkQ"> </span><span class="c1" id="mwAkU">;; Update the state such that x[n+1] becomes the new x[n].</span> <span class="w" id="mwAkY"> </span><span class="p" id="mwAkc">(</span><span class="nb" id="mwAkg">setf</span><span class="w" id="mwAkk"> </span><span class="nv" id="mwAko">x[n]</span><span class="w" id="mwAks"> </span><span class="nv" id="mwAkw">x[n+1]</span><span class="p" id="mwAk0">)</span> <span class="w" id="mwAk4"> </span><span class="p" id="mwAk8">(</span><span class="nb" id="mwAlA">values</span><span class="w" id="mwAlE"> </span><span class="nv" id="mwAlI">x[n+1]</span> <span class="w" id="mwAlM"> </span><span class="nv" id="mwAlQ">even-parity-bit</span> <span class="w" id="mwAlU"> </span><span class="nv" id="mwAlY">least-significant-bit</span><span class="p" id="mwAlc">))))))</span> <span class="c1" id="mwAlg">;; Print the exemplary outputs.</span> <span class="p" id="mwAlk">(</span><span class="k" id="mwAlo">let</span><span class="w" id="mwAls"> </span><span class="p" id="mwAlw">((</span><span class="nv" id="mwAl0">bbs</span><span class="w" id="mwAl4"> </span><span class="p" id="mwAl8">(</span><span class="nv" id="mwAmA">make-blum-blum-shub</span><span class="w" id="mwAmE"> </span><span class="ss" id="mwAmI">:p</span><span class="w" id="mwAmM"> </span><span class="mi" id="mwAmQ">11</span><span class="w" id="mwAmU"> </span><span class="ss" id="mwAmY">:q</span><span class="w" id="mwAmc"> </span><span class="mi" id="mwAmg">23</span><span class="w" id="mwAmk"> </span><span class="ss" id="mwAmo">:s</span><span class="w" id="mwAms"> </span><span class="mi" id="mwAmw">3</span><span class="p" id="mwAm0">)))</span> <span class="w" id="mwAm4"> </span><span class="p" id="mwAm8">(</span><span class="k" id="mwAnA">declare</span><span class="w" id="mwAnE"> </span><span class="p" id="mwAnI">(</span><span class="k" id="mwAnM">type</span><span class="w" id="mwAnQ"> </span><span class="p" id="mwAnU">(</span><span class="k" id="mwAnY">function</span><span class="w" id="mwAnc"> </span><span class="p" id="mwAng">()</span><span class="w" id="mwAnk"> </span><span class="p" id="mwAno">(</span><span class="nb" id="mwAns">values</span><span class="w" id="mwAnw"> </span><span class="p" id="mwAn0">(</span><span class="nc" id="mwAn4">integer</span><span class="w" id="mwAn8"> </span><span class="mi" id="mwAoA">0</span><span class="w" id="mwAoE"> </span><span class="nb" id="mwAoI">*</span><span class="p" id="mwAoM">)</span><span class="w" id="mwAoQ"> </span><span class="nb" id="mwAoU">bit</span><span class="w" id="mwAoY"> </span><span class="nb" id="mwAoc">bit</span><span class="p" id="mwAog">))</span><span class="w" id="mwAok"> </span><span class="nv" id="mwAoo">bbs</span><span class="p" id="mwAos">))</span> <span class="w" id="mwAow"> </span><span class="p" id="mwAo0">(</span><span class="nb" id="mwAo4">format</span><span class="w" id="mwAo8"> </span><span class="no" id="mwApA">T</span><span class="w" id="mwApE"> </span><span class="s" id="mwApI">"~&Keys: E = even parity, L = least significant"</span><span class="p" id="mwApM">)</span> <span class="w" id="mwApQ"> </span><span class="p" id="mwApU">(</span><span class="nb" id="mwApY">format</span><span class="w" id="mwApc"> </span><span class="no" id="mwApg">T</span><span class="w" id="mwApk"> </span><span class="s" id="mwApo">"~2%"</span><span class="p" id="mwAps">)</span> <span class="w" id="mwApw"> </span><span class="p" id="mwAp0">(</span><span class="nb" id="mwAp4">format</span><span class="w" id="mwAp8"> </span><span class="no" id="mwAqA">T</span><span class="w" id="mwAqE"> </span><span class="s" id="mwAqI">"~&x[n+1] | E | L"</span><span class="p" id="mwAqM">)</span> <span class="w" id="mwAqQ"> </span><span class="p" id="mwAqU">(</span><span class="nb" id="mwAqY">format</span><span class="w" id="mwAqc"> </span><span class="no" id="mwAqg">T</span><span class="w" id="mwAqk"> </span><span class="s" id="mwAqo">"~&--------------"</span><span class="p" id="mwAqs">)</span> <span class="w" id="mwAqw"> </span><span class="p" id="mwAq0">(</span><span class="nb" id="mwAq4">loop</span><span class="w" id="mwAq8"> </span><span class="nv" id="mwArA">repeat</span><span class="w" id="mwArE"> </span><span class="mi" id="mwArI">6</span><span class="w" id="mwArM"> </span><span class="nb" id="mwArQ">do</span> <span class="w" id="mwArU"> </span><span class="p" id="mwArY">(</span><span class="nb" id="mwArc">multiple-value-bind</span><span class="w" id="mwArg"> </span><span class="p" id="mwArk">(</span><span class="nv" id="mwAro">x[n+1]</span><span class="w" id="mwArs"> </span><span class="nv" id="mwArw">even-parity-bit</span><span class="w" id="mwAr0"> </span><span class="nv" id="mwAr4">least-significant-bit</span><span class="p" id="mwAr8">)</span> <span class="w" id="mwAsA"> </span><span class="p" id="mwAsE">(</span><span class="nb" id="mwAsI">funcall</span><span class="w" id="mwAsM"> </span><span class="nv" id="mwAsQ">bbs</span><span class="p" id="mwAsU">)</span> <span class="w" id="mwAsY"> </span><span class="p" id="mwAsc">(</span><span class="k" id="mwAsg">declare</span><span class="w" id="mwAsk"> </span><span class="p" id="mwAso">(</span><span class="k" id="mwAss">type</span><span class="w" id="mwAsw"> </span><span class="p" id="mwAs0">(</span><span class="nc" id="mwAs4">integer</span><span class="w" id="mwAs8"> </span><span class="mi" id="mwAtA">0</span><span class="w" id="mwAtE"> </span><span class="nb" id="mwAtI">*</span><span class="p" id="mwAtM">)</span><span class="w" id="mwAtQ"> </span><span class="nv" id="mwAtU">x[n+1]</span><span class="p" id="mwAtY">))</span> <span class="w" id="mwAtc"> </span><span class="p" id="mwAtg">(</span><span class="k" id="mwAtk">declare</span><span class="w" id="mwAto"> </span><span class="p" id="mwAts">(</span><span class="k" id="mwAtw">type</span><span class="w" id="mwAt0"> </span><span class="nb" id="mwAt4">bit</span><span class="w" id="mwAt8"> </span><span class="nv" id="mwAuA">even-parity-bit</span><span class="p" id="mwAuE">))</span> <span class="w" id="mwAuI"> </span><span class="p" id="mwAuM">(</span><span class="k" id="mwAuQ">declare</span><span class="w" id="mwAuU"> </span><span class="p" id="mwAuY">(</span><span class="k" id="mwAuc">type</span><span class="w" id="mwAug"> </span><span class="nb" id="mwAuk">bit</span><span class="w" id="mwAuo"> </span><span class="nv" id="mwAus">least-significant-bit</span><span class="p" id="mwAuw">))</span> <span class="w" id="mwAu0"> </span><span class="p" id="mwAu4">(</span><span class="nb" id="mwAu8">format</span><span class="w" id="mwAvA"> </span><span class="no" id="mwAvE">T</span><span class="w" id="mwAvI"> </span><span class="s" id="mwAvM">"~&~6d | ~d | ~d"</span> <span class="w" id="mwAvQ"> </span><span class="nv" id="mwAvU">x[n+1]</span><span class="w" id="mwAvY"> </span><span class="nv" id="mwAvc">even-parity-bit</span><span class="w" id="mwAvg"> </span><span class="nv" id="mwAvk">least-significant-bit</span><span class="p" id="mwAvo">))))</span>

