<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>codeland</title>
	<atom:link href="http://vandreev.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://vandreev.wordpress.com</link>
	<description>Programming, math, and things that are spiffy.</description>
	<lastBuildDate>Tue, 19 Jun 2007 21:04:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='vandreev.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>codeland</title>
		<link>http://vandreev.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://vandreev.wordpress.com/osd.xml" title="codeland" />
	<atom:link rel='hub' href='http://vandreev.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Feistel Ciphers and DES in Haskell.</title>
		<link>http://vandreev.wordpress.com/2007/06/18/feistel-ciphers-and-des-in-haskell/</link>
		<comments>http://vandreev.wordpress.com/2007/06/18/feistel-ciphers-and-des-in-haskell/#comments</comments>
		<pubDate>Mon, 18 Jun 2007 06:34:05 +0000</pubDate>
		<dc:creator>Vlad Andreev</dc:creator>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Mathematics]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://vandreev.wordpress.com/2007/06/18/feistel-ciphers-and-des-in-haskell/</guid>
		<description><![CDATA[Occasionally, I like to pick a random interesting topic that&#8217;s entirely unrelated to my work, and read up on it. Recently, it has been polynomial factoring and computer algebra in general, which I&#8217;d like to post about when I have the time. As a side note, I&#8217;ve also been meaning to write a quick expository [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vandreev.wordpress.com&amp;blog=588099&amp;post=27&amp;subd=vandreev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Occasionally, I like to pick a random interesting topic that&#8217;s entirely unrelated to my work, and read up on it.  Recently, it has been polynomial factoring and computer algebra in general, which I&#8217;d like to post about when I have the time.  As a side note, I&#8217;ve also been meaning to write a quick expository article on Dantzig&#8217;s simplex algorithm for linear programming, and use Haskell as a sort of a specification language for it.  Unfortunately, I&#8217;ve been rather busy as of late (what else is new), so here&#8217;s something else entirely.</p>
<p>I was reading up on DES while waiting for a gigantic Perforce sync over VPN, and something struck me as interesting:  DES is a Feistel network, and so is any number of other moden ciphers.  This suggests abstraction:  can we write a generic Feistel network, and then implement a variety of ciphers in terms of that?  This post is basically the result of posing that question.  I wanted to cover both DES and AES in a single post, but just presenting DES took a fair bit of text, and then I realized that AES is not Feistel.  The post does, however, present a complete implementation of DES and 3TDES, and I&#8217;d like to follow it up with other ciphers later on.</p>
<p>As a word of caution, literally all I know about cryptography, DES, Feistel ciphers, or anything else in that field comes from about two days&#8217; worth of reading up on it while waiting for builds and syncs.  Feistel networks rely on a cryptographically-strong pseudorandom function.  An incorrect implementation of that function may let you encrypt and decrypt plaintext, but do so in a way that&#8217;s potentially cryptographically useless.  If you use any of the code here (or in any other of my posts, for that matter) for anything remotely sensitive, please make sure that you verify it against a description of the algorithm that is known to be correct.</p>
<p>A Feistel network is a block cipher:  that is, it&#8217;s a cipher that acts on fixed-length blocks.  It&#8217;s described by the number of <em>rounds</em> (iterations), a set of <em>subkeys</em>, one for each round (also called a <em>key schedule</em>), and two functions:  <em>(+)</em> and <em>f</em>.  The former is commonly bitwise addition modulo 2 (exclusive OR, in other words), while <em>f</em> is the so-called <em>round function</em>, which we&#8217;ll talk about shortly.  Thus specified, the resulting Feistel network is a process that takes a block, splits it into two equal halves, call them <em>L_0</em> and <em>R_0</em>, and proceeds to apply the following iterations to it, one per round:<br />
<img src='http://s0.wp.com/latex.php?latex=L_i+%3D+R_%7Bi-1%7D&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L_i = R_{i-1}' title='L_i = R_{i-1}' class='latex' /><br />
<img src='http://s0.wp.com/latex.php?latex=R_i+%3D+L_%7Bi-1%7D+%5Coplus+f%28R_%7Bi-1%7D%2C+K_%7Bi-1%7D%29.&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='R_i = L_{i-1} &#92;oplus f(R_{i-1}, K_{i-1}).' title='R_i = L_{i-1} &#92;oplus f(R_{i-1}, K_{i-1}).' class='latex' /></p>
<p>If <em>n</em> is the number of rounds, then <img src='http://s0.wp.com/latex.php?latex=%28L_n%2C+R_n%29&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='(L_n, R_n)' title='(L_n, R_n)' class='latex' /> is the final ciphertext, which we&#8217;ll usually merge back into a single number.  The process can be interpreted as follows:  at each iteration, the right half <em>R</em> crosses into the left half <em>L</em>, and the left half <em>L</em> is scrambled using <em>(+)</em> and <em>f</em>, and crossed into <em>R</em>.  One half is always &#8220;more&#8221; encrypted than the other, by one round.  The idea is that the round function <em>f</em> is something weird and non-invertible &#8212; to be precise, <em>f</em> is a cryptographically secure pseudorandom function with <img src='http://s0.wp.com/latex.php?latex=K_i&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='K_i' title='K_i' class='latex' /> as the seed.</p>
<p><a href="http://en.wikipedia.org/wiki/Michael_Luby">Michael Luby</a> and <a href="http://en.wikipedia.org/wiki/Charles_Rackoff">Charles Rackoff</a> showed that if this is the case, then four rounds are sufficient to make the corresponding Feistel network a <em>strong</em> pseudorandom permutation, meaning that it remains pseudorandom even if the inverse permutation is discovered.  This is a good property to have, since otherwise you can&#8217;t publish the algorithm;  besides, cryptographers appear to be fond of providing hypothetical adversaries with access to an omniscient oracle who knows the details of the algorithm.  After four rounds, the oracle doesn&#8217;t help.  Plain DES uses 16 rounds.  Triple-DES uses 48.</p>
<p>The ability to decrypt a ciphertext hinges on the definition of (+), in that we need to be able to reverse the process as follows:<br />
<img src='http://s0.wp.com/latex.php?latex=R_%7Bi-1%7D+%3D+L_i&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='R_{i-1} = L_i' title='R_{i-1} = L_i' class='latex' /><br />
<img src='http://s0.wp.com/latex.php?latex=L_%7Bi-1%7D+%3D+R_i+%5Coplus+f+%28L_i%2C+K_i%29.&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L_{i-1} = R_i &#92;oplus f (L_i, K_i).' title='L_{i-1} = R_i &#92;oplus f (L_i, K_i).' class='latex' /><br />
The reason this works is that <em>(+)</em> is picked so that if one of the parameters is held constant, the function is its own inverse &#8212; so we&#8217;re backtracking from the last subkey back to the first.  Exclusive OR works here, but we could pick other functions as well (although, it seems that anything more complex than XOR could as easily be absorbed into f instead &#8212; do Feistel ciphers exist that have a mixing function other than XOR?).</p>
<p>Alternatively, we can reverse the process by reversing the key schedule <em>K</em>, swapping <em>L</em> and <em>R</em>, and using the same network as we did for encryption.  DES swaps the <em>L</em> and <em>R</em> halves before joining them into the final ciphertext, so it can be inverted by simply reversing the key schedule.  Any generic description of a Feistel cipher is going to be a higher-order function, since it takes the functions <em>(+)</em> and <em>f</em> as arguments.  Let&#8217;s write it:</p>
<p><font size="3">
<pre>feistel <font color="Red">::</font> <font color="Blue">(</font>Bits a<font color="Blue">)</font> <font color="Red">=&gt;</font> <font color="Blue">(</font>a <font color="Red">-&gt;</font> b <font color="Red">-&gt;</font> a<font color="Blue">)</font>    <font color="Blue">-- Mixing function</font>
                    <font color="Red">-&gt;</font> <font color="Blue">(</font>a <font color="Red">-&gt;</font> k <font color="Red">-&gt;</font> b<font color="Blue">)</font>    <font color="Blue">-- Round function</font>
                    <font color="Red">-&gt;</font> a                <font color="Blue">-- Block to be encrypted</font>
                    <font color="Red">-&gt;</font> <font color="Red">[</font>k<font color="Red">]</font>              <font color="Blue">-- Key schedule</font>
                    <font color="Red">-&gt;</font> <font color="Blue">(</font>a<font color="Blue">,</font> a<font color="Blue">)</font>           <font color="Blue">-- (L, R)</font>

feistel <font color="Blue">(</font><font color="Blue">+</font><font color="Blue">)</font> f block keys <font color="Red">=</font> foldl rnd <font color="Blue">(</font>l<font color="Blue">,</font> r<font color="Blue">)</font> keys
                           <font color="Green"><u>where</u></font>
                                 <font color="Blue">(</font>l<font color="Blue">,</font> r<font color="Blue">)</font> <font color="Red">=</font> split block half
                                 half   <font color="Red">=</font> <font color="Blue">(</font>bitSize block<font color="Blue">)</font> <font color="Blue">`div`</font> <font color="Magenta">2</font>
                                 rnd <font color="Blue">(</font>l<font color="Blue">,</font> r<font color="Blue">)</font> k <font color="Red">=</font> <font color="Blue">(</font>r<font color="Blue">,</font> l <font color="Blue">+</font> f r k<font color="Blue">)</font>

split n k <font color="Red">=</font> <font color="Blue">(</font>n <font color="Blue">.&amp;.</font> <font color="Blue">(</font><font color="Magenta">2</font><font color="Blue">^</font>k<font color="Blue">-</font><font color="Magenta">1</font><font color="Blue">)</font><font color="Blue">,</font> n <font color="Blue">`shiftR`</font> k<font color="Blue">)</font>
merge l r k <font color="Red">=</font> <font color="Blue">(</font>r <font color="Blue">`shiftL`</font> k<font color="Blue">)</font> <font color="Blue">.|.</font> l
</pre>
<p></font></p>
<p>As a side note, in C++, I would write the above as an abstract base class with pure virtuals for <em>(+)</em> and <em>f</em>.  That sort of translation seems to crop up fairly often.</p>
<p>The above is hopefully a fairly straightforward implementation of the verbal description.  We want to parametrize our Feistel implementation over all fixed-width types with bitwise operations on them, so we require that the type of a data block is in <em>Bits</em>.  We then ask for the mixing function <em>(+)</em>, the round function <em>f</em>, the block itself, and the key schedule.  We split the block in half, and apply the iterations as described earlier (note that we infer the number of rounds from the key schedule).  Since each round takes the results of the previous round, a straightforward way to implement the process is to describe a single round, and then left-fold the key schedule over it.</p>
<p>Finally, to make the bit fiddling easier for subsequent applications, we generalize splitting a block into halves and merging it back, by writing the functions split and merge.</p>
<p>A Feistel cipher is, more generally, a type of a product cipher.  Product ciphers are block ciphers that execute, in sequence, a series of relatively simple transformation of the plaintext block.  Commonly, these transformations include bitwise permutations (P-boxes), substitutions (S-boxes), and linear mixing (our <em>(+)</em> function).  In the case of DES, there is a handful of P-boxes, 8 S-boxes, and XOR for mixing.</p>
<p>A permutation box is simply a bitwise permutation:  we shuffle the bits around according to some table.  Most of the permutation boxes in DES are invertible, but some are not.  Let&#8217;s write the code for applying a permutation box in general.</p>
<p><font size="3">
<pre>permute <font color="Red">::</font> <font color="Blue">(</font>Num a<font color="Blue">,</font> Bits a<font color="Blue">)</font> <font color="Red">=&gt;</font> <font color="Red">[</font>Int<font color="Red">]</font> <font color="Red">-&gt;</font> a <font color="Red">-&gt;</font> a
permute table key <font color="Red">=</font> foldl shuffle <font color="Magenta">0</font> <font color="Blue">(</font>zip table <font color="Red">[</font><font color="Magenta">0</font><font color="Red">..</font><font color="Red">]</font><font color="Blue">)</font>
                    <font color="Green"><u>where</u></font>
                        shuffle k <font color="Blue">(</font>n<font color="Blue">+</font><font color="Magenta">1</font><font color="Blue">,</font> b<font color="Blue">)</font> <font color="Red">=</font> k <font color="Blue">.|.</font> <font color="Blue">(</font>isSet n <font color="Blue">`shiftL`</font> b<font color="Blue">)</font>
                        isSet n <font color="Red">=</font> <font color="Green"><u>if</u></font> testBit key n <font color="Green"><u>then</u></font> <font color="Magenta">1</font> <font color="Green"><u>else</u></font> <font color="Magenta">0</font></pre>
<p></font></p>
<p>Note the <em>(n+k)</em> pattern in <em>shuffle</em>:  the DES documentation I&#8217;ve read uses the convention that LSB is bit 1, not bit 0, and I didn&#8217;t want to have to convert each table.  This is fairly straightforward as well, but if you don&#8217;t read Haskell, the idea is as follows.  We take a table of bit positions, presented as a list:  so [4,2,1] means that bit 1 is shuffled into position 4, bit 2 remains the same, and bit 3 is moved to position 1.  We decorate that table with the bit positions, by saying <em>zip table [0..]</em>, which evaluates to a list of pairs <em>(destination_bit, source_bit)</em>.  Finally, we run over that list, and set bits as appropriate.</p>
<p>The above is almost everything we need to implement DES, and we haven&#8217;t even discussed the algorithm.  I&#8217;ll use the implementation of single-block encryption as a way of introducing the process.</p>
<p><font size="3">
<pre>des keys block <font color="Red">=</font> applyFp <font color="Blue">(</font>merge' <font color="Blue">$</font> feistel xor f <font color="Blue">(</font>applyIp block<font color="Blue">)</font> keys<font color="Blue">)</font>
                 <font color="Green"><u>where</u></font>
                          f r key <font color="Red">=</font> <font color="Green"><u>let</u></font>
                                        bs <font color="Red">=</font> take <font color="Magenta">8</font> <font color="Blue">$</font> unfoldr <font color="Blue">(</font>Just <font color="Blue">.</font> shift<font color="Blue">)</font> nr
                                        nr <font color="Red">=</font> xor <font color="Blue">(</font>ebitSelect r<font color="Blue">)</font> key
                                        shift k <font color="Red">=</font> <font color="Blue">(</font>k <font color="Blue">.&amp;.</font> <font color="Magenta">0x3f</font><font color="Blue">,</font> k <font color="Blue">`shiftR`</font> <font color="Magenta">6</font><font color="Blue">)</font>
                                    <font color="Green"><u>in</u></font>
                                        pPerm <font color="Blue">(</font>applySboxes bs<font color="Blue">)</font>

                          merge' <font color="Blue">(</font>l<font color="Blue">,</font>r<font color="Blue">)</font> <font color="Red">=</font> merge r l <font color="Magenta">32</font></pre>
<p></font></p>
<p>Let&#8217;s go through this step by step.  To get some of the undefined functions out of the way, <em>applyIp</em> and <em>applyFp</em> are P-boxes, where Ip stands for <em>Initial Permutation</em>, and Fp stands for <em>Final Permutation</em> (also called <em>Inverse Initial Permutation</em>).  Similarly, <em>ebitSelect</em> and <em>pPerm</em> are P-boxes which are applied at various stages of computation of <em>f</em>.  Finally, <em>applySboxes</em> applies, as the name suggests, the S-boxes.  The details of box implementations mostly consist of table data, so we&#8217;ll concentrate on the algorithm first.</p>
<p>First, <em>feistel</em> is evaluated, with xor as the mixing function, <em>f</em> as the round function, <em>block</em> with <em>&#8220;Initial Permutation&#8221;</em> applied as the data block, and the input key schedule (note that we haven&#8217;t yet discussed how the key schedule is computed either).  The crux of the algorithm is then the round function <em>f</em>.  As specified by <em>feistel</em>, the function takes <em>R_i</em> and <em>K_i</em>, and does something dodgy to them.  The process is this:</p>
<p>a) Permute <em>R_i</em> using the <em>ebitSelect</em> P-box.<br />
b) XOR the result with <em>K_i</em>.<br />
c) Split the resulting 56-bit value (see below) into eight 6-bit values <em>B_1</em> &#8230; <em>B_8</em>.<br />
d) Run <em>B_1</em> &#8230; <em>B_8</em> through the corresponding S-boxes.<br />
e) Run the result through the <em>pPerm</em> P-box.</p>
<p>As I mentioned in the introduction, my knowledge of cryptography is limited to what I&#8217;ve read in the past couple of days, so I can&#8217;t, unfortunately, detail the requirements on the specific P-boxes or the S-boxes &#8212; I understand that the combination of them needs to make <em>f</em> a cryptographic PRNG in <em>K_i</em>, but I don&#8217;t know enough about PRNGs to comment on why those particular transformations, in that particular sequence, are the right thing to do.  My guess is that the S-box values are picked to avoid short cycles, and the two permutations lengthen the cycles further.  </p>
<p>Once the Feistel network is applied, we apply another P-box, <em>applyFp</em>, the <em>&#8220;Forward Permutation.&#8221;</em>  This is the inverse of <em>&#8220;Initial Permutation.&#8221;</em>  In addition to this, we use a new function, <em>merge&#8217;</em>, to merge the results into a single ciphertext block <em>while swapping </em>L<em> and </em>R &#8212; which is a simple but subtle detail.  Recall how while discussing the deciphering stage of a Feistel network, we noted that deciphering can be done by simply reversing the key schedule, and swapping <em>L</em> and <em>R</em>.  Since the swap is performed at this stage, the decryption function is simply the encryption function with the key schedule reversed.  This is nice, because <em>des keys</em> encrypts a block, while <em>des (reverse keys)</em> decrypts it.</p>
<p>We can write a group of functions to make the above actually usable:</p>
<p><font size="3">
<pre><font color="Blue">-- Encrypts a text message</font>
encryptDES key <font color="Red">=</font> map <font color="Blue">(</font>encryptBlock key<font color="Blue">)</font> <font color="Blue">.</font> preparePlaintext

<font color="Blue">-- Decrypts a DES-encoded message</font>
decryptDES key <font color="Red">=</font> readPlaintext <font color="Blue">.</font> map <font color="Blue">(</font>decryptBlock key<font color="Blue">)</font>

<font color="Blue">-- Encrypts a block</font>
encryptBlock key <font color="Red">=</font> des <font color="Blue">(</font>keySchedule <font color="Blue">(</font>pc1 key<font color="Blue">)</font><font color="Blue">)</font>

<font color="Blue">-- Decrypts a block</font>
decryptBlock key <font color="Red">=</font> des <font color="Blue">(</font>reverse <font color="Blue">$</font> keySchedule <font color="Blue">(</font>pc1 key<font color="Blue">)</font><font color="Blue">)</font>
</pre>
<p></font></p>
<p>Here, <em>pc1</em> is yet another P-box, called <em>&#8220;Permuted Choice 1.&#8221;</em>  Several new functions have made an appearance:  functions to prepare the plaintext (convert it to 64-bit words), read plaintext from a list of 64-bit words, and compute a key schedule from a key.</p>
<p>We&#8217;ll jump ahead a little bit and divulge a major detail of the <em>pc1</em> P-box.  The original DES algorithm operates on 64-bit keys, but the top bit of every byte is used as a parity bit, thereby reducing the actual key size to 56.  This is why the S-box step was dividing the key into eight 6-bit blocks:  8*6=56.  The key schedule splits that 56-bit value into two 28-bit halves, rotates them 1 or 2 bits to the left depending on a table, merges the result into a key, and feeds that into the next iteration.  There are 16 iterations total:</p>
<p><font size="3">
<pre>keySchedule key <font color="Red">=</font> schedule bits l r
                  <font color="Green"><u>where</u></font>
                        bits <font color="Red">=</font> <font color="Red">[</font><font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Red">]</font>
                        <font color="Blue">(</font>l<font color="Blue">,</font>r<font color="Blue">)</font> <font color="Red">=</font> split key <font color="Magenta">28</font>
                        schedule [] <font color="Green"><u>_</u></font> <font color="Green"><u>_</u></font>     <font color="Red">=</font> []
                        schedule <font color="Blue">(</font>n<font color="Red"><b>:</b></font>ns<font color="Blue">)</font> l r <font color="Red">=</font> <font color="Green"><u>let</u></font>
                                                l' <font color="Red">=</font> rotateL l n
                                                r' <font color="Red">=</font> rotateL r n
                                                k' <font color="Red">=</font> merge l' r' <font color="Magenta">28</font>
                                              <font color="Green"><u>in</u></font>
                                                pc2 k' <font color="Red"><b>:</b></font> schedule ns l' r'</pre>
<p></font></p>
<p>Here, we see our final P-box:  <em>pc2</em>, which stands for <em>&#8220;Permuted Choice 2.&#8221;</em>  We&#8217;ve reused split and merge from earlier.  All that&#8217;s left is the plaintext conversion functions:</p>
<p><font size="3">
<pre>preparePlaintext <font color="Red">::</font> <font color="Red">[</font>Char<font color="Red">]</font> <font color="Red">-&gt;</font> <font color="Red">[</font>Word64<font color="Red">]</font>
preparePlaintext text <font color="Red">=</font> text64 <font color="Blue">(</font>to64 text<font color="Blue">)</font>
                        <font color="Green"><u>where</u></font>
                           to64 <font color="Red">=</font> map <font color="Blue">(</font>fromIntegral <font color="Blue">.</font> ord<font color="Blue">)</font>

                           text64 [] <font color="Red">=</font> []
                           text64 ns <font color="Red">=</font> <font color="Green"><u>let</u></font>
                                            <font color="Blue">(</font>x<font color="Blue">,</font>rest<font color="Blue">)</font> <font color="Red">=</font> splitAt <font color="Magenta">8</font> ns
                                            w64 <font color="Red">=</font> foldl1 shiftOr <font color="Blue">(</font>reverse x<font color="Blue">)</font>
                                            shiftOr k r <font color="Red">=</font> <font color="Blue">(</font>k <font color="Blue">`shiftL`</font> <font color="Magenta">8</font><font color="Blue">)</font> <font color="Blue">.|.</font> r
                                       <font color="Green"><u>in</u></font>
                                            w64 <font color="Red"><b>:</b></font> text64 rest

readPlaintext <font color="Red">::</font> <font color="Red">[</font>Word64<font color="Red">]</font> <font color="Red">-&gt;</font> <font color="Red">[</font>Char<font color="Red">]</font>
readPlaintext text <font color="Red">=</font> concatMap to8 text
                     <font color="Green"><u>where</u></font>
                        to8 <font color="Red">=</font> map <font color="Blue">(</font>chr <font color="Blue">.</font> fromIntegral<font color="Blue">)</font> <font color="Blue">.</font> take <font color="Magenta">8</font> <font color="Blue">.</font> from64
                        from64 <font color="Red">=</font> unfoldr <font color="Blue">(</font><font color="Red">\</font>k <font color="Red">-&gt;</font> Just <font color="Blue">(</font>k <font color="Blue">.&amp;.</font> <font color="Magenta">0xff</font><font color="Blue">,</font> k <font color="Blue">`shiftR`</font> <font color="Magenta">8</font><font color="Blue">)</font><font color="Blue">)</font>
                        </pre>
<p></font><br />
The first function takes a list of characters and converts them into a list of 64-bit words.  The second function reverses the process.  Ideally, this would be bit-width aware (in order to support different character encodings), and probably work on ByteStrings instead of [Char], but those are trivial changes.</p>
<p>With the exception of the tables for P-boxes, the only bit left is the S-box implementation.  The S-box process is slightly weird in DES.  Recall that we called a<em>pplySboxes </em>on a list of 6-bit words, <em>B_1</em> through <em>B_8</em>.  There are eight S-boxes, call them <em>S_1</em> through <em>S_8</em>.  Each <em>S_k</em> is a 4&#215;16 array of values.  The &#8220;substitution&#8221; part of the S-box comes from the fact that we substitute each <em>B_k</em> for <em>S_k[i][j]</em>, where i is the 2-bit value composed of the first and last bit of <em>B_k</em>, and j is the 4-bit value in the middle.  These substitutions are then combined to recreate a 56-bit value.  The above can be stated as follows:</p>
<p><font size="3">
<pre>applySboxes <font color="Red">::</font> <font color="Red">[</font>Word64<font color="Red">]</font> <font color="Red">-&gt;</font> Word64
applySboxes bs <font color="Red">=</font> foldr1 <font color="Blue">(</font><font color="Red">\</font>r k <font color="Red">-&gt;</font> <font color="Blue">(</font>k <font color="Blue">`shiftL`</font> <font color="Magenta">4</font><font color="Blue">)</font> <font color="Blue">.|.</font> r<font color="Blue">)</font>
                        <font color="Blue">(</font>apply bs sboxes <font color="Red">::</font> <font color="Red">[</font>Word64<font color="Red">]</font><font color="Blue">)</font>
                 <font color="Green"><u>where</u></font>
                    apply [] []     <font color="Red">=</font> []
                    apply <font color="Blue">(</font>b<font color="Red"><b>:</b></font>bs<font color="Blue">)</font> <font color="Blue">(</font>s<font color="Red"><b>:</b></font>ss<font color="Blue">)</font>
                               <font color="Red">=</font> <font color="Green"><u>let</u></font>
                                      i <font color="Red">=</font> <font color="Blue">(</font><font color="Blue">(</font>b <font color="Blue">.&amp;.</font> <font color="Magenta">0x20</font><font color="Blue">)</font> <font color="Blue">`shiftR`</font> <font color="Magenta">4</font><font color="Blue">)</font> <font color="Blue">.|.</font> <font color="Blue">(</font>b <font color="Blue">.&amp;.</font> <font color="Magenta">1</font><font color="Blue">)</font>
                                      j <font color="Red">=</font> <font color="Blue">(</font>b <font color="Blue">`shiftR`</font> <font color="Magenta">1</font><font color="Blue">)</font> <font color="Blue">.&amp;.</font> <font color="Magenta">0xf</font>
                                 <font color="Green"><u>in</u></font>
                                      <font color="Blue">(</font><font color="Blue">(</font>s <font color="Blue">!</font> i<font color="Blue">)</font> <font color="Blue">!</font> j<font color="Blue">)</font> <font color="Red"><b>:</b></font> <font color="Blue">(</font>apply bs ss<font color="Blue">)</font></pre>
<p></font></p>
<p>And, with the exception of the actual P-box and S-box data, we&#8217;re done.  The data is given below, but first, a quick test:</p>
<blockquote><p>*Crypto&gt; encryptDES 0x0E329232EA6D0D73 &#8220;This is an encrypted message&#8221;<br />
[13285721053034039710,15909830152601400232,6882462973091073748,1916557633710311361]<br />
*Crypto&gt; decryptDES 0x0E329232EA6D0D73 it<br />
&#8220;This is an encrypted message\NUL\NUL\NUL\NUL&#8221;</p></blockquote>
<p>Cool, no?  Here&#8217;s the really cool part:  Comparatively speaking, DES is not very secure at all.  Triple DES is very secure.  To turn our DES implementation into triple DES, we simply triple the key schedule:</p>
<p><font size="3">
<pre><font color="Blue">-- Encrypts a text message</font>
encryptDES3 keys <font color="Red">=</font> map <font color="Blue">(</font>encryptBlock3 keys<font color="Blue">)</font> <font color="Blue">.</font> preparePlaintext

<font color="Blue">-- Decrypts a DES-encoded message</font>
decryptDES3 keys <font color="Red">=</font> readPlaintext <font color="Blue">.</font> map <font color="Blue">(</font>decryptBlock3 keys<font color="Blue">)</font>

<font color="Blue">-- Encrypts a block</font>
encryptBlock3 <font color="Blue">(</font>k1<font color="Blue">,</font> k2<font color="Blue">,</font> k3<font color="Blue">)</font>
      <font color="Red">=</font> des <font color="Blue">(</font>keySchedule <font color="Blue">(</font>pc1 k1<font color="Blue">)</font> <font color="Blue">++</font> keySchedule <font color="Blue">(</font>pc1 k2<font color="Blue">)</font> <font color="Blue">++</font> keySchedule <font color="Blue">(</font>pc1 k3<font color="Blue">)</font><font color="Blue">)</font>

<font color="Blue">-- Decrypts a block</font>
decryptBlock3 <font color="Blue">(</font>k1<font color="Blue">,</font> k2<font color="Blue">,</font> k3<font color="Blue">)</font>
      <font color="Red">=</font> des <font color="Blue">(</font>reverse <font color="Blue">$</font> keySchedule <font color="Blue">(</font>pc1 k1<font color="Blue">)</font> <font color="Blue">++</font> keySchedule <font color="Blue">(</font>pc1 k2<font color="Blue">)</font> <font color="Blue">++</font> keySchedule <font color="Blue">(</font>pc1 k3<font color="Blue">)</font><font color="Blue">)</font>
                       </pre>
<p></font></p>
<p>Everything infers the number of rounds from the key schedule, so by pasting three different key schedules on top of each other, we get triple DES with no further work.  It&#8217;s trivial to actually generalize the encrypt&#8230;/decrypt&#8230; functions over any number of keys, although I don&#8217;t know whether the benefits start to erode after triple DES.  </p>
<p>So finally, the moment we&#8217;ve all been waiting for, the table data:</p>
<p><font size="2">
<pre><font color="Blue">-- Permuted Choice 1</font>
pc1 <font color="Red">::</font> Word64 <font color="Red">-&gt;</font> Word64
pc1 <font color="Red">=</font> permute <font color="Red">[</font><font color="Magenta">57</font><font color="Blue">,</font> <font color="Magenta">49</font><font color="Blue">,</font> <font color="Magenta">41</font><font color="Blue">,</font> <font color="Magenta">33</font><font color="Blue">,</font> <font color="Magenta">25</font><font color="Blue">,</font> <font color="Magenta">17</font><font color="Blue">,</font>  <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">58</font><font color="Blue">,</font> <font color="Magenta">50</font><font color="Blue">,</font> <font color="Magenta">42</font><font color="Blue">,</font> <font color="Magenta">34</font><font color="Blue">,</font> <font color="Magenta">26</font><font color="Blue">,</font> <font color="Magenta">18</font><font color="Blue">,</font>
               <font color="Magenta">10</font><font color="Blue">,</font>  <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">59</font><font color="Blue">,</font> <font color="Magenta">51</font><font color="Blue">,</font> <font color="Magenta">43</font><font color="Blue">,</font> <font color="Magenta">35</font><font color="Blue">,</font> <font color="Magenta">27</font><font color="Blue">,</font> <font color="Magenta">19</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font>  <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">60</font><font color="Blue">,</font> <font color="Magenta">52</font><font color="Blue">,</font> <font color="Magenta">44</font><font color="Blue">,</font> <font color="Magenta">36</font><font color="Blue">,</font>
               <font color="Magenta">63</font><font color="Blue">,</font> <font color="Magenta">55</font><font color="Blue">,</font> <font color="Magenta">47</font><font color="Blue">,</font> <font color="Magenta">39</font><font color="Blue">,</font> <font color="Magenta">31</font><font color="Blue">,</font> <font color="Magenta">23</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">62</font><font color="Blue">,</font> <font color="Magenta">54</font><font color="Blue">,</font> <font color="Magenta">46</font><font color="Blue">,</font> <font color="Magenta">38</font><font color="Blue">,</font> <font color="Magenta">30</font><font color="Blue">,</font> <font color="Magenta">22</font><font color="Blue">,</font>
               <font color="Magenta">14</font><font color="Blue">,</font>  <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">61</font><font color="Blue">,</font> <font color="Magenta">53</font><font color="Blue">,</font> <font color="Magenta">45</font><font color="Blue">,</font> <font color="Magenta">37</font><font color="Blue">,</font> <font color="Magenta">29</font><font color="Blue">,</font> <font color="Magenta">21</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font>  <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">28</font><font color="Blue">,</font> <font color="Magenta">20</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font>  <font color="Magenta">4</font><font color="Red">]</font>

<font color="Blue">-- Permuted Choice 2</font>
pc2 <font color="Red">::</font> Word64 <font color="Red">-&gt;</font> Word64
pc2 <font color="Red">=</font> permute <font color="Red">[</font><font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">17</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">24</font><font color="Blue">,</font>  <font color="Magenta">1</font><font color="Blue">,</font>  <font color="Magenta">5</font><font color="Blue">,</font>  <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">28</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font>  <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">21</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font>
               <font color="Magenta">23</font><font color="Blue">,</font> <font color="Magenta">19</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font>  <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">26</font><font color="Blue">,</font>  <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">16</font><font color="Blue">,</font>  <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">27</font><font color="Blue">,</font> <font color="Magenta">20</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font>  <font color="Magenta">2</font><font color="Blue">,</font>
               <font color="Magenta">41</font><font color="Blue">,</font> <font color="Magenta">52</font><font color="Blue">,</font> <font color="Magenta">31</font><font color="Blue">,</font> <font color="Magenta">37</font><font color="Blue">,</font> <font color="Magenta">47</font><font color="Blue">,</font> <font color="Magenta">55</font><font color="Blue">,</font> <font color="Magenta">30</font><font color="Blue">,</font> <font color="Magenta">40</font><font color="Blue">,</font> <font color="Magenta">51</font><font color="Blue">,</font> <font color="Magenta">45</font><font color="Blue">,</font> <font color="Magenta">33</font><font color="Blue">,</font> <font color="Magenta">48</font><font color="Blue">,</font>
               <font color="Magenta">44</font><font color="Blue">,</font> <font color="Magenta">49</font><font color="Blue">,</font> <font color="Magenta">39</font><font color="Blue">,</font> <font color="Magenta">56</font><font color="Blue">,</font> <font color="Magenta">34</font><font color="Blue">,</font> <font color="Magenta">53</font><font color="Blue">,</font> <font color="Magenta">46</font><font color="Blue">,</font> <font color="Magenta">42</font><font color="Blue">,</font> <font color="Magenta">50</font><font color="Blue">,</font> <font color="Magenta">36</font><font color="Blue">,</font> <font color="Magenta">29</font><font color="Blue">,</font> <font color="Magenta">32</font><font color="Red">]</font>

applyIp <font color="Red">::</font> Word64 <font color="Red">-&gt;</font> Word64
applyIp <font color="Red">=</font> permute <font color="Red">[</font><font color="Magenta">58</font><font color="Blue">,</font> <font color="Magenta">50</font><font color="Blue">,</font> <font color="Magenta">42</font><font color="Blue">,</font> <font color="Magenta">34</font><font color="Blue">,</font> <font color="Magenta">26</font><font color="Blue">,</font> <font color="Magenta">18</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">60</font><font color="Blue">,</font> <font color="Magenta">52</font><font color="Blue">,</font> <font color="Magenta">44</font><font color="Blue">,</font> <font color="Magenta">36</font><font color="Blue">,</font> <font color="Magenta">28</font><font color="Blue">,</font> <font color="Magenta">20</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font>
                   <font color="Magenta">62</font><font color="Blue">,</font> <font color="Magenta">54</font><font color="Blue">,</font> <font color="Magenta">46</font><font color="Blue">,</font> <font color="Magenta">38</font><font color="Blue">,</font> <font color="Magenta">30</font><font color="Blue">,</font> <font color="Magenta">22</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">64</font><font color="Blue">,</font> <font color="Magenta">56</font><font color="Blue">,</font> <font color="Magenta">48</font><font color="Blue">,</font> <font color="Magenta">40</font><font color="Blue">,</font> <font color="Magenta">32</font><font color="Blue">,</font> <font color="Magenta">24</font><font color="Blue">,</font> <font color="Magenta">16</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font>
                   <font color="Magenta">57</font><font color="Blue">,</font> <font color="Magenta">49</font><font color="Blue">,</font> <font color="Magenta">41</font><font color="Blue">,</font> <font color="Magenta">33</font><font color="Blue">,</font> <font color="Magenta">25</font><font color="Blue">,</font> <font color="Magenta">17</font><font color="Blue">,</font>  <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">59</font><font color="Blue">,</font> <font color="Magenta">51</font><font color="Blue">,</font> <font color="Magenta">43</font><font color="Blue">,</font> <font color="Magenta">35</font><font color="Blue">,</font> <font color="Magenta">27</font><font color="Blue">,</font> <font color="Magenta">19</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font>
                   <font color="Magenta">61</font><font color="Blue">,</font> <font color="Magenta">53</font><font color="Blue">,</font> <font color="Magenta">45</font><font color="Blue">,</font> <font color="Magenta">37</font><font color="Blue">,</font> <font color="Magenta">29</font><font color="Blue">,</font> <font color="Magenta">21</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">63</font><font color="Blue">,</font> <font color="Magenta">55</font><font color="Blue">,</font> <font color="Magenta">47</font><font color="Blue">,</font> <font color="Magenta">39</font><font color="Blue">,</font> <font color="Magenta">31</font><font color="Blue">,</font> <font color="Magenta">23</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Red">]</font>

applyFp <font color="Red">::</font> Word64 <font color="Red">-&gt;</font> Word64
applyFp <font color="Red">=</font> permute <font color="Red">[</font><font color="Magenta">40</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">48</font><font color="Blue">,</font> <font color="Magenta">16</font><font color="Blue">,</font> <font color="Magenta">56</font><font color="Blue">,</font> <font color="Magenta">24</font><font color="Blue">,</font> <font color="Magenta">64</font><font color="Blue">,</font> <font color="Magenta">32</font><font color="Blue">,</font> <font color="Magenta">39</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">47</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">55</font><font color="Blue">,</font> <font color="Magenta">23</font><font color="Blue">,</font> <font color="Magenta">63</font><font color="Blue">,</font> <font color="Magenta">31</font><font color="Blue">,</font>
                   <font color="Magenta">38</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">46</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">54</font><font color="Blue">,</font> <font color="Magenta">22</font><font color="Blue">,</font> <font color="Magenta">62</font><font color="Blue">,</font> <font color="Magenta">30</font><font color="Blue">,</font> <font color="Magenta">37</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">45</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">53</font><font color="Blue">,</font> <font color="Magenta">21</font><font color="Blue">,</font> <font color="Magenta">61</font><font color="Blue">,</font> <font color="Magenta">29</font><font color="Blue">,</font>
                   <font color="Magenta">36</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">44</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">52</font><font color="Blue">,</font> <font color="Magenta">20</font><font color="Blue">,</font> <font color="Magenta">60</font><font color="Blue">,</font> <font color="Magenta">28</font><font color="Blue">,</font> <font color="Magenta">35</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">43</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">51</font><font color="Blue">,</font> <font color="Magenta">19</font><font color="Blue">,</font> <font color="Magenta">59</font><font color="Blue">,</font> <font color="Magenta">27</font><font color="Blue">,</font>
                   <font color="Magenta">34</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">42</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">50</font><font color="Blue">,</font> <font color="Magenta">18</font><font color="Blue">,</font> <font color="Magenta">58</font><font color="Blue">,</font> <font color="Magenta">26</font><font color="Blue">,</font> <font color="Magenta">33</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">41</font><font color="Blue">,</font>  <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">49</font><font color="Blue">,</font> <font color="Magenta">17</font><font color="Blue">,</font> <font color="Magenta">57</font><font color="Blue">,</font> <font color="Magenta">25</font><font color="Red">]</font>

ebitSelect <font color="Red">::</font> Word64 <font color="Red">-&gt;</font> Word64
ebitSelect <font color="Red">=</font> permute <font color="Red">[</font><font color="Magenta">32</font><font color="Blue">,</font>  <font color="Magenta">1</font><font color="Blue">,</font>  <font color="Magenta">2</font><font color="Blue">,</font>  <font color="Magenta">3</font><font color="Blue">,</font>  <font color="Magenta">4</font><font color="Blue">,</font>  <font color="Magenta">5</font><font color="Blue">,</font>  <font color="Magenta">4</font><font color="Blue">,</font>  <font color="Magenta">5</font><font color="Blue">,</font>  <font color="Magenta">6</font><font color="Blue">,</font>  <font color="Magenta">7</font><font color="Blue">,</font>  <font color="Magenta">8</font><font color="Blue">,</font>  <font color="Magenta">9</font><font color="Blue">,</font>
                       <font color="Magenta">8</font><font color="Blue">,</font>  <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">16</font><font color="Blue">,</font> <font color="Magenta">17</font><font color="Blue">,</font>
                      <font color="Magenta">16</font><font color="Blue">,</font> <font color="Magenta">17</font><font color="Blue">,</font> <font color="Magenta">18</font><font color="Blue">,</font> <font color="Magenta">19</font><font color="Blue">,</font> <font color="Magenta">20</font><font color="Blue">,</font> <font color="Magenta">21</font><font color="Blue">,</font> <font color="Magenta">20</font><font color="Blue">,</font> <font color="Magenta">21</font><font color="Blue">,</font> <font color="Magenta">22</font><font color="Blue">,</font> <font color="Magenta">23</font><font color="Blue">,</font> <font color="Magenta">24</font><font color="Blue">,</font> <font color="Magenta">25</font><font color="Blue">,</font>
                      <font color="Magenta">24</font><font color="Blue">,</font> <font color="Magenta">25</font><font color="Blue">,</font> <font color="Magenta">26</font><font color="Blue">,</font> <font color="Magenta">27</font><font color="Blue">,</font> <font color="Magenta">28</font><font color="Blue">,</font> <font color="Magenta">29</font><font color="Blue">,</font> <font color="Magenta">28</font><font color="Blue">,</font> <font color="Magenta">29</font><font color="Blue">,</font> <font color="Magenta">30</font><font color="Blue">,</font> <font color="Magenta">31</font><font color="Blue">,</font> <font color="Magenta">32</font><font color="Blue">,</font>  <font color="Magenta">1</font><font color="Red">]</font>

pPerm <font color="Red">::</font> Word64 <font color="Red">-&gt;</font> Word64
pPerm <font color="Red">=</font> permute <font color="Red">[</font><font color="Magenta">16</font><font color="Blue">,</font>  <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">20</font><font color="Blue">,</font> <font color="Magenta">21</font><font color="Blue">,</font> <font color="Magenta">29</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">28</font><font color="Blue">,</font> <font color="Magenta">17</font><font color="Blue">,</font>  <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">23</font><font color="Blue">,</font> <font color="Magenta">26</font><font color="Blue">,</font>  <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">18</font><font color="Blue">,</font> <font color="Magenta">31</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font>
                  <font color="Magenta">2</font><font color="Blue">,</font>  <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">24</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">32</font><font color="Blue">,</font> <font color="Magenta">27</font><font color="Blue">,</font>  <font color="Magenta">3</font><font color="Blue">,</font>  <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">19</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">30</font><font color="Blue">,</font>  <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">22</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font>  <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">25</font><font color="Red">]</font>

sboxes <font color="Red">::</font> <font color="Red">[</font>Array Word64 <font color="Blue">(</font>Array Word64 Word64<font color="Blue">)</font><font color="Red">]</font>
sboxes <font color="Red">=</font> map <font color="Blue">(</font>listArray <font color="Blue">(</font><font color="Magenta">0</font><font color="Blue">,</font><font color="Magenta">3</font><font color="Blue">)</font> <font color="Blue">.</font> map <font color="Blue">(</font>listArray <font color="Blue">(</font><font color="Magenta">0</font><font color="Blue">,</font><font color="Magenta">15</font><font color="Blue">)</font><font color="Blue">)</font><font color="Blue">)</font>
   <font color="Blue">-- S-Box 1:</font>
   <font color="Red">[</font><font color="Red">[</font><font color="Red">[</font><font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Red">]</font><font color="Red">]</font><font color="Blue">,</font>

   <font color="Blue">-- S-Box 2:</font>
    <font color="Red">[</font><font color="Red">[</font><font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Red">]</font><font color="Red">]</font><font color="Blue">,</font>

   <font color="Blue">-- S-Box 3:</font>
    <font color="Red">[</font><font color="Red">[</font><font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Red">]</font><font color="Red">]</font><font color="Blue">,</font>

   <font color="Blue">-- S-Box 4:</font>
    <font color="Red">[</font><font color="Red">[</font><font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Red">]</font><font color="Red">]</font><font color="Blue">,</font>

   <font color="Blue">-- S-Box 5:</font>
    <font color="Red">[</font><font color="Red">[</font><font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Red">]</font><font color="Red">]</font><font color="Blue">,</font>

   <font color="Blue">-- S-Box 6:</font>
    <font color="Red">[</font><font color="Red">[</font><font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Red">]</font><font color="Red">]</font><font color="Blue">,</font>

   <font color="Blue">-- S-Box 7:</font>
    <font color="Red">[</font><font color="Red">[</font><font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Red">]</font><font color="Red">]</font><font color="Blue">,</font>

   <font color="Blue">-- S-Box 8:</font>
    <font color="Red">[</font><font color="Red">[</font><font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Red">]</font><font color="Blue">,</font>
     <font color="Red">[</font><font color="Magenta">2</font><font color="Blue">,</font> <font color="Magenta">1</font><font color="Blue">,</font> <font color="Magenta">14</font><font color="Blue">,</font> <font color="Magenta">7</font><font color="Blue">,</font> <font color="Magenta">4</font><font color="Blue">,</font> <font color="Magenta">10</font><font color="Blue">,</font> <font color="Magenta">8</font><font color="Blue">,</font> <font color="Magenta">13</font><font color="Blue">,</font> <font color="Magenta">15</font><font color="Blue">,</font> <font color="Magenta">12</font><font color="Blue">,</font> <font color="Magenta">9</font><font color="Blue">,</font> <font color="Magenta">0</font><font color="Blue">,</font> <font color="Magenta">3</font><font color="Blue">,</font> <font color="Magenta">5</font><font color="Blue">,</font> <font color="Magenta">6</font><font color="Blue">,</font> <font color="Magenta">11</font><font color="Red">]</font><font color="Red">]</font><font color="Red">]</font> 
</pre>
<p></font></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/vandreev.wordpress.com/27/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/vandreev.wordpress.com/27/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vandreev.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vandreev.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vandreev.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vandreev.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/vandreev.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/vandreev.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/vandreev.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/vandreev.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vandreev.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vandreev.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vandreev.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vandreev.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vandreev.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vandreev.wordpress.com/27/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vandreev.wordpress.com&amp;blog=588099&amp;post=27&amp;subd=vandreev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://vandreev.wordpress.com/2007/06/18/feistel-ciphers-and-des-in-haskell/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cf2cbce8068888f4f48415f1735b0ce4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vandreev</media:title>
		</media:content>
	</item>
		<item>
		<title>Arithmetic coding</title>
		<link>http://vandreev.wordpress.com/2007/01/07/arithmetic-coding/</link>
		<comments>http://vandreev.wordpress.com/2007/01/07/arithmetic-coding/#comments</comments>
		<pubDate>Sun, 07 Jan 2007 11:58:17 +0000</pubDate>
		<dc:creator>Vlad Andreev</dc:creator>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Mathematics]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://vandreev.wordpress.com/2007/01/07/arithmetic-coding/</guid>
		<description><![CDATA[I really did not intend this blog to become a repository of Haskell code snippets, but I&#8217;ve been rather busy as of late, and writing toy code while waiting for a compile to finish has somehow become my primary means of entertainment. Here is the latest. Arithmetic coding is a remarkably simple and clever thing. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vandreev.wordpress.com&amp;blog=588099&amp;post=25&amp;subd=vandreev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I really did not intend this blog to become a repository of Haskell code snippets, but I&#8217;ve been rather busy as of late, and writing toy code while waiting for a compile to finish has somehow become my primary means of entertainment.  Here is the latest.</p>
<p>Arithmetic coding is a remarkably simple and clever thing.  The idea is that given some half-open interval [a,b), that is, the interval a &lt;= x &lt; b, we can partition it into half-open subintervals, such that there is one subinterval per character in the message to be encoded, and the lengths correspond to the character frequencies multiplied by b-a.  The same procedure is applied, recursively, to each subinterval, resulting in an infinite hierarchy of coverings of the original interval -- call it S.  Now, if we throw a rock at S, record the point where it hit, and follow the interval hierarchy, we'll come up with a unique infinite string of characters.</p>
<p>To construct the actual encoding, set S to [0,1), and find out which subinterval S_1 the first character of the message falls into.  For the second character, let S_2 be the appropriate subinterval of S_1, for the third character, let S_3 be the appropriate subinterval of S_2, and so on;  if we repeat this procedure as many times as there are characters, we'll arrive at some interval S_n.  Numbers that fall in this interval have a useful property:  given any such number, call it x, we have x in S_{n-1} (since x is in S_n, and S_n is a subinterval of S_{n-1}), x in S_{n-2} by the same argument, and, by induction, in every subinterval that we picked while encoding the message.  Any such x, therefore, uniquely encodes the message:  to decode, simply follow the hierarchy.</p>
<p><font face="Courier New"><br />
*Arith&gt; encodeToStream "encodeToStream returns a pair of lists of bytes, represe<br />
nting the numerator and denominator, respectively."<br />
([174,77,70,217,88,196,42,26,75,253,160,72,114,92,77,135,32,165,50,80,55,77,233,<br />
103,172,90,177,4],[211,29,119,249,50,167,209,90,128,245,114,158,13,236,212,196,1<br />
1,81,64,169,125,254,83,235,75,2,30,13])</p>
<p>*Arith&gt; encode &#8220;testing testing testing&#8221;<br />
(23,[(' ',(0%1,2%23)),('e',(2%23,5%23)),('g',(5%23,8%23)),('i',(8%23,11%23)),('n<br />
',(11%23,14%23)),('s',(14%23,17%23)),('t',(17%23,1%1))],3430733247%4363211066)</p>
<p>*Arith&gt; (decode . encode . decode . encode) &#8220;testing testing testing&#8221;<br />
&#8220;testing testing testing&#8221;</p>
<p>*Arith&gt; encode (concat $ replicate 500 &#8220;abcd&#8221;)<br />
(2000,[('a',(0%1,1%4)),('b',(1%4,1%2)),('c',(1%2,3%4)),('d',(3%4,1%1))],9%85)<br />
</font></p>
<p>The last test shows the output of &#8216;encode&#8217; : the length of the message is 2000 characters, this is followed by character distributions (in a practical setting, frequencies would be returned instead of explicit intervals), and finally the encoded message.  The entire 2000 byte string is encoded in the fraction 9/85.</p>
<p>Toy code follows.  As mentioned earlier, &#8216;encodeToStream&#8217; is a helper function that breaks the fraction into a pair of lists of bytes;  the actual encoder and decoder consist of just &#8216;encode&#8217;, &#8216;decode&#8217; and &#8216;freqRanges&#8217;, weighing in at 23 lines of code including type annotations and line breaks.  Gotta love Haskell.</p>
<p><font size="2"></p>
<pre><font color="Blue">{</font><font color="Blue">-#</font> OPTIONS <font color="Blue">-</font>fglasgow<font color="Blue">-</font>exts <font color="Blue">#-</font><font color="Blue">}</font>
<u><font color="Green">module</font></u> Arith <u><font color="Green">where</font></u>

<u><font color="Green">import</font></u> Ratio
<u><font color="Green">import</font></u> Data<font color="Blue">.</font>List
<u><font color="Green">import</font></u> Data<font color="Blue">.</font>Maybe
<u><font color="Green">import</font></u> Data<font color="Blue">.</font>Char
<u><font color="Green">import</font></u> qualified Data<font color="Blue">.</font>Map <u><font color="Green">as</font></u> M

<u><font color="Green">type</font></u> RangeMap k a <font color="Red">=</font> <font color="Red">[</font><font color="Blue">(</font>k<font color="Blue">,</font> <font color="Blue">(</font>Ratio a<font color="Blue">,</font> Ratio a<font color="Blue">)</font><font color="Blue">)</font><font color="Red">]</font>

encode <font color="Red">::</font> <font color="Blue">(</font>Ord k<font color="Blue">,</font> Integral a<font color="Blue">)</font> <font color="Red">=&gt;</font> <font color="Red">[</font>k<font color="Red">]</font> <font color="Red">-&gt;</font> <font color="Blue">(</font>Int<font color="Blue">,</font> RangeMap k a<font color="Blue">,</font> Rational<font color="Blue">)</font>
encode msg <font color="Red">=</font> <font color="Blue">(</font>length msg<font color="Blue">,</font> M<font color="Blue">.</font>assocs freqMap<font color="Blue">,</font> best <font color="Blue">$</font> foldl pair <font color="Blue">(</font><font color="Magenta">0</font><font color="Blue">,</font><font color="Magenta">1</font><font color="Blue">)</font> rmap<font color="Blue">)</font>
             <u><font color="Green">where</font></u>
                  freqMap <font color="Red">=</font> freqRanges msg
                  rmap <font color="Red">=</font> map <font color="Blue">(</font><font color="Red">&#92;</font>x <font color="Red">-&gt;</font> fromJust <font color="Blue">$</font> M<font color="Blue">.</font>lookup x freqMap<font color="Blue">)</font> msg

                  best <font color="Blue">(</font>a<font color="Blue">,</font>b<font color="Blue">)</font>                  <font color="Red">=</font> approxRational <font color="Blue">(</font><font color="Blue">(</font>b<font color="Blue">+</font>a<font color="Blue">)</font><font color="Blue">/</font><font color="Magenta">2</font><font color="Blue">)</font> <font color="Blue">(</font><font color="Blue">(</font>b<font color="Blue">-</font>a<font color="Blue">)</font><font color="Blue">/</font><font color="Magenta">2</font><font color="Blue">)</font>
                  pair <font color="Blue">(</font>a<font color="Blue">,</font>b<font color="Blue">)</font> <font color="Blue">(</font>x<font color="Blue">,</font>y<font color="Blue">)</font>            <font color="Red">=</font> <font color="Blue">(</font><font color="Blue">(</font>b<font color="Blue">-</font>a<font color="Blue">)</font><font color="Blue">*</font>x<font color="Blue">+</font>a<font color="Blue">,</font> <font color="Blue">(</font>b<font color="Blue">-</font>a<font color="Blue">)</font><font color="Blue">*</font>y<font color="Blue">+</font>a<font color="Blue">)</font>

decode <font color="Red">::</font> <font color="Blue">(</font>Ord a<font color="Blue">,</font> Integral a<font color="Blue">)</font> <font color="Red">=&gt;</font> <font color="Blue">(</font>Int<font color="Blue">,</font> RangeMap k a<font color="Blue">,</font> Ratio a<font color="Blue">)</font> <font color="Red">-&gt;</font> <font color="Red">[</font>k<font color="Red">]</font>
decode <font color="Blue">(</font>n<font color="Blue">,</font> freqs<font color="Blue">,</font> code<font color="Blue">)</font> <font color="Red">=</font> take n <font color="Blue">$</font> decode' code
                          <u><font color="Green">where</font></u>
                              findChar x <font color="Red">=</font> find <font color="Blue">(</font><font color="Red">&#92;</font><font color="Blue">(</font>c<font color="Blue">,</font> <font color="Blue">(</font>a<font color="Blue">,</font>b<font color="Blue">)</font><font color="Blue">)</font> <font color="Red">-&gt;</font> <font color="Blue">(</font>x <font color="Blue">&gt;=</font> a<font color="Blue">)</font> <font color="Blue">&amp;&amp;</font> <font color="Blue">(</font>x <font color="Blue">&lt;</font> b<font color="Blue">)</font><font color="Blue">)</font> freqs
                              decode' code <font color="Red">=</font> <u><font color="Green">let</font></u>
                                                <font color="Blue">(</font>Just <font color="Blue">(</font>c<font color="Blue">,</font> <font color="Blue">(</font>x<font color="Blue">,</font> y<font color="Blue">)</font><font color="Blue">)</font><font color="Blue">)</font> <font color="Red">=</font> findChar code
                                             <u><font color="Green">in</font></u>
                                                 c <b><font color="Red">:</font></b> decode' <font color="Blue">(</font><font color="Blue">(</font>code<font color="Blue">-</font>x<font color="Blue">)</font> <font color="Blue">/</font> <font color="Blue">(</font>y<font color="Blue">-</font>x<font color="Blue">)</font><font color="Blue">)</font>

freqRanges <font color="Red">::</font> <font color="Blue">(</font>Ord k<font color="Blue">,</font> Integral a<font color="Blue">)</font> <font color="Red">=&gt;</font> <font color="Red">[</font>k<font color="Red">]</font> <font color="Red">-&gt;</font> M<font color="Blue">.</font>Map k <font color="Blue">(</font>Ratio a<font color="Blue">,</font> Ratio a<font color="Blue">)</font>
freqRanges str <font color="Red">=</font> snd <font color="Blue">$</font> M<font color="Blue">.</font>mapAccum <font color="Blue">(</font><font color="Red">&#92;</font>acc x <font color="Red">-&gt;</font> <font color="Blue">(</font>acc <font color="Blue">+</font> x<font color="Blue">,</font> <font color="Blue">(</font>acc<font color="Blue">,</font> acc <font color="Blue">+</font> x<font color="Blue">)</font><font color="Blue">)</font><font color="Blue">)</font> <font color="Magenta">0</font> freqs
                 <u><font color="Green">where</font></u>
                      freqs <font color="Red">=</font> M<font color="Blue">.</font>map <font color="Blue">(</font><font color="Red">&#92;</font>p <font color="Red">-&gt;</font> p <font color="Blue">%</font> total<font color="Blue">)</font> occurences
                      occurences <font color="Red">=</font> foldl <font color="Blue">(</font><font color="Red">&#92;</font>m c <font color="Red">-&gt;</font> M<font color="Blue">.</font>insertWith <font color="Blue">(</font><font color="Blue">+</font><font color="Blue">)</font> c <font color="Magenta">1</font> m<font color="Blue">)</font> M<font color="Blue">.</font>empty str
                      total <font color="Red">=</font> sum <font color="Blue">(</font>M<font color="Blue">.</font>elems occurences<font color="Blue">)</font>

encodeToStream msg <font color="Red">=</font> <u><font color="Green">let</font></u>
                        <font color="Blue">(</font>len<font color="Blue">,</font> freqs<font color="Blue">,</font> code<font color="Blue">)</font> <font color="Red">=</font> encode msg
                        <font color="Blue">(</font>num<font color="Blue">,</font> denom<font color="Blue">)</font> <font color="Red">=</font> <font color="Blue">(</font>numerator code<font color="Blue">,</font> denominator code<font color="Blue">)</font>
                        bytes n <font color="Red">=</font> unfoldr <font color="Blue">(</font><font color="Red">&#92;</font>k <font color="Red">-&gt;</font> <u><font color="Green">if</font></u> k <font color="Blue">==</font> <font color="Magenta">0</font> <u><font color="Green">then</font></u> Nothing <u><font color="Green">else</font></u> Just <font color="Blue">(</font>rem k <font color="Magenta">256</font><font color="Blue">,</font> quot k <font color="Magenta">256</font><font color="Blue">)</font><font color="Blue">)</font> n
                     <u><font color="Green">in</font></u>
                        <font color="Blue">(</font>bytes num<font color="Blue">,</font> bytes denom<font color="Blue">)</font>
</pre>
<p></font></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/vandreev.wordpress.com/25/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/vandreev.wordpress.com/25/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vandreev.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vandreev.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vandreev.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vandreev.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/vandreev.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/vandreev.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/vandreev.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/vandreev.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vandreev.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vandreev.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vandreev.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vandreev.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vandreev.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vandreev.wordpress.com/25/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vandreev.wordpress.com&amp;blog=588099&amp;post=25&amp;subd=vandreev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://vandreev.wordpress.com/2007/01/07/arithmetic-coding/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cf2cbce8068888f4f48415f1735b0ce4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vandreev</media:title>
		</media:content>
	</item>
		<item>
		<title>Quick and Dirty Theorem Prover.</title>
		<link>http://vandreev.wordpress.com/2006/12/24/quick-and-dirty-theorem-prover/</link>
		<comments>http://vandreev.wordpress.com/2006/12/24/quick-and-dirty-theorem-prover/#comments</comments>
		<pubDate>Sun, 24 Dec 2006 09:01:38 +0000</pubDate>
		<dc:creator>Vlad Andreev</dc:creator>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Mathematics]]></category>

		<guid isPermaLink="false">http://vandreev.wordpress.com/2006/12/24/quick-and-dirty-theorem-prover/</guid>
		<description><![CDATA[Wrote a very basic prover for theorems in propositional logic while waiting for a build to finish. Not terribly exciting, but should be relatively easy to extend to first-order logic and/or turn it into a constructive prover by adding a DPLL step. I&#8217;ve tested it on a proof by contradiction for the hypothetical syllogism ((a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vandreev.wordpress.com&amp;blog=588099&amp;post=24&amp;subd=vandreev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Wrote a very basic prover for theorems in propositional logic while waiting for a build to finish.  Not terribly exciting, but should be relatively easy to extend to first-order logic and/or turn it into a constructive prover by adding a DPLL step.  I&#8217;ve tested it on a proof by contradiction for the hypothetical syllogism ((a =&gt; b) /\ (b =&gt; c)) =&gt; (a =&gt; c), and on some common inference rules.  These are the tests:</p>
<p><font size="2"></p>
<pre>a <font color="Red">=</font> LSym <font color="Magenta">"a"</font><font color="Blue">;</font> b <font color="Red">=</font> LSym <font color="Magenta">"b"</font><font color="Blue">;</font> c <font color="Red">=</font> LSym <font color="Magenta">"c"</font><font color="Blue">;</font> p <font color="Red">=</font> LSym <font color="Magenta">"p"</font><font color="Blue">;</font> q <font color="Red">=</font> LSym <font color="Magenta">"q"</font><font color="Blue">;</font> r <font color="Red">=</font> LSym <font color="Magenta">"r"</font><font color="Blue">;</font> s <font color="Red">=</font> LSym <font color="Magenta">"s"</font>

test <font color="Red">=</font> LNot <font color="Blue">$</font> <font color="Blue">(</font><font color="Blue">(</font>a <b><font color="Red">:-&gt;</font></b> b<font color="Blue">)</font> <b><font color="Red">:&amp;</font></b> <font color="Blue">(</font>b <b><font color="Red">:-&gt;</font></b> c<font color="Blue">)</font><font color="Blue">)</font> <b><font color="Red">:-&gt;</font></b> <font color="Blue">(</font>a <b><font color="Red">:-&gt;</font></b> c<font color="Blue">)</font>              <font color="Blue">-- contradiction</font>
test_ModusPonens    <font color="Red">=</font> <font color="Blue">(</font><font color="Blue">(</font>p <b><font color="Red">:-&gt;</font></b> q<font color="Blue">)</font> <b><font color="Red">:&amp;</font></b> p<font color="Blue">)</font>                            <font color="Blue">-- q</font>
test_ModusTollens   <font color="Red">=</font> <font color="Blue">(</font><font color="Blue">(</font>p <b><font color="Red">:-&gt;</font></b> q<font color="Blue">)</font> <b><font color="Red">:&amp;</font></b> <font color="Blue">(</font>LNot q<font color="Blue">)</font><font color="Blue">)</font>                     <font color="Blue">-- not p</font>
test_HypSyllogism   <font color="Red">=</font> <font color="Blue">(</font><font color="Blue">(</font>p <b><font color="Red">:-&gt;</font></b> q<font color="Blue">)</font> <b><font color="Red">:&amp;</font></b> <font color="Blue">(</font>q <b><font color="Red">:-&gt;</font></b> r<font color="Blue">)</font><font color="Blue">)</font>                    <font color="Blue">-- p -&gt; r</font>
test_DisSyllogism   <font color="Red">=</font> <font color="Blue">(</font><font color="Blue">(</font>p <b><font color="Red">:|</font></b> q<font color="Blue">)</font> <b><font color="Red">:&amp;</font></b> <font color="Blue">(</font>LNot p<font color="Blue">)</font><font color="Blue">)</font>                      <font color="Blue">-- q</font>
test_ConstrDilemma  <font color="Red">=</font> <font color="Blue">(</font><font color="Blue">(</font>p <b><font color="Red">:-&gt;</font></b> q<font color="Blue">)</font> <b><font color="Red">:&amp;</font></b> <font color="Blue">(</font>r <b><font color="Red">:-&gt;</font></b> s<font color="Blue">)</font> <b><font color="Red">:&amp;</font></b> <font color="Blue">(</font>p <b><font color="Red">:|</font></b> r<font color="Blue">)</font><font color="Blue">)</font>        <font color="Blue">-- q or s</font>
test_DestrDilemma   <font color="Red">=</font> <font color="Blue">(</font><font color="Blue">(</font>p <b><font color="Red">:-&gt;</font></b> q<font color="Blue">)</font> <b><font color="Red">:&amp;</font></b> <font color="Blue">(</font>r <b><font color="Red">:-&gt;</font></b> s<font color="Blue">)</font> <b><font color="Red">:&amp;</font></b> <font color="Blue">(</font><font color="Blue">(</font>LNot q<font color="Blue">)</font> <b><font color="Red">:|</font></b> <font color="Blue">(</font>LNot s<font color="Blue">)</font><font color="Blue">)</font><font color="Blue">)</font>     <font color="Blue">-- not p or not r</font>

tests <font color="Red">=</font> map <font color="Blue">(</font>pprint <font color="Blue">.</font> resolve <font color="Blue">.</font> compile<font color="Blue">)</font> <font color="Red">[</font>test<font color="Blue">,</font> test_ModusPonens<font color="Blue">,</font> test_ModusTollens<font color="Blue">,</font> test_HypSyllogism<font color="Blue">,</font> test_DisSyllogism<font color="Blue">,</font> test_ConstrDilemma<font color="Blue">,</font> test_DestrDilemma<font color="Red">]</font>
</pre>
<p></font></p>
<p>The algorithm consists of bringing the expression into <a href="http://en.wikipedia.org/wiki/Conjunctive_normal_form">conjunctive normal form</a> (I&#8217;m simultaneously compiling into a desugared core language), and applying a set of resolution steps.  The resolution steps consist of trivially rejecting things like A \/ ~A \/ &#8230;, simplifying things like A \/ B \/ A \/ &#8230;, and merging expressions of the form (P \/ A \/ &#8230;) /\ (~P \/ B \/ &#8230;) into A \/ B \/ &#8230; .  The process clearly terminates;  when it does, the resulting expression is what has been inferred from the conjecture.  If the result is a contradiction, then the conjecture is false, if the result is empty then nothing can be inferred, and if it&#8217;s non-empty, then we&#8217;ve proven an inference rule.</p>
<p>Obligatory GHCi session:<br />
<font face="Courier New"><br />
*Main&gt; pprint (resolve $ compile (LNot $ ((a :-&gt; b) :&amp; (b :-&gt; c)) :-&gt; (a :-&gt; c)))<br />
&#8220;(c &amp; ~c)&#8221;<br />
*Main&gt; pprint (resolve $ compile ((p :-&gt; q) :&amp; (LNot q)))<br />
&#8220;~p&#8221;<br />
</font></p>
<p>The code is below.  Haven&#8217;t run into any bugs, but I haven&#8217;t tested it extensively.<br />
<span id="more-24"></span><br />
<font size="2"></p>
<pre><u><font color="Green">module</font></u> Main <u><font color="Green">where</font></u>

<u><font color="Green">import</font></u> Data<font color="Blue">.</font>List
<u><font color="Green">import</font></u> Data<font color="Blue">.</font>Maybe

<font color="Blue">-- Expressions</font>
<u><font color="Green">data</font></u> Expr a <font color="Red">=</font> LSym a
            <font color="Red">|</font> LNot <font color="Blue">(</font>Expr a<font color="Blue">)</font>
            <font color="Red">|</font> <font color="Blue">(</font>Expr a<font color="Blue">)</font> <b><font color="Red">:&amp;</font></b> <font color="Blue">(</font>Expr a<font color="Blue">)</font>
            <font color="Red">|</font> <font color="Blue">(</font>Expr a<font color="Blue">)</font> <b><font color="Red">:|</font></b> <font color="Blue">(</font>Expr a<font color="Blue">)</font>
            <font color="Red">|</font> <font color="Blue">(</font>Expr a<font color="Blue">)</font> <b><font color="Red">:-&gt;</font></b> <font color="Blue">(</font>Expr a<font color="Blue">)</font>
            <u><font color="Green">deriving</font></u> <font color="Blue">(</font>Show<font color="Blue">,</font> Eq<font color="Blue">)</font>

<font color="Blue">-- Minimal core language</font>
<u><font color="Green">data</font></u> CExpr a <font color="Red">=</font> CSym a
             <font color="Red">|</font> CNot <font color="Blue">(</font>CExpr a<font color="Blue">)</font>
             <font color="Red">|</font> CAnd <font color="Red">[</font>CExpr a<font color="Red">]</font>
             <font color="Red">|</font> COr <font color="Red">[</font>CExpr a<font color="Red">]</font>
             <u><font color="Green">deriving</font></u> <font color="Blue">(</font>Show<font color="Blue">,</font> Eq<font color="Blue">,</font> Ord<font color="Blue">)</font>

<font color="Blue">-- Desugars and transforms to the core language</font>
compile <font color="Blue">(</font>LSym x<font color="Blue">)</font>             <font color="Red">=</font> CSym x
compile <font color="Blue">(</font>a <b><font color="Red">:-&gt;</font></b> b<font color="Blue">)</font>            <font color="Red">=</font> COr <font color="Red">[</font>compile <font color="Blue">$</font> LNot a<font color="Blue">,</font> compile b<font color="Red">]</font>
compile <font color="Blue">(</font>LNot a<font color="Blue">)</font>             <font color="Red">=</font> CNot <font color="Blue">(</font>compile a<font color="Blue">)</font>
compile <font color="Blue">(</font>a <b><font color="Red">:|</font></b> b<font color="Blue">)</font>             <font color="Red">=</font> COr <font color="Red">[</font>compile a<font color="Blue">,</font> compile b<font color="Red">]</font>
compile <font color="Blue">(</font>a <b><font color="Red">:&amp;</font></b> b<font color="Blue">)</font>             <font color="Red">=</font> CAnd <font color="Red">[</font>compile a<font color="Blue">,</font> compile b<font color="Red">]</font>

<font color="Blue">-- Transforms to CNF</font>
toCNF <font color="Blue">(</font>CSym a<font color="Blue">)</font>               <font color="Red">=</font> <font color="Blue">(</font>CSym a<font color="Blue">)</font>
toCNF <font color="Blue">(</font>CNot <font color="Blue">(</font>COr ts<font color="Blue">)</font><font color="Blue">)</font>        <font color="Red">=</font> toCNF <font color="Blue">$</font> CAnd <font color="Blue">(</font>map CNot ts<font color="Blue">)</font>
toCNF <font color="Blue">(</font>CNot <font color="Blue">(</font>CAnd ts<font color="Blue">)</font><font color="Blue">)</font>       <font color="Red">=</font> toCNF <font color="Blue">$</font> COr <font color="Blue">(</font>map CNot ts<font color="Blue">)</font>
toCNF <font color="Blue">(</font>CNot a<font color="Blue">)</font>               <font color="Red">=</font> CNot <font color="Blue">(</font>toCNF a<font color="Blue">)</font>
toCNF <font color="Blue">(</font>COr ts<font color="Blue">)</font>               <font color="Red">=</font> <u><font color="Green">let</font></u>
                                      isConj x <font color="Red">=</font> <u><font color="Green">case</font></u> x <u><font color="Green">of</font></u> <font color="Blue">(</font>CAnd <u><font color="Green">_</font></u><font color="Blue">)</font> <font color="Red">-&gt;</font> True<font color="Blue">;</font> <u><font color="Green">_</font></u> <font color="Red">-&gt;</font> False
                                      conj <font color="Red">=</font> find isConj ts
                                      terms <font color="Red">=</font> delete <font color="Blue">(</font>fromJust conj<font color="Blue">)</font> ts
                               <u><font color="Green">in</font></u> <u><font color="Green">case</font></u> conj <u><font color="Green">of</font></u>
                                      Nothing            <font color="Red">-&gt;</font> COr <font color="Blue">(</font>map toCNF ts<font color="Blue">)</font>
                                      Just <font color="Blue">(</font>CAnd e<font color="Blue">)</font>      <font color="Red">-&gt;</font> toCNF <font color="Blue">(</font>CAnd <font color="Blue">$</font> map <font color="Blue">(</font><font color="Red">\</font>t <font color="Red">-&gt;</font> COr <font color="Blue">(</font>t<b><font color="Red">:</font></b>terms<font color="Blue">)</font><font color="Blue">)</font> e<font color="Blue">)</font>
toCNF <font color="Blue">(</font>CAnd ts<font color="Blue">)</font>              <font color="Red">=</font> CAnd <font color="Blue">(</font>map toCNF ts<font color="Blue">)</font>

<font color="Blue">-- Flattens nested connectives, etc.</font>
simplify <font color="Red">::</font> Ord a <font color="Red">=&gt;</font> CExpr a <font color="Red">-&gt;</font> CExpr a
simplify <font color="Blue">(</font>CAnd <font color="Red">[</font>t<font color="Red">]</font><font color="Blue">)</font>          <font color="Red">=</font> t
simplify <font color="Blue">(</font>COr <font color="Red">[</font>t<font color="Red">]</font><font color="Blue">)</font>           <font color="Red">=</font> t
simplify <font color="Blue">(</font>CAnd terms<font color="Blue">)</font>        <font color="Red">=</font> foldl simplifyAnd <font color="Blue">(</font>CAnd <font color="Red">[</font><font color="Red">]</font><font color="Blue">)</font> <font color="Blue">(</font>map simplify <font color="Blue">(</font>sort terms<font color="Blue">)</font><font color="Blue">)</font>
                               <u><font color="Green">where</font></u>
                                    simplifyAnd <font color="Blue">(</font>CAnd t<font color="Blue">)</font> <font color="Blue">(</font>CAnd t'<font color="Blue">)</font> <font color="Red">=</font> CAnd <font color="Blue">(</font>t <font color="Blue">++</font> t'<font color="Blue">)</font>
                                    simplifyAnd <font color="Blue">(</font>CAnd t<font color="Blue">)</font> x         <font color="Red">=</font> CAnd <font color="Blue">(</font>t <font color="Blue">++</font> <font color="Red">[</font>x<font color="Red">]</font><font color="Blue">)</font>

simplify <font color="Blue">(</font>COr terms<font color="Blue">)</font>         <font color="Red">=</font> foldl simplifyOr <font color="Blue">(</font>COr <font color="Red">[</font><font color="Red">]</font><font color="Blue">)</font> <font color="Blue">(</font>map simplify <font color="Blue">(</font>sort terms<font color="Blue">)</font><font color="Blue">)</font>
                               <u><font color="Green">where</font></u>
                                    simplifyOr <font color="Blue">(</font>COr t<font color="Blue">)</font> <font color="Blue">(</font>COr t'<font color="Blue">)</font>  <font color="Red">=</font> COr <font color="Blue">(</font>t <font color="Blue">++</font> t'<font color="Blue">)</font>
                                    simplifyOr <font color="Blue">(</font>COr t<font color="Blue">)</font> x         <font color="Red">=</font> COr <font color="Blue">(</font>t <font color="Blue">++</font> <font color="Red">[</font>x<font color="Red">]</font><font color="Blue">)</font>

simplify <font color="Blue">(</font>CNot <font color="Blue">(</font>CNot e<font color="Blue">)</font><font color="Blue">)</font>     <font color="Red">=</font> simplify e
simplify <font color="Blue">(</font>CNot e<font color="Blue">)</font>            <font color="Red">=</font> CNot <font color="Blue">(</font>simplify e<font color="Blue">)</font>
simplify e                   <font color="Red">=</font> e

<font color="Blue">-- Resolution step.  Applies reduction patterns as long as the expression is reducible.</font>
resolve e                    <font color="Red">=</font>  <u><font color="Green">if</font></u> e' <font color="Blue">==</font> e <u><font color="Green">then</font></u> e <u><font color="Green">else</font></u> resolve e'
                                <u><font color="Green">where</font></u>
                                        e' <font color="Red">=</font> <font color="Blue">(</font>toCNF <font color="Blue">.</font> simplify <font color="Blue">.</font> reduce<font color="Blue">)</font> e

<font color="Blue">-- Resolution patterns</font>

<font color="Blue">-- (P or A or ...) and (~P or B or ...) ==&gt; (A or B or ...)</font>
reduce <font color="Blue">(</font>CAnd terms<font color="Blue">)</font>          <font color="Red">=</font> <u><font color="Green">let</font></u>
                                    unify <font color="Red">[</font><font color="Red">]</font> <font color="Red">=</font> <font color="Red">[</font><font color="Red">]</font>
                                    unify <font color="Blue">(</font>t<b><font color="Red">:</font></b>t1<b><font color="Red">:</font></b>xs<font color="Blue">)</font> <font color="Red">=</font> <u><font color="Green">case</font></u> merge t t1 <u><font color="Green">of</font></u>
                                                                    Just e  <font color="Red">-&gt;</font> unify <font color="Blue">(</font>e<b><font color="Red">:</font></b>xs<font color="Blue">)</font>
                                                                    Nothing <font color="Red">-&gt;</font> <u><font color="Green">let</font></u>
                                                                                    <font color="Blue">(</font>first<b><font color="Red">:</font></b>rest<font color="Blue">)</font> <font color="Red">=</font> unify <font color="Blue">(</font>t<b><font color="Red">:</font></b>xs<font color="Blue">)</font>
                                                                               <u><font color="Green">in</font></u>
                                                                                    first <b><font color="Red">:</font></b> unify <font color="Blue">(</font>t1<b><font color="Red">:</font></b>rest<font color="Blue">)</font>
                                    unify <font color="Blue">(</font>x<b><font color="Red">:</font></b>xs<font color="Blue">)</font> <font color="Red">=</font> x <b><font color="Red">:</font></b> unify xs
                                    terms' <font color="Red">=</font> map reduce <font color="Blue">(</font>nub terms<font color="Blue">)</font>
                                <u><font color="Green">in</font></u>
                                    CAnd <font color="Blue">(</font>unify <font color="Blue">(</font>deleteFirstsBy <font color="Blue">(</font><font color="Blue">==</font><font color="Blue">)</font> terms' <font color="Red">[</font>COr <font color="Red">[</font><font color="Red">]</font><font color="Blue">,</font> CAnd <font color="Red">[</font><font color="Red">]</font><font color="Red">]</font><font color="Blue">)</font><font color="Blue">)</font>

<font color="Blue">-- P or ~P or A ==&gt; [] and P or P ==&gt; P</font>
reduce <font color="Blue">(</font>COr terms<font color="Blue">)</font>           <font color="Red">=</font> COr <font color="Blue">(</font>map reduce <font color="Blue">(</font>nub <font color="Blue">(</font>nontrivial terms<font color="Blue">)</font><font color="Blue">)</font><font color="Blue">)</font>
                               <u><font color="Green">where</font></u>
                                    nontrivial <font color="Red">[</font><font color="Red">]</font>       <font color="Red">=</font> <font color="Red">[</font><font color="Red">]</font>
                                    nontrivial <font color="Blue">(</font>x<b><font color="Red">:</font></b>xs<font color="Blue">)</font>   <font color="Red">=</font> <u><font color="Green">if</font></u> any <font color="Blue">(</font>isNot x<font color="Blue">)</font> xs <u><font color="Green">then</font></u> <font color="Red">[</font><font color="Red">]</font> <u><font color="Green">else</font></u> x <b><font color="Red">:</font></b> nontrivial xs
reduce x                     <font color="Red">=</font> x

<font color="Blue">-- Helper functions</font>
cNot <font color="Blue">(</font>CNot x<font color="Blue">)</font> <font color="Red">=</font> x
cNot x <font color="Red">=</font> CNot x
isNot x y <font color="Red">=</font> x <font color="Blue">==</font> cNot y

<font color="Blue">-- Merges expressions of the form (P or A or ... ) and (~P or B or ... ) into A or B or ...</font>
merge <font color="Blue">(</font>COr t1<font color="Blue">)</font> <font color="Blue">(</font>COr t2<font color="Blue">)</font>       <font color="Red">=</font> <u><font color="Green">let</font></u>
                                    cancel <font color="Red">[</font><font color="Red">]</font> <u><font color="Green">_</font></u>         <font color="Red">=</font> <font color="Red">[</font><font color="Red">]</font>
                                    cancel <font color="Blue">(</font>x<b><font color="Red">:</font></b>xs<font color="Blue">)</font> ys    <font color="Red">=</font> <u><font color="Green">case</font></u> find <font color="Blue">(</font>isNot x<font color="Blue">)</font> ys <u><font color="Green">of</font></u>
                                                                Nothing <font color="Red">-&gt;</font> cancel xs ys
                                                                Just e  <font color="Red">-&gt;</font> x <b><font color="Red">:</font></b> cancel xs <font color="Blue">(</font>delete e ys<font color="Blue">)</font>

                                <u><font color="Green">in</font></u> <u><font color="Green">case</font></u> cancel t1 t2 <u><font color="Green">of</font></u>
                                    <font color="Red">[</font><font color="Red">]</font>          <font color="Red">-&gt;</font> Nothing
                                    xs          <font color="Red">-&gt;</font> Just <font color="Blue">(</font>COr <font color="Blue">$</font> <font color="Blue">(</font>t1 <font color="Blue">&#92;&#92;</font> xs<font color="Blue">)</font> <font color="Blue">++</font> <font color="Blue">(</font>t2 <font color="Blue">&#92;&#92;</font> <font color="Blue">(</font>map cNot xs<font color="Blue">)</font><font color="Blue">)</font><font color="Blue">)</font>

merge <font color="Blue">(</font>COr t<font color="Blue">)</font> e               <font color="Red">=</font> merge e <font color="Blue">(</font>COr t<font color="Blue">)</font>

merge e <font color="Blue">(</font>COr t<font color="Blue">)</font>               <font color="Red">=</font> find <font color="Blue">(</font>isNot e<font color="Blue">)</font> t <font color="Blue">&gt;&gt;=</font> <font color="Red">\</font>e' <font color="Red">-&gt;</font> Just <font color="Blue">$</font> COr <font color="Blue">(</font>delete e' t<font color="Blue">)</font>

merge e1 e2                   <font color="Red">=</font> Nothing

pprint <font color="Red">::</font> CExpr String <font color="Red">-&gt;</font> String
pprint <font color="Blue">(</font>CSym x<font color="Blue">)</font>         <font color="Red">=</font> x
pprint <font color="Blue">(</font>CNot t<font color="Blue">)</font>         <font color="Red">=</font> <font color="Magenta">"~"</font> <font color="Blue">++</font> pprint t
pprint <font color="Blue">(</font>COr ts<font color="Blue">)</font>         <font color="Red">=</font> <font color="Magenta">"("</font> <font color="Blue">++</font> concat <font color="Blue">(</font>intersperse <font color="Magenta">" | "</font> <font color="Blue">(</font>map pprint ts<font color="Blue">)</font><font color="Blue">)</font> <font color="Blue">++</font> <font color="Magenta">")"</font>
pprint <font color="Blue">(</font>CAnd ts<font color="Blue">)</font>        <font color="Red">=</font> <font color="Magenta">"("</font> <font color="Blue">++</font> concat <font color="Blue">(</font>intersperse <font color="Magenta">" &amp; "</font> <font color="Blue">(</font>map pprint ts<font color="Blue">)</font><font color="Blue">)</font> <font color="Blue">++</font> <font color="Magenta">")"</font>
</pre>
<p></font></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/vandreev.wordpress.com/24/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/vandreev.wordpress.com/24/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vandreev.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vandreev.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vandreev.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vandreev.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/vandreev.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/vandreev.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/vandreev.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/vandreev.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vandreev.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vandreev.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vandreev.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vandreev.wordpress.com/24/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vandreev.wordpress.com/24/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vandreev.wordpress.com/24/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vandreev.wordpress.com&amp;blog=588099&amp;post=24&amp;subd=vandreev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://vandreev.wordpress.com/2006/12/24/quick-and-dirty-theorem-prover/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cf2cbce8068888f4f48415f1735b0ce4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vandreev</media:title>
		</media:content>
	</item>
		<item>
		<title>How to talk to aliens.</title>
		<link>http://vandreev.wordpress.com/2006/12/08/how-do-you-talk-to-aliens/</link>
		<comments>http://vandreev.wordpress.com/2006/12/08/how-do-you-talk-to-aliens/#comments</comments>
		<pubDate>Sat, 09 Dec 2006 02:46:41 +0000</pubDate>
		<dc:creator>Vlad Andreev</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://vandreev.wordpress.com/2006/12/08/how-do-you-talk-to-aliens/</guid>
		<description><![CDATA[I came across this on someone&#8217;s blog about a week ago, unfortunately I can&#8217;t remember who it belonged to. I recall seeing the press release back in 99, the idea was to a) come up with a message to be broadcast in the direction of nearby stars, b) devise a universal but error-correcting way of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vandreev.wordpress.com&amp;blog=588099&amp;post=23&amp;subd=vandreev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I came across this on someone&#8217;s blog about a week ago, unfortunately I can&#8217;t remember who it belonged to.  I recall seeing the press release back in 99, the idea was to a) come up with a message to be broadcast in the direction of nearby stars, b) devise a universal but error-correcting way of encoding that message, and c) perform the actual broadcast.  What I didn&#8217;t see at the time was the actual message in a graphics format &#8212; interstellar communication aside, decoding it makes for a nice time waster.  I got to page 3 in about half an hour, before remembering that I&#8217;m in crunch mode and should probably be coding instead screwing around;  for the rest of us, <a href="http://www.matessa.org/~mike/dutil-dumas.html">here&#8217;s the site.</a></p>
<p>The press release makes for an interesting read as well.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/vandreev.wordpress.com/23/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/vandreev.wordpress.com/23/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vandreev.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vandreev.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vandreev.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vandreev.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/vandreev.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/vandreev.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/vandreev.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/vandreev.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vandreev.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vandreev.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vandreev.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vandreev.wordpress.com/23/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vandreev.wordpress.com/23/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vandreev.wordpress.com/23/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vandreev.wordpress.com&amp;blog=588099&amp;post=23&amp;subd=vandreev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://vandreev.wordpress.com/2006/12/08/how-do-you-talk-to-aliens/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cf2cbce8068888f4f48415f1735b0ce4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vandreev</media:title>
		</media:content>
	</item>
		<item>
		<title>Non-standard analysis, automatic differentiation, Haskell, and other stories.</title>
		<link>http://vandreev.wordpress.com/2006/12/04/non-standard-analysis-and-automatic-differentiation/</link>
		<comments>http://vandreev.wordpress.com/2006/12/04/non-standard-analysis-and-automatic-differentiation/#comments</comments>
		<pubDate>Mon, 04 Dec 2006 01:35:23 +0000</pubDate>
		<dc:creator>Vlad Andreev</dc:creator>
				<category><![CDATA[Mathematics]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://vandreev.wordpress.com/2006/12/04/non-standard-analysis-and-automatic-differentiation/</guid>
		<description><![CDATA[Having recently come across a method for automatic differentiation on sigfpe&#8217;s cornucopia of amazingly cool stuff masquerading as a blog, I decided to start playing around with it a little to see what might come out. So, let&#8217;s say we take the standard definition of the derivative, , look at it for a bit, and [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vandreev.wordpress.com&amp;blog=588099&amp;post=14&amp;subd=vandreev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Having recently come across a method for automatic differentiation on sigfpe&#8217;s <a href="http://sigfpe.blogspot.com/2005/07/automatic-differentiation.html">cornucopia of amazingly cool stuff masquerading as a blog</a>, I decided to start playing around with it a little to see what might come out.</p>
<p>So, let&#8217;s say we take the standard definition of the derivative,<br />
<img src='http://vandreev.files.wordpress.com/2006/12/lim_deriv.png' alt='lim_deriv.png' />,<br />
look at it for a bit, and decide that we don&#8217;t like the limit symbol, and that, in fact, we&#8217;re going to drop it entirely.  After rearranging, we would then obtain the weird-looking f(x) + d f&#8217;(x) = f(x+d), and, presumably, set out to find what d could possibly look like.</p>
<p>To this end, we might expand f(x+d) about x, which yields</p>
<p><img src='http://vandreev.files.wordpress.com/2006/12/f_expansion.png' alt='f_expansion.png' /></p>
<p>and, after subtracting f(x) + d f&#8217;(x) from both sides, degenerates into</p>
<p><img src='http://vandreev.files.wordpress.com/2006/12/d_expansion.png' alt='d_expansion.png' /></p>
<p>It appears that d^n should be zero for all n&gt;1.  To see this, we can plug in f(x) = e^x.  The coefficients of d^n become constants, and, dividing both sides by e^x, we obtain d^2/2! + d^3/3! + &#8230; = 0, which is the MacLaurin series for e^d with the first two terms missing, so e^d=d+1.  Ignoring, momentarily, the troublesome fact that this gives d=0 in the reals, we certainly at least have d^2=0 (pardon the handwaving).</p>
<p>But in order for f(x) + d f&#8217;(x) = f(x+d) to be a remotely interesting statement, we must also have d != 0, and we want d to be unique.  Given some structure whose objects we&#8217;d care to differentiate, we&#8217;re going to cheat a little, and extend it with the element d such that d != 0, but d^2 = 0.  Having allowed such a number, all the weirdness disappears, the equality f(x+d) = f(x) + d f&#8217;(x) holds, and we&#8217;re left with a sort of infinitesimal constant which we&#8217;re free to plug into random things.</p>
<p>To test whether this makes any sense, we might start by taking the quadratic Q(x) = c_2 x^2 + c_1 x + c_0, and computing Q(x+d):</p>
<p><img src='http://vandreev.files.wordpress.com/2006/12/quad.png' alt='quad.png' /></p>
<p>The derivative of Q(x) &#8220;fell out&#8221; into the coefficient of d.  How about e^{x+d}?</p>
<p><img src='http://vandreev.files.wordpress.com/2006/12/exp.png' alt='exp.png' /></p>
<p>Anything else?  Let&#8217;s see.  By the binomial theorem,<br />
<img src='http://vandreev.files.wordpress.com/2006/12/binom.png' alt='binom.png' />. </p>
<p>The d^{n-k} factor vanishes whenever n &gt;= k+2, so<br />
<img src='http://vandreev.files.wordpress.com/2006/12/power_rule.png' alt='power_rule.png' /></p>
<p>and we&#8217;ve just obtained the power law.  </p>
<p>Trigonometric functions:</p>
<p><img src='http://vandreev.files.wordpress.com/2006/12/sin_expansion.png' alt='sin_expansion.png' /></p>
<p>Using the power law experiment from earlier, we get<br />
<img src='http://vandreev.files.wordpress.com/2006/12/sin_deriv.png' alt='sin_deriv.png' /></p>
<p>Plotting coefficients of d along the vertical axis, and the reals along the horizontal, we get the unit circle, while exponential maps are lines through the origin, which is kind of cool in and out of itself.</p>
<p>Ratios:</p>
<p><img src='http://vandreev.files.wordpress.com/2006/12/recip_x.png' alt='recip_x.png' /></p>
<p>One useful thing here is that d is small enough to be in <em>any</em> radius of convergence, so we get logarithms &#8220;for free&#8221;:</p>
<p><img src='http://vandreev.files.wordpress.com/2006/12/log_deriv1.png' alt='log_deriv.png' /></p>
<p>So, what&#8217;s the point?  The point is that we automatically obtain the derivative as a side effect of any computation, since f(x+d) = f(x) + d f&#8217;(x).  In other words, by switching to <a href="http://en.wikipedia.org/wiki/Dual_number">dual numbers</a> (numbers of the form x+y d) for things that need to be differentiated (and making it transparent through operator overloading), we can ask for the derivative of any differentiable function we&#8217;ve ever defined, and it&#8217;ll be evaluated symbolically.</p>
<p>To that end, here&#8217;s the first approximation in Haskell.</p>
<p><font face="Courier New"><br />
module Diff where</p>
<p>data Diffable a = !a :+ a</p>
<p>funcPart :: Diffable a -&gt; a<br />
funcPart (x :+ x&#8217;) = x</p>
<p>diffPart :: Diffable a -&gt; a<br />
diffPart (x :+ x&#8217;) = x&#8217;</p>
<p>instance (RealFloat a) =&gt; Eq (Diffable a) where<br />
&nbsp;    (x :+ x&#8217;) == (y :+ y&#8217;)  = (x == y) &amp;&amp; (x&#8217; == y&#8217;)</p>
<p>instance (RealFloat a) =&gt; Show (Diffable a) where<br />
&nbsp;    show (x :+ x&#8217;) = show (x, x&#8217;)</p>
<p>instance (RealFloat a) =&gt; Num (Diffable a) where<br />
&nbsp;    (x :+ x&#8217;) + (y :+ y&#8217;)   = (x + y) :+ (x&#8217; + y&#8217;)<br />
&nbsp;    (x :+ x&#8217;) * (y :+ y&#8217;)   = (x * y) :+ (x&#8217; * y + y&#8217; * x)<br />
&nbsp;    abs (x :+ x&#8217;)            = if x &lt; 0 then ((-x) :+ (-x&#8217;)) else (x :+ x&#8217;)<br />
&nbsp;    signum (x :+ x&#8217;)        = (signum x) :+ 0<br />
&nbsp;    fromInteger x           = (fromInteger x) :+ 1</p>
<p>instance (RealFloat a) =&gt; Fractional (Diffable a) where<br />
&nbsp;    fromRational x          = (fromRational x) :+ 1<br />
&nbsp;    recip (x :+ x&#8217;)         = (recip x) :+ (negate x&#8217; / (x^2))</p>
<p>instance (RealFloat a) =&gt; Floating (Diffable a) where<br />
&nbsp;    pi                      = pi :+ 0<br />
&nbsp;    exp (x :+ x&#8217;)           = (exp x)   :+ (x&#8217; * exp x)<br />
&nbsp;    log (x :+ x&#8217;)           = (log x)   :+ (x&#8217; * recip x)<br />
&nbsp;    sin (x :+ x&#8217;)           = (sin x)   :+ (x&#8217; * cos x)<br />
&nbsp;    cos (x :+ x&#8217;)           = (cos x)   :+ (x&#8217; * (negate $ sin x))<br />
&nbsp;    sinh (x :+ x&#8217;)          = (sinh x)  :+ (x&#8217; * cosh x)<br />
&nbsp;    cosh (x :+ x&#8217;)          = (cosh x)  :+ (x&#8217; * sinh x)<br />
&nbsp;    asin (x :+ x&#8217;)          = (asin x)  :+ (x&#8217; / (sqrt $ 1-x^2))<br />
&nbsp;    acos (x :+ x&#8217;)          = (acos x)  :+ (x&#8217; / (negate (sqrt $ 1-x^2)))<br />
&nbsp;    atan (x :+ x&#8217;)          = (atan x)  :+ (x&#8217; / (x^2+1))<br />
&nbsp;    asinh (x :+ x&#8217;)         = (asinh x) :+ (x&#8217; / (sqrt $ x^2+1))<br />
&nbsp;    acosh (x :+ x&#8217;)         = (acosh x) :+ (x&#8217; / (negate (sqrt $ x^2-1)))<br />
&nbsp;    atanh (x :+ x&#8217;)         = (atanh x) :+ (x&#8217; / (1 &#8211; x^2))<br />
</font></p>
<p>And now let&#8217;s try a sample GHCI session:</p>
<p>Derivatives of x^2 for x in {0, 0.5, &#8230;, 5}:<br />
<font face="Courier New"><br />
*Diff&gt; map (diffPart . (^2) . fromRational) [0,0.5..5]<br />
[0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0]<br />
</font></p>
<p>Derivatives of cos^2 x + sin^2 x (should be identically zero):<br />
<font face="Courier New"><br />
*Diff&gt; map (diffPart . (\x -&gt; (cos x)^2 + (sin x)^2) . fromRational) [0..10]<br />
[0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0]<br />
</font></p>
<p>So there we go, AD in half a page of code.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/vandreev.wordpress.com/14/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/vandreev.wordpress.com/14/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vandreev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vandreev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vandreev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vandreev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/vandreev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/vandreev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/vandreev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/vandreev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vandreev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vandreev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vandreev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vandreev.wordpress.com/14/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vandreev.wordpress.com/14/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vandreev.wordpress.com/14/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vandreev.wordpress.com&amp;blog=588099&amp;post=14&amp;subd=vandreev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://vandreev.wordpress.com/2006/12/04/non-standard-analysis-and-automatic-differentiation/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cf2cbce8068888f4f48415f1735b0ce4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vandreev</media:title>
		</media:content>

		<media:content url="http://vandreev.files.wordpress.com/2006/12/lim_deriv.png" medium="image">
			<media:title type="html">lim_deriv.png</media:title>
		</media:content>

		<media:content url="http://vandreev.files.wordpress.com/2006/12/f_expansion.png" medium="image">
			<media:title type="html">f_expansion.png</media:title>
		</media:content>

		<media:content url="http://vandreev.files.wordpress.com/2006/12/d_expansion.png" medium="image">
			<media:title type="html">d_expansion.png</media:title>
		</media:content>

		<media:content url="http://vandreev.files.wordpress.com/2006/12/quad.png" medium="image">
			<media:title type="html">quad.png</media:title>
		</media:content>

		<media:content url="http://vandreev.files.wordpress.com/2006/12/exp.png" medium="image">
			<media:title type="html">exp.png</media:title>
		</media:content>

		<media:content url="http://vandreev.files.wordpress.com/2006/12/binom.png" medium="image">
			<media:title type="html">binom.png</media:title>
		</media:content>

		<media:content url="http://vandreev.files.wordpress.com/2006/12/power_rule.png" medium="image">
			<media:title type="html">power_rule.png</media:title>
		</media:content>

		<media:content url="http://vandreev.files.wordpress.com/2006/12/sin_expansion.png" medium="image">
			<media:title type="html">sin_expansion.png</media:title>
		</media:content>

		<media:content url="http://vandreev.files.wordpress.com/2006/12/sin_deriv.png" medium="image">
			<media:title type="html">sin_deriv.png</media:title>
		</media:content>

		<media:content url="http://vandreev.files.wordpress.com/2006/12/recip_x.png" medium="image">
			<media:title type="html">recip_x.png</media:title>
		</media:content>

		<media:content url="http://vandreev.files.wordpress.com/2006/12/log_deriv1.png" medium="image">
			<media:title type="html">log_deriv.png</media:title>
		</media:content>
	</item>
		<item>
		<title>Hello world!</title>
		<link>http://vandreev.wordpress.com/2006/12/03/hello-world/</link>
		<comments>http://vandreev.wordpress.com/2006/12/03/hello-world/#comments</comments>
		<pubDate>Sun, 03 Dec 2006 10:09:28 +0000</pubDate>
		<dc:creator>Vlad Andreev</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Codeland is now live.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vandreev.wordpress.com&amp;blog=588099&amp;post=1&amp;subd=vandreev&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Codeland is now live.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/vandreev.wordpress.com/1/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/vandreev.wordpress.com/1/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vandreev.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vandreev.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vandreev.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vandreev.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/vandreev.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/vandreev.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/vandreev.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/vandreev.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vandreev.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vandreev.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vandreev.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vandreev.wordpress.com/1/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vandreev.wordpress.com/1/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vandreev.wordpress.com/1/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vandreev.wordpress.com&amp;blog=588099&amp;post=1&amp;subd=vandreev&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://vandreev.wordpress.com/2006/12/03/hello-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/cf2cbce8068888f4f48415f1735b0ce4?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">vandreev</media:title>
		</media:content>
	</item>
	</channel>
</rss>
