<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Training Epoch]]></title>
  <link href="http://vikhyat.net/blog//atom.xml" rel="self"/>
  <link href="http://vikhyat.net/blog//"/>
  <updated>2012-03-18T20:37:13+05:30</updated>
  <id>http://vikhyat.net/blog//</id>
  <author>
    <name><![CDATA[Vikhyat Korrapati]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Animus Introduction]]></title>
    <link href="http://vikhyat.net/blog//archives/2012/01/28/animus-introduction/"/>
    <updated>2012-01-28T13:57:00+05:30</updated>
    <id>http://vikhyat.net/blog//archives/2012/01/28/animus-introduction</id>
    <content type="html"><![CDATA[<p>This post will get you started with the contest Animus. The goal is to write a bot that will play the game &#8220;Dots and Boxes&#8221;.</p>
<p><!-- more --></p>
<p>In this post I will assume that you understand the game. If you don&#8217;t, please read <a href="http://exodia.in/events/online/animus/#game_description">this page</a> and come back.</p>
<h3>Technical Details</h3>
<p>From here on, the term &#8220;size of the board&#8221; will always mean the number of dots along each edge, not the number of boxes. The game board will always be a square.</p>
<p>Each dot is assigned a single number. The top-left dot is assigned 1, and the number is incremented by one as we move to the right (like the periodic table).</p>
<p>The image below shows a 4×4 board, along with the labels assigned to points.</p>
<p><img src="http://vikhyat.net/blog//images/animus_board.png"></p>
<p>Your submission must include a function <code>move</code> which accepts a single parameter <code>board</code>. <code>board</code> is an object that contains 3 members: <code>size</code> is a single integer that denotes the size of the board, <code>connections</code> is an array that consists of moves that have been performed so far (this is described below), and <code>valid_moves</code> is an array of moves that your bot can legally perform at this point.</p>
<p>Your function must return a single &#8220;move&#8221;, which is basically an array of two integers which correspond to the dots you wish to connect. For example, <code>[1, 2]</code> will connect the top left dot and the one immediately to its right. <code>board['valid_moves']</code> and <code>board['connections']</code> are arrays of moves of this sort.</p>
<p>Here are two sample bots: one which will perform the first valid move it is provided, and another which will perform a random move.</p>
<p><div class='bogus-wrapper'><notextile><figure class='code'><figcaption><span>random_move.js </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">random_element</span><span class="p">(</span><span class="nx">myArray</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">myArray</span><span class="p">[</span><span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">(</span><span class="nb">Math</span><span class="p">.</span><span class="nx">random</span><span class="p">()</span> <span class="o">*</span> <span class="nx">myArray</span><span class="p">.</span><span class="nx">length</span><span class="p">)];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kd">function</span> <span class="nx">move</span><span class="p">(</span><span class="nx">board</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">random_element</span><span class="p">(</span><span class="nx">board</span><span class="p">.</span><span class="nx">valid_moves</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></div></notextile></p>
<p><div class='bogus-wrapper'><notextile><figure class='code'><figcaption><span>first_valid_move.js </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">move</span><span class="p">(</span><span class="nx">board</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="nx">board</span><span class="p">[</span><span class="s1">&#39;valid_moves&#39;</span><span class="p">][</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></div></notextile></p>
<h3>Local Development</h3>
<p><a href="http://exodia.in/animus_local_dev.zip">This package</a> will allow you to test variations of your bot locally. The tool requires that Java is installed on your computer. It has been tested on OS X (Lion), Linux (Ubuntu and Arch) and Windows (Vista). It should be able to work on any other platform as well, if you are having trouble please leave a comment below.</p>
<p>The package contains a <span class="caps">JAR</span> file and a directory. The <span class="caps">JAR</span> file should be run using the command:</p>
<pre>
java -Djruby.compat.version=1.9 -jar local_tournament.jar [size]
</pre>
<p>You should replace <code>[size]</code> with the size of the map you wish to use. You should probably run it using a size of 10, because that is the map size the tournament will be using. Do <em>not</em> omit the argument, doing so will result in the map size being set to 0, which is quite useless.</p>
<h3>Results</h3>
<table>
<thead>
<tr>
      <th>Name</th>
      <th>Score</th>
</tr>
</thead>
<tbody>
<tr>
      <td>egreavette</td><td>18</td>
</tr>
<tr>
      <td>a_iitmandi</td><td>17</td>
</tr>
<tr>
      <td>ignite</td><td>16</td>
</tr>
<tr>
      <td>rohanag</td><td>16</td>
</tr>
<tr>
      <td>abracadabra</td><td>8</td>
</tr>
<tr>
      <td>animator</td><td>8</td>
</tr>
<tr>
      <td>aounon</td><td>8</td>
</tr>
<tr>
      <td>saikiran</td><td>8</td>
</tr>
<tr>
      <td>saint3k</td><td>8</td>
</tr>
<tr>
      <td>shalmezad</td><td>8</td>
</tr>
<tr>
      <td>shapeshifter</td><td>8</td>
</tr>
<tr>
      <td>vesper_sword</td><td>8</td>
</tr>
<tr>
      <td>123</td><td>4</td>
</tr>
<tr>
      <td>maggot092</td><td>4</td>
</tr>
<tr>
      <td>randombot</td><td>4</td>
</tr>
<tr>
      <td>rohitgupta_hpf</td><td>4</td>
</tr>
<tr>
      <td>sukrit</td><td>3</td>
</tr>
<tr>
      <td>chamun</td><td>2</td>
</tr>
<tr>
      <td>gopi</td><td>2</td>
</tr>
<tr>
      <td>shubham929</td><td>2</td>
</tr>
</tbody>
</table>
<p>The replays can be downloaded <a href="http://cl.ly/3N2S0e0f0J1K1V422T3H">here</a>.</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Obfuscation 2012: Comments and Solutions]]></title>
    <link href="http://vikhyat.net/blog//archives/2012/01/26/obfuscation-2012-comments-and-solutions/"/>
    <updated>2012-01-26T19:41:00+05:30</updated>
    <id>http://vikhyat.net/blog//archives/2012/01/26/obfuscation-2012-comments-and-solutions</id>
    <content type="html"><![CDATA[<p>The contest has ended. Congratulations to the winners!</p>
<p><!-- more --></p>
<h2>Markov Bigrams</h2>
<p>You are working on a new “RPG Hero Name Generator” application. In order to generate the names, rather than going for a dictionary approach you decide to explore something more along the lines of Markov-chain text generation. Since you are generating character names rather than paragraphs, you treat each character as a state, and in order to simplify matters you make the assumption that each letter is independent of all of the letters coming before it except for its immediate predecessor.</p>
<p>The input consists of two lines. The first character of the first line is the character to be considered. The rest of the line will consist of an arbitrary number of characters, this is the sample of text to be considered. Ignore the content of the second line. You are to output a single character, the one which occurs most frequently after the given character in the sample.</p>
<p>The number of characters is small enough that you need not worry about exceeding the limits of int. The character string will consist of only uppercase or lowercase alphabets, you will not encounter any other characters.</p>
<h3>Comments and Solution</h3>
<p>Despite the amount of jargon present, this is a fairly simple problem. The first paragraph only provides some context, and can be ignored for the sake of solving the problem. All that needs to be done in this problem is to count the frequencies of letter when they occur after a certain given character, and output the character that occurs most frequently.</p>
<p><div class='bogus-wrapper'><notextile><figure class='code'><figcaption><span>markov.c </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="n">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kt">char</span> <span class="n">c</span> <span class="o">=</span> <span class="n">getchar</span><span class="p">(),</span> <span class="n">t</span><span class="p">,</span> <span class="n">p</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">freq</span><span class="p">[</span><span class="mi">128</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">while</span> <span class="p">(</span> <span class="p">(</span><span class="n">t</span> <span class="o">=</span> <span class="n">getchar</span><span class="p">())</span> <span class="o">!=</span> <span class="sc">&#39;\n&#39;</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">p</span> <span class="o">==</span> <span class="n">c</span><span class="p">)</span>
</span><span class='line'>      <span class="n">freq</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">++</span><span class="p">;</span>
</span><span class='line'>    <span class="n">p</span> <span class="o">=</span> <span class="n">t</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="n">t</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">t</span><span class="o">&lt;</span><span class="mi">127</span><span class="p">;</span> <span class="n">t</span><span class="o">++</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">freq</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">freq</span><span class="p">[</span><span class="n">c</span><span class="p">])</span>
</span><span class='line'>      <span class="n">c</span> <span class="o">=</span> <span class="n">t</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">putchar</span><span class="p">(</span><span class="n">c</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></div></notextile></p>
<p>The winning solution by M. is only 101 characters, can you bring this down to that?</p>
<h2>F1 Score</h2>
<p>You are working on a spam classification system using a new machine learning algorithm that you devised yourself. Surprised by its abysmal performance, you start to investigate how to improve its accuracy. You decide to run a genetic algorithm to pick the best among various variants of your algorithm. You have picked F1-score as the evaluation metric, and need an efficient implementation that will compute the F1-score.</p>
<p>The first line of input to your program will be a single integer m (&lt;= 100) that represents the size of your cross-validation set. This is followed by m lines, each containing two characters. Each character will be either a ‘+’ or a ‘-’. The first character represents the correct classification of an item in the cross-validation set, and the second character represents the output of your algorithm. As you might guess, ‘+’ corresponds to a positive classification and ‘-’ is a negative classification.</p>
<p>Your program is to output the F1-score with respect to the cross-validation set, with two digits after the decimal point. The following formulae might help:</p>
<p>\[ \text{precision} = \frac { \text{true positives} } {\text{true positives} + \text{false positives} } \]<br />
\[ \text{recall} = \frac {\text{true positives}} {\text{true positives} + \text{false negatives}} \]<br />
\[ \text{F1-score} = \frac {2 \times \text{precision} \times \text{recall}} {\text{precision} + \text{recall}} \]</p>
<p><strong>Definitions</strong>:</p>
<ul>
	<li>A true positive is an example that was correctly classified by your algorithm as positive.</li>
	<li>A true negative is an example that was correctly classified as negative.</li>
	<li>A false positive is an example that is actually negative, but which was classified as positive.</li>
	<li>A false negative is a positive example that was incorrectly classified as negative.</li>
</ul>
<h3>Comments and Solution</h3>
<p>This was by far the easiest problem, it got the most submissions by a pretty large margin. The naive solution is shown below.</p>
<p><div class='bogus-wrapper'><notextile><figure class='code'><figcaption><span>f1score.c </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cp">#define eq(X, a) ((X[0] == a[0]) &amp;&amp; (X[1] == a[1]))</span>
</span><span class='line'>
</span><span class='line'><span class="n">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">t</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">float</span> <span class="n">tp</span><span class="p">,</span> <span class="n">tn</span><span class="p">,</span> <span class="n">fp</span><span class="p">,</span> <span class="n">fn</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">r</span><span class="p">;</span>
</span><span class='line'>  <span class="n">tp</span> <span class="o">=</span> <span class="n">tn</span> <span class="o">=</span> <span class="n">fp</span> <span class="o">=</span> <span class="n">fn</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">char</span> <span class="n">c</span><span class="p">[</span><span class="mi">3</span><span class="p">];</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">t</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">while</span> <span class="p">(</span><span class="n">t</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">gets</span><span class="p">(</span><span class="n">c</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">eq</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="s">&quot;++&quot;</span><span class="p">))</span> <span class="n">tp</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">eq</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="s">&quot;+-&quot;</span><span class="p">))</span> <span class="n">fn</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">eq</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="s">&quot;-+&quot;</span><span class="p">))</span> <span class="n">fp</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">eq</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="s">&quot;--&quot;</span><span class="p">))</span> <span class="n">tn</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">p</span> <span class="o">=</span> <span class="n">tp</span> <span class="o">/</span> <span class="p">(</span><span class="n">tp</span> <span class="o">+</span> <span class="n">fp</span><span class="p">);</span>
</span><span class='line'>  <span class="n">r</span> <span class="o">=</span> <span class="n">tp</span> <span class="o">/</span> <span class="p">(</span><span class="n">tp</span> <span class="o">+</span> <span class="n">fn</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%.2f&quot;</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="o">*</span><span class="n">r</span> <span class="o">/</span> <span class="p">(</span><span class="n">p</span><span class="o">+</span><span class="n">r</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></div></notextile></p>
<p>The size of this solution can be brought down by taking into account, for one, the fact that &#8220;true negatives&#8221; are never used anywhere. Another thing to do would be to get rid of the intermediate precision and recall computations, and to compute the F1 score directly.</p>
<p>The best solution by Ankit Gupta at 133 characters is truly a work of art. M.&#8216;s solution is also quite amazing, but the second optimization was not used; this increased the size of M.&#8217;s submission.</p>
<h2>k-Nearest Neighbors</h2>
<p>Despite your best efforts, your classification algorithm doesn’t work out as well as you had hoped. Not one to be fazed by failure, you decide to go for a more standard algorithm this time, and after spending a short amount on Wikipedia you pick the k-Nearest Neighbors algorithm because of how easy it would be to implement.</p>
<p>In order to further reduce complications, you decide that you don’t want to deal with implementing kNN in a feature-space with a large number of dimensions, and so you apply Principle Component Analysis to reduce the number of features to one and hope for the best. To simplify the problem even further, you decide to set k=1.</p>
<p>The first line of input consists of a single integer n (&lt; 100), the number of examples. This is followed by n lines each consisting of a single real number and a character (‘+’ or ‘-’) separated by a single space. The integer represents the value of the feature, and ‘+’ or ‘-’ represents the correct classification of the item that corresponds to the feature value.</p>
<p>This is followed by a line containing a single integer m (&lt;= 100), the number of queries. After this there will be m lines each containing a single integer, which is the value of the feature for the item you must classify. For each query output the classification of the example whose feature value is closest to the given integer.</p>
<h3>Comments and Solution</h3>
<p>To summarize the problem, you will be given a set of integer-character pairs, and you need to output the character for which the lvalue (the integer which corresponds to the character) is closest to a given integer.</p>
<p><div class='bogus-wrapper'><notextile><figure class='code'><figcaption><span>knn.c </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="n">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">t</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">i</span><span class="p">;</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">);</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">s</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="mi">2</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d %c</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="o">&amp;</span><span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]);</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">m</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">while</span> <span class="p">(</span><span class="n">m</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">k</span><span class="p">);</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span> <span class="n">abs</span><span class="p">(</span><span class="n">k</span> <span class="o">-</span> <span class="n">s</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span> <span class="o">&gt;</span> <span class="n">abs</span><span class="p">(</span><span class="n">k</span> <span class="o">-</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span> <span class="p">)</span>
</span><span class='line'>        <span class="n">t</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="n">putchar</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="mi">1</span><span class="p">]);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></div></notextile></p>
<p>The best solution was submitted by Abhay Prakarsh, and has 157 characters.</p>
<h2>Perceptron</h2>
<p>Surprisingly even the nearest neighbor approach didn’t work well. Your faculty advisor says that it is because of your abuse of Principle Component Analysis, but you think it is more due to the fact that kNN is a high variance algorithm, and your dataset is too noisy for it to work well. After some more research, you stumble upon an algorithm called Logistic Regression (a.k.a a single layer perceptron).</p>
<p>The Logistic Regression algorithm basically involves fitting a given dataset to the function</p>
<p>\[ f(z) = \frac 1 {1 + e^{-z}} \]</p>
<p>where z is the dot product of two vectors: a vector containing the “intercept” and “regression coefficients” and another containing the features. The dimensionality of the first vector is one larger than the dimensionality of the feature space, this is because of the intercept term. There are two ways to treat the bias term: one is to neglect it while performing the dot product and to add it to the result, the other is to add in an extra “1” at the front of the feature vector, which ends up having the same effect as the first method because the intercept is the first term of the first vector, and 1 becomes the first term of the second.</p>
<p>Since this algorithm is to be used for classification, a threshold value T is used: if the output of linear regression is greater than or equal to T the example is classified as positive, otherwise it is classified as negative. You make an arbitrary choice and pick T=0.5.</p>
<p>You have already created the portion of the system that handles learning from the dataset, all that is left is to write the part that makes predictions on new items. The first line of input will contain two space-separated integers: the dimensionality of the feature space (d) and the number of items to be classified (q). This is followed by a line containing (d+1) integers which correspond to the vector with the intercept and regression coefficient. After this there will be q lines, each with d integers that correspond to the feature vector. For each of these q lines you are to output a single character, ‘+’ or ‘-’ depending on whether the input is classified as positive or negative. Both q and d are less than 50.</p>
<h3>Comments and Solution</h3>
<p><div class='bogus-wrapper'><notextile><figure class='code'><figcaption><span>perceptron.c </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cp">#define classify(x) (((x) &gt;= 0.5) ? &#39;+&#39; : &#39;-&#39;)</span>
</span><span class='line'>
</span><span class='line'><span class="kt">float</span> <span class="nf">sigmoid</span><span class="p">(</span><span class="kt">float</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="mi">1</span> <span class="o">/</span> <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">exp</span><span class="p">((</span><span class="kt">double</span><span class="p">)</span> <span class="o">-</span><span class="n">x</span><span class="p">));</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">d</span><span class="p">,</span> <span class="n">q</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">t</span><span class="p">;</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d %d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">d</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">q</span><span class="p">);</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">beta</span><span class="p">[</span><span class="n">d</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">d</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d &quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">beta</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">beta</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">while</span> <span class="p">(</span><span class="n">q</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">a</span> <span class="o">=</span> <span class="n">beta</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">d</span><span class="o">&gt;</span><span class="n">i</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d &quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">t</span><span class="p">);</span>
</span><span class='line'>      <span class="n">a</span> <span class="o">+=</span> <span class="n">beta</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">t</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">t</span><span class="p">);</span>
</span><span class='line'>    <span class="n">a</span> <span class="o">+=</span> <span class="n">beta</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">t</span><span class="p">;</span>
</span><span class='line'>    <span class="n">putchar</span><span class="p">(</span><span class="n">classify</span><span class="p">(</span><span class="n">sigmoid</span><span class="p">(</span><span class="n">a</span><span class="p">)));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></div></notextile></p>
<p>Note that is is possible to completely skip computing the sigmoid function, whenever \( z \geq 0 \) the classification would be positive, and when \( z &lt; 0 \) the classification would be negative. The best solution by Piyush Kapoor comes in at 166 characters.</p>
<h2>Coin Toss Game</h2>
<p>Roger challenges Dave to play a game involving coins. In the game, a fair coin is tossed n times. If, during the coin tosses, heads occurs two or more times in a row, Roger would win; otherwise Dave would win.</p>
<p>Dave disagrees with Roger, because as n grows, so does Roger’s chances of winning. Eventually, both of them agree to arrange the bet amounts in such a way that both players end up with an equal expected gain. For this purpose, they need your help. You need to write a program that, for a given value of n, will output the probability of Dave winning the game.</p>
<p>The first line of input will be a number t, the number of testcases. This will be followed by t lines, each containing a positive integer less than or equal to 20. For each integer, output the probability of Dave winning the game. Include 6 digits after the decimal point in your answer.</p>
<h3>Comments and Solution</h3>
<p>I am going to omit the derivation, but it can be shown that the probability is \(\frac {F(n+2)} {2^n}\), where \( F(n) \) is the nth Fibonacci number.</p>
<p><div class='bogus-wrapper'><notextile><figure class='code'><figcaption><span>coin.c </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="kt">int</span> <span class="nf">fib</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">n</span> <span class="o">&lt;</span> <span class="mi">2</span> <span class="o">?</span> <span class="n">n</span> <span class="o">:</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">t</span><span class="p">,</span> <span class="n">n</span><span class="p">;</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">t</span><span class="p">);</span>
</span><span class='line'>  <span class="k">while</span> <span class="p">(</span><span class="n">t</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">);</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%f</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span> <span class="o">/</span> <span class="n">pow</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">n</span><span class="p">));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></div></notextile></p>
<p>The best solution by Piyush Kapoor comes in at 136 characters. His solution computes the relevant Fibonacci number using an inline iterative method, and uses bit shifting to avoid requiring pow().</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Dementia 2012: Comments and Solutions]]></title>
    <link href="http://vikhyat.net/blog//archives/2012/01/22/dementia-2012-comments-and-solutions/"/>
    <updated>2012-01-22T00:02:00+05:30</updated>
    <id>http://vikhyat.net/blog//archives/2012/01/22/dementia-2012-comments-and-solutions</id>
    <content type="html"><![CDATA[<p>The 6 hours programming contest has finally ended! Congratulations to the winners.</p>
<p><!-- more --></p>
<h2>Spiral Numbers</h2>
<p>Dennis is programming a robot that is supposed to paint a horizontal line. Not being one to care much about efficiency, Dennis programs the robot to move in an anti-clockwise spiral as shown below.</p>
<p><img src="http://vikhyat.net/blog//images/spiral_numbers.png"></p>
<p>The robot starts at position zero, then moves to position 1, then position 2 and so on. Dennis wants all of the tiles to the right of 0 to be painted black. (These tiles are represented as bold numbers in the figure above.)</p>
<p>Your task is to help Dennis by telling him which is the nth tile that must be painted black, with the zeroth tile being zero.</p>
<h3>Comments and Solution</h3>
<p>The spiral in this problem is constructed in the same way as <a href="http://en.wikipedia.org/wiki/Ulam_spiral">Ulam&#8217;s Spiral</a>. With a little bit of derivation, you can see that the nth spiral number is given by \(4n^2 &#8211; 3n\).</p>
<p><div class='bogus-wrapper'><notextile><figure class='code'><figcaption><span>spiral_numbers.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="nb">gets</span><span class="o">.</span><span class="n">to_i</span><span class="o">.</span><span class="n">times</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">n</span> <span class="o">=</span> <span class="nb">gets</span><span class="o">.</span><span class="n">to_i</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="mi">4</span><span class="o">*</span><span class="n">n</span><span class="o">*</span><span class="n">n</span> <span class="o">-</span> <span class="mi">3</span><span class="o">*</span><span class="n">n</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure></div></notextile></p>
<h2>Counting Stars</h2>
<p>Galileo&#8217;s latest project involves determining the density of stars in certain regions of the sky. For this purpose he started looking for datasets online, and discovered a dataset on Newton&#8217;s blog. Newton had decomposed the night sky into a Voronoi tessellation with the generators arranged in a grid. He has stored the number of stars in a Voronoi cell at a position in a matrix that corresponds to the position of the generator in the grid.</p>
<p>This dataset does not directly help Galileo, because he needs to be able to query the number of stars in a rectangular portion of the sky. Galileo tried to write a program that does this on his own, but it turned out to be too slow. Can you help him?</p>
<h3>Comments and Solution</h3>
<p>This problem would have been far more interesting with a stricter time limit. As it is now, even solutions that take the naive approach of looping over the relevant section each time would be accepted. A more efficient way of solving this problem (given that there would be a large number of queries for a single dataset) would be to construct a &#8220;dominance matrix&#8221;, in which each element of the matrix <code>D[x][y]</code> is the sum of all elements of the dataset <code>A[i][j]</code> with \(i \leq x\) and \(j \leq y\). Using this approach, the doubly nested loop in the naive approach can be replaced with four array lookups.</p>
<p><div class='bogus-wrapper'><notextile><figure class='code'><figcaption><span>counting_stars.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="nb">gets</span><span class="o">.</span><span class="n">split</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span><span class="o">|</span><span class="n">x</span><span class="o">|</span> <span class="n">x</span><span class="o">.</span><span class="n">to_i</span> <span class="p">}</span>
</span><span class='line'><span class="n">data</span> <span class="o">=</span> <span class="o">[]</span>
</span><span class='line'>
</span><span class='line'><span class="n">a</span><span class="o">.</span><span class="n">times</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">data</span> <span class="o">&lt;&lt;</span> <span class="nb">gets</span><span class="o">.</span><span class="n">split</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span><span class="o">|</span><span class="n">x</span><span class="o">|</span> <span class="n">x</span><span class="o">.</span><span class="n">to_i</span> <span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="nb">gets</span><span class="o">.</span><span class="n">to_i</span><span class="o">.</span><span class="n">times</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">px</span><span class="p">,</span> <span class="n">py</span><span class="p">,</span> <span class="n">qx</span><span class="p">,</span> <span class="n">qy</span> <span class="o">=</span> <span class="nb">gets</span><span class="o">.</span><span class="n">split</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span><span class="o">|</span><span class="n">x</span><span class="o">|</span> <span class="n">x</span><span class="o">.</span><span class="n">to_i</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">sum</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'>  <span class="k">for</span> <span class="n">x</span> <span class="k">in</span> <span class="p">(</span><span class="n">px</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">.</span><span class="p">(</span><span class="n">qx</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>    <span class="k">for</span> <span class="n">y</span> <span class="k">in</span> <span class="p">(</span><span class="n">py</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">.</span><span class="p">(</span><span class="n">qy</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>      <span class="n">sum</span> <span class="o">+=</span> <span class="n">data</span><span class="o">[</span><span class="n">x</span><span class="o">][</span><span class="n">y</span><span class="o">]</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="n">sum</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure></div></notextile></p>
<h2>Protecting Sheep</h2>
<p>Useless Fencing Inc. has recently scored a contract to create a fence around a bunch of sheep in light of recent wolf attacks. As implied by their name, Useless Fencing tries to use as little fencing material as possible.</p>
<p>In order to determine the location of each of the sheep, Useless Fencing has deployed a system consisting of laser range-finders. This has given them the location of each of the sheep, however because of errors inherent in the system, they only know that each of the sheep is inside a square of side 2 units. (Note that the orientation of all of these squares is identical, and the coordinate system has been selected so that each of the sides are parallel to one of the axes.)</p>
<p>The sheep are rather lazy (they never move), but none of them should be left outside the fence. Your task is to determine the minimum possible length of the fence.</p>
<h3>Comments</h3>
<p>This problem boils down to finding the <a href="http://en.wikipedia.org/wiki/Convex_hull">Convex Hull</a>. Finding the convex hull of a set of points in a plane can be thought of as stretching a rubber band so that it covers all of the points, and then releasing it so that it becomes taut. <a href="http://upload.wikimedia.org/wikipedia/commons/d/de/ConvexHull.svg">This image</a> will probably be helpful in understanding the rubber band analogy.</p>
<p>There is a slight twist, however, the set of points to be considered is not the set of sheep coordinates, rather it is the set of all of the vertices of the squares that contain the sheep. In other words, each of the given center coordinates of the sheep would be transformed into four different points as illustrated by the image below, and this transformation should be applied to each one of the sheep coordinates. We would then find the length of the convex hull of the resulting set of coordinates, which would contain 4 times as many points as the original set of coordinates.</p>
<p><img src="http://vikhyat.net/blog//images/protecting_sheep.png"></p>
<p><a href="http://en.wikipedia.org/wiki/Gift_wrapping_algorithm">Jarvis&#8217;s march</a> will suffice for solving this problem, but you may also consider more sophisticated algorithms like the Graham&#8217;s Scan. Jarvis&#8217;s march is much simpler to implement, and choosing it over Graham&#8217;s Scan means that precious time is saved.</p>
<h2>Gray Codes</h2>
<p>Gray codes were invented to prevent spurious output from electromagnetic switches. Consider the number 3 in ordinary binary encoding: when incremented from 011 to 100 it is unlikely that all of the switches will change states at the same time, so there is a possibility of reading the state of the variable while it is in between a transition (i.e., when some of the bits have flipped to the correct value but others haven&#8217;t).</p>
<p>To solve this problem, Frank Gray introduced a new number system in which successive numbers differ by only a single bit.</p>
<p>You are working on a legacy system that uses Gray codes, but are having difficulty fixing a bug related to multiplication of numbers. For the purpose of debugging, you wish to convert a number&#8217;s Gray encoding into the corresponding decimal representation.</p>
<h3>Comments and Solution</h3>
<p><a href="http://en.wikipedia.org/wiki/Gray_code#History_and_practical_application">This page</a> has a number of interesting applications of Gray Codes. I think Karnaugh maps are the most interesting, they are used to solve boolean minimization (the problem of minimizing logical circuitry).</p>
<p><div class='bogus-wrapper'><notextile><figure class='code'><figcaption><span>gray_codes.c </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cp">#include &lt;stdio.h&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="kt">int</span> <span class="nf">gray_decode</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kt">int</span> <span class="n">p</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span>
</span><span class='line'>    <span class="k">while</span> <span class="p">(</span><span class="n">n</span> <span class="o">&gt;&gt;=</span> <span class="mi">1</span><span class="p">)</span> <span class="n">p</span> <span class="o">^=</span> <span class="n">n</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">p</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">t</span><span class="p">,</span> <span class="n">c</span><span class="p">;</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">t</span><span class="p">);</span>
</span><span class='line'>  <span class="k">while</span> <span class="p">(</span><span class="n">t</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">c</span><span class="p">);</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">gray_decode</span><span class="p">(</span><span class="n">c</span><span class="p">));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure></div></notextile></p>
<h2>nCr as a Service</h2>
<p>To test a new cloud computing service, you decide to write a program that generates the Pascal Triangle in a distributed fashion.</p>
<p>You wish to estimate the amount of network traffic that would be expected between nodes. Since the nodes exchange the computed values in base 10, you want to know the number of digits in the base-10 representation of nth row and rth column of Pascal&#8217;s triangle. Since your program internally represents these in base-2, you also wish to know the number of digits in the base-2 representation to get an idea of the memory usage involved.</p>
<h3>Comments and Solution</h3>
<p>The name of this problem is a play on the term <a href="http://en.wikipedia.org/wiki/Software_as_a_service">Software as a Service</a>. The number of digits a number \(n\) has in base \(b\) is \( \lfloor \log_b \left( n \right) \rfloor + 1 \).</p>
<p><div class='bogus-wrapper'><notextile><figure class='code'><figcaption><span>ncraas.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">def</span> <span class="nf">ncr</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span>
</span><span class='line'>  <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">r</span><span class="p">,</span> <span class="n">n</span><span class="o">-</span><span class="n">r</span>
</span><span class='line'>  <span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">b</span><span class="p">,</span> <span class="n">a</span> <span class="k">if</span> <span class="n">a</span> <span class="o">&lt;</span> <span class="n">b</span>  <span class="c1"># a is the larger</span>
</span><span class='line'>  <span class="n">numer</span> <span class="o">=</span> <span class="p">(</span><span class="n">a</span><span class="o">+</span><span class="mi">1</span><span class="o">.</span><span class="n">.n</span><span class="p">)</span><span class="o">.</span><span class="n">inject</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="n">t</span><span class="p">,</span><span class="n">v</span><span class="o">|</span> <span class="n">t</span><span class="o">*</span><span class="n">v</span> <span class="p">}</span>  <span class="c1"># n!/r!</span>
</span><span class='line'>  <span class="n">denom</span> <span class="o">=</span> <span class="p">(</span><span class="mi">2</span><span class="o">.</span><span class="n">.b</span><span class="p">)</span><span class="o">.</span><span class="n">inject</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="n">t</span><span class="p">,</span><span class="n">v</span><span class="o">|</span> <span class="n">t</span><span class="o">*</span><span class="n">v</span> <span class="p">}</span>    <span class="c1"># (n-r)!</span>
</span><span class='line'>  <span class="n">numer</span> <span class="o">/</span> <span class="n">denom</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">ncrdigs_naive</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">base</span><span class="p">)</span>
</span><span class='line'>  <span class="n">ncr</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span><span class="o">.</span><span class="n">to_s</span><span class="p">(</span><span class="n">base</span><span class="p">)</span><span class="o">.</span><span class="n">length</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="nb">gets</span><span class="o">.</span><span class="n">to_i</span><span class="o">.</span><span class="n">times</span> <span class="k">do</span>
</span><span class='line'>  <span class="n">n</span><span class="p">,</span> <span class="n">r</span> <span class="o">=</span> <span class="nb">gets</span><span class="o">.</span><span class="n">split</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span><span class="o">|</span><span class="n">x</span><span class="o">|</span> <span class="n">x</span><span class="o">.</span><span class="n">to_i</span> <span class="p">}</span>
</span><span class='line'>  <span class="nb">puts</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">ncrdigs_naive</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">r</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span><span class="si">}</span><span class="s2"> </span><span class="si">#{</span><span class="n">ncrdigs_naive</span><span class="p">(</span><span class="n">n</span><span class="p">,</span><span class="n">r</span><span class="p">,</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure></div></notextile></p>
<h2>Balanced Primes</h2>
<p>A balanced prime is one which is the average of the previous and the next prime number. Your task in this problem is to write a program that can calculate the nth balanced prime.</p>
<h3>Comments and Solution</h3>
<p>This is the sort of problem that looks like it was meant to be solved in Haskell.</p>
<p><div class='bogus-wrapper'><notextile><figure class='code'><figcaption><span>balanced_primes.hs </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='hs'><span class='line'><span class="nf">minus</span> <span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">xs</span><span class="p">)</span> <span class="p">(</span><span class="n">y</span><span class="kt">:</span><span class="n">ys</span><span class="p">)</span> <span class="ow">=</span> <span class="kr">case</span> <span class="p">(</span><span class="n">compare</span> <span class="n">x</span> <span class="n">y</span><span class="p">)</span> <span class="kr">of</span>
</span><span class='line'>           <span class="kt">LT</span> <span class="ow">-&gt;</span> <span class="n">x</span> <span class="kt">:</span> <span class="n">minus</span>  <span class="n">xs</span>  <span class="p">(</span><span class="n">y</span><span class="kt">:</span><span class="n">ys</span><span class="p">)</span>
</span><span class='line'>           <span class="kt">EQ</span> <span class="ow">-&gt;</span>     <span class="n">minus</span>  <span class="n">xs</span>     <span class="n">ys</span>
</span><span class='line'>           <span class="kt">GT</span> <span class="ow">-&gt;</span>     <span class="n">minus</span> <span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">xs</span><span class="p">)</span>  <span class="n">ys</span>
</span><span class='line'><span class="nf">minus</span>  <span class="n">xs</span>     <span class="kr">_</span>     <span class="ow">=</span> <span class="n">xs</span>
</span><span class='line'>
</span><span class='line'><span class="nf">primesPE</span> <span class="ow">=</span> <span class="mi">2</span> <span class="kt">:</span> <span class="n">primes&#39;</span>
</span><span class='line'>  <span class="kr">where</span>
</span><span class='line'>    <span class="n">primes&#39;</span> <span class="ow">=</span> <span class="n">sieve</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span><span class="mi">5</span><span class="o">..</span><span class="p">]</span> <span class="mi">9</span> <span class="n">primes&#39;</span>
</span><span class='line'>    <span class="n">sieve</span> <span class="p">(</span><span class="n">x</span><span class="kt">:</span><span class="n">xs</span><span class="p">)</span> <span class="n">q</span> <span class="n">ps</span><span class="o">@</span> <span class="o">~</span><span class="p">(</span><span class="n">p</span><span class="kt">:</span><span class="n">t</span><span class="p">)</span>
</span><span class='line'>      <span class="o">|</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">q</span>     <span class="ow">=</span> <span class="n">x</span> <span class="kt">:</span> <span class="n">sieve</span> <span class="n">xs</span> <span class="n">q</span> <span class="n">ps</span>
</span><span class='line'>      <span class="o">|</span> <span class="n">otherwise</span> <span class="ow">=</span>     <span class="n">sieve</span> <span class="p">(</span><span class="n">xs</span> <span class="p">`</span><span class="n">minus</span><span class="p">`</span> <span class="p">[</span><span class="n">q</span><span class="p">,</span> <span class="n">q</span><span class="o">+</span><span class="mi">2</span><span class="o">*</span><span class="n">p</span><span class="o">..</span><span class="p">])</span> <span class="p">(</span><span class="n">head</span> <span class="n">t</span><span class="o">^</span><span class="mi">2</span><span class="p">)</span> <span class="n">t</span>
</span><span class='line'>
</span><span class='line'><span class="nf">primes_triplet</span> <span class="ow">=</span> <span class="n">map</span> <span class="n">f</span> <span class="p">[</span><span class="mi">1</span><span class="o">..</span><span class="p">]</span>
</span><span class='line'>  <span class="kr">where</span> <span class="n">f</span> <span class="n">x</span> <span class="ow">=</span> <span class="p">(</span><span class="n">primesPE</span> <span class="o">!!</span> <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="p">),</span> <span class="n">primesPE</span> <span class="o">!!</span> <span class="n">x</span><span class="p">,</span> <span class="n">primesPE</span> <span class="o">!!</span> <span class="p">(</span><span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'><span class="nf">balanced_primes</span> <span class="ow">=</span> <span class="n">map</span> <span class="n">g</span> <span class="o">$</span> <span class="n">filter</span> <span class="n">f</span> <span class="n">primes_triplet</span>
</span><span class='line'>  <span class="kr">where</span> <span class="n">f</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">c</span><span class="p">)</span> <span class="ow">=</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">b</span> <span class="o">==</span> <span class="n">a</span> <span class="o">+</span> <span class="n">c</span>
</span><span class='line'>        <span class="n">g</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">,</span><span class="n">c</span><span class="p">)</span> <span class="ow">=</span> <span class="n">b</span>
</span><span class='line'>
</span><span class='line'><span class="nf">main</span> <span class="ow">=</span> <span class="n">interact</span> <span class="n">g</span>
</span><span class='line'>  <span class="kr">where</span> <span class="n">g</span> <span class="n">x</span> <span class="ow">=</span> <span class="n">unlines</span> <span class="o">$</span> <span class="n">map</span> <span class="n">show</span> <span class="o">$</span> <span class="n">map</span> <span class="n">nbp</span> <span class="o">$</span> <span class="n">drop</span> <span class="mi">1</span> <span class="o">$</span> <span class="n">lines</span> <span class="n">x</span>
</span><span class='line'>        <span class="n">nbp</span> <span class="n">x</span> <span class="ow">=</span> <span class="n">balanced_primes</span> <span class="o">!!</span> <span class="p">((</span><span class="n">read</span> <span class="n">x</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure></div></notextile></p>
<p>The first two definitions (<code>minus</code> and <code>primesPE</code>) are taken verbatim from  <a href="http://www.haskell.org/haskellwiki/Prime_numbers">this page</a>. There are far more efficient implementations on that page that can be dropped in, and doing so will make the program run faster, because generation of primes is the bottleneck. <code>primesPE</code> is an infinite list of primes. <code>primes_triplet</code> uses <code>primesPE</code> to create another list that contains triplets of prime numbers. <code>balanced_primes</code> applies a filter to this list of triplets, selecting only those for which twice the middle element is the sum of the extreme elements, and then selecting only the middle elements of those triplets. The final definition, <code>main</code>, handles IO and can be ignored.</p>
<p>The infinite lists take care of memoization, so that values will not be unnecessarily recomputed. The Haskell code sample above feels almost like <em>declarative</em> programming, in which you specify what you want computed rather than how to compute it.</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Convergence Tests of Infinite Series]]></title>
    <link href="http://vikhyat.net/blog//archives/2011/09/04/convergence-tests/"/>
    <updated>2011-09-04T06:43:00+05:30</updated>
    <id>http://vikhyat.net/blog//archives/2011/09/04/convergence-tests</id>
    <content type="html"><![CDATA[<p>The content listed below is also available in <a href="http://vikhyat.net/convergence_tests.pdf"><span class="caps">PDF</span> format</a>.</p>
<p><!--more--></p>
<h2>Positive Term Series</h2>
<h3>Integral Test</h3>
<p>Let \( \sum a_n \) be a positive term series, and let \( a_n = f(n) \) such that \( f(n) \) decreases as \( n \) increases. Then \( \sum a_n \) converges or diverges if \( \int_1^\infty f(x) dx \) is finite or infinite respectively.</p>
<h3>p-Series Test</h3>
<p>Let \( \sum a_n \) be a positive term series given by \(a_n = \frac1{n^p} \). Then, \( \sum a_n \) is convergent if \( p \gt 1 \), and divergent if \( p \leq 1 \).</p>
<h3>Comparison Test</h3>
<p>Let \(\sum a_n \) be a positive term series, then:</p>
<ol>
	<li>\( \sum a_n \) is convergent if \( \sum b_n \) is another convergent series with \( a_n \leq b_n \).</li>
	<li>\( \sum a_n \) is divergent if \( \sum d_n \) is another divergent series with \( a_n \geq d_n \).</li>
</ol>
<h3>Limit Comparison Test</h3>
<p>Let \( \sum a_n \) and \(\sum b_n \) be two positive term series.</p>
<ol>
	<li>If \( \lim_{n \rightarrow \infty} \frac{a_n}{b_n} \) is a finite and non-zero positive quantity, then \( \sum a_n \) and \(\sum b_n\) will converge and diverge together.</li>
	<li>If \( \lim_{n \rightarrow \infty} \frac{a_n}{b_n} = 0 \) and \(\sum b_n \) is convergent, then \( \sum a_n \) is also convergent.</li>
	<li>If \(\lim_{n \rightarrow \infty} \frac{a_n}{b_n} = \infty \) and \( \sum b_n \) is divergent, then \(\ sum a_n \) is also divergent.</li>
</ol>
<h3>D&#8217;Alembert&#8217;s Ratio Test / Ratio Test</h3>
<p>Let \( \sum a_n \) be a positive term series, and let \( \lim_{n \rightarrow \infty} \frac{a_{n+1}}{a_n} = r \).</p>
<ol>
	<li>The series is convergent if \( r \lt 1 \).</li>
	<li>The series is divergent if \( r \gt 1 \), or if \(r\) is infinite.</li>
	<li>The test fails if \(r=1\).</li>
</ol>
<h3>Cauchy&#8217;s Root Test / Root Test</h3>
<p>Let \( \sum a_n \) be a positive term series, and \( \lim_{n \rightarrow \infty} (a_n)^{\frac1n} = r \).</p>
<ol>
	<li>The series is convergent if \( r \lt 1 \).</li>
	<li>The series is divergent if \( r \gt 1 \).</li>
	<li>The test fails if \( r = 1 \).</li>
</ol>
<h3>Raabe&#8217;s Test</h3>
<p>Let \( \sum a_n \) be a positive term series, and \( \lim_{n \rightarrow \infty} n \left( \frac{a_n}{a_{n+1}}-1 \right) = k\).</p>
<ol>
	<li>The series is convergent if \( k \gt 1 \).</li>
	<li>The series is divergent if \( k \lt 1 \).</li>
	<li>The test fails if \( k = 1 \).</li>
</ol>
<h3>Logarithmic Test</h3>
<p>Let \( \sum a_n \) be a positive term series, and \( \lim_{n \rightarrow \infty} \log\left( \frac{a_n}{a_{n+1}} \right) = k\).</p>
<ol>
	<li>The series is convergent if \( k \gt 1 \).</li>
	<li>The series is divergent if \( k \lt 1 \).</li>
	<li>The test fails if \( k = 1 \).</li>
</ol>
<h2>Alternating Series</h2>
<h3>Leibniz&#8217;s Test</h3>
<p>If the series \( \sum (-1)^n a_n \) is an alternating series, then the series is convergent if:</p>
<ol>
	<li>Each term is numerically lesser than the preceeding term. ( \( &#124;a_{n+1}&#124; \lt &#124;a_n&#124; \) )</li>
	<li>\( \lim_{n \rightarrow \infty} a_n = 0 \).</li>
</ol>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Matrix Multiplication in Ruby]]></title>
    <link href="http://vikhyat.net/blog//archives/2011/04/20/matrix-multiplication-ruby/"/>
    <updated>2011-04-20T05:59:00+05:30</updated>
    <id>http://vikhyat.net/blog//archives/2011/04/20/matrix-multiplication-ruby</id>
    <content type="html"><![CDATA[<p>Ruby has an inbuilt <code>Matrix</code> class, which you should use in any serious application. In this article, we discuss how matrix multiplication can be performed efficiently. However, because the code we write is in Ruby, even a very good implementation will run slower than using the <code>Matrix</code> class.</p>
<p><!--more--></p>
<p>For the sake of simplicity, we confine ourselves to the multiplication of square matrices.</p>
<h2>Representation of Matrices</h2>
<p>We shall represent Matrices as 2-dimensional arrays. Every element of the outer array will represent a row of the matrix.</p>
<p>We shall denote the element in the \(i\)th row and \(j\)th column of a matrix called \(C\) as \(c_{ij}\).</p>
<h2>The Naive Method</h2>
<p>We can find the product \(C\) of two \(n \times n\) matrices \(A\) and \(B\) using simple row-by-column multiplication:<br />
\[ c_{ij} = \sum\limits_{k=1}^n a_{ik} \cdot b_{kj} \]</p>
<p><div class='bogus-wrapper'><notextile><figure class='code'><figcaption><span>naive_matrix_multiplication.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">def</span> <span class="nf">naive_matrix_mult</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</span><span class='line'>  <span class="n">n</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">length</span>
</span><span class='line'>  <span class="c1"># Create a new n x n matrix with all elements initialized to 0.</span>
</span><span class='line'>  <span class="n">c</span> <span class="o">=</span> <span class="nb">Array</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="nb">Array</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>  <span class="mi">0</span><span class="o">.</span><span class="n">upto</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">i</span><span class="o">|</span>
</span><span class='line'>    <span class="mi">0</span><span class="o">.</span><span class="n">upto</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">j</span><span class="o">|</span>
</span><span class='line'>      <span class="mi">0</span><span class="o">.</span><span class="n">upto</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">k</span><span class="o">|</span>
</span><span class='line'>        <span class="n">c</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">+=</span> <span class="n">a</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">k</span><span class="o">]</span> <span class="o">*</span> <span class="n">b</span><span class="o">[</span><span class="n">k</span><span class="o">][</span><span class="n">j</span><span class="o">]</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">c</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">naive_matrix_mult</span><span class="p">(</span><span class="o">[[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="o">]</span><span class="p">,</span> <span class="o">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="o">]]</span><span class="p">,</span> <span class="o">[[</span><span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="o">]</span><span class="p">,</span> <span class="o">[</span><span class="mi">7</span><span class="p">,</span> <span class="mi">8</span><span class="o">]]</span><span class="p">)</span>
</span><span class='line'>                       <span class="c1"># =&gt; [[19, 22], [43, 50]]</span>
</span></code></pre></td></tr></table></div></figure></div></notextile></p>
<p>Clearly, this will take \( \Theta(n^3) \) time to multiply two \(n<br />
\times n \) matrices.</p>
<h2>Divide and Conquer</h2>
<p>Another approach is to try to use the divide-and-conquer paradigm, and split each of the matrices \(A\), \(B\) and \(C\) into four \( \frac n2 \times \frac n2 \) matrices:</p>
<p>\[ A = \left( \begin{array}{cc} A_{11} &amp; A_{12} &#92;&#92; A_{21} &amp; A_{22} \end{array} \right), \]\[ B = \left( \begin{array}{cc} B_{11} &amp; B_{12} &#92;&#92; B_{21} &amp; B_{22} \end{array} \right), \]\[ C = \left( \begin{array}{cc} C_{11} &amp; C_{12} &#92;&#92; C_{21} &amp; C_{22} \end{array} \right). \]</p>
<p>We can rewrite \( C=A \cdot B \) as</p>
<p>\[ \left( \begin{array}{cc} C_{11} &amp; C_{12} &#92;&#92; C_{21} &amp; C_{22} \end{array} \right) = <br />
   \left( \begin{array}{cc} A_{11} &amp; A_{12} &#92;&#92; A_{21} &amp; A_{22} \end{array} \right) \cdot<br />
   \left( \begin{array}{cc} B_{11} &amp; B_{12} &#92;&#92; B_{21} &amp; B_{22} \end{array} \right). \]</p>
<p>Hence, we get the following four equations:</p>
<p>\[ C_{11} = A_{11} \cdot B_{11} + A_{12} \cdot B_{21}, \]\[ C_{12} = A_{11} \cdot B_{12} + A_{12} \cdot B_{22}, \]\[ C_{21} = A_{21} \cdot B_{11} + A_{22} \cdot B_{21}, \]\[ C_{22} = A_{21} \cdot B_{12} + A_{22} \cdot B_{22}. \]</p>
<p>This reduces the multiplication of two \(n \times n\) matrices to eight multiplications of two \(\frac n2 \times \frac n2\) matrices and four \(\frac n2 \times \frac n2\) matrix additions.</p>
<p>Each addition will take \(\Theta(n^2)\) time. If the time taken by this method to multiply two \(n \times n\) matrices in \(T(n)\), then we get the recurrence:</p>
<p>\[ T(n) = 8 T \left( \frac n2 \right) + \Theta(n^2). \]</p>
<p>The solution to this recurrence is \(\Theta(n^3)\), meaning that the divide-and-conquer method is no better than the naive method.</p>
<p><div class='bogus-wrapper'><notextile><figure class='code'><figcaption><span>divide_and_conquer.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">def</span> <span class="nf">partition</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
</span><span class='line'>  <span class="n">n</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">length</span>
</span><span class='line'>  <span class="n">lim</span> <span class="o">=</span> <span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span>
</span><span class='line'>  <span class="n">a_11</span> <span class="o">=</span> <span class="n">a</span><span class="o">[</span><span class="mi">0</span><span class="o">.</span><span class="n">.lim</span><span class="o">].</span><span class="n">map</span> <span class="p">{</span><span class="o">|</span><span class="n">x</span><span class="o">|</span> <span class="n">x</span><span class="o">[</span><span class="mi">0</span><span class="o">.</span><span class="n">.lim</span><span class="o">]</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">a_12</span> <span class="o">=</span> <span class="n">a</span><span class="o">[</span><span class="mi">0</span><span class="o">.</span><span class="n">.lim</span><span class="o">].</span><span class="n">map</span> <span class="p">{</span><span class="o">|</span><span class="n">x</span><span class="o">|</span> <span class="n">x</span><span class="o">[</span><span class="p">(</span><span class="n">lim</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">.</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">]</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">a_21</span> <span class="o">=</span> <span class="n">a</span><span class="o">[</span><span class="p">(</span><span class="n">lim</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">.</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">].</span><span class="n">map</span> <span class="p">{</span><span class="o">|</span><span class="n">x</span><span class="o">|</span> <span class="n">x</span><span class="o">[</span><span class="mi">0</span><span class="o">.</span><span class="n">.lim</span><span class="o">]</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">a_22</span> <span class="o">=</span> <span class="n">a</span><span class="o">[</span><span class="p">(</span><span class="n">lim</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">.</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">].</span><span class="n">map</span> <span class="p">{</span><span class="o">|</span><span class="n">x</span><span class="o">|</span>  <span class="n">x</span><span class="o">[</span><span class="p">(</span><span class="n">lim</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">.</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">]</span> <span class="p">}</span>
</span><span class='line'>  <span class="o">[</span><span class="n">a_11</span><span class="p">,</span> <span class="n">a_12</span><span class="p">,</span> <span class="n">a_21</span><span class="p">,</span> <span class="n">a_22</span><span class="o">]</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">combine</span><span class="p">(</span><span class="n">a_11</span><span class="p">,</span> <span class="n">a_12</span><span class="p">,</span> <span class="n">a_21</span><span class="p">,</span> <span class="n">a_22</span><span class="p">)</span>
</span><span class='line'>  <span class="n">n1</span> <span class="o">=</span> <span class="n">a_11</span><span class="o">.</span><span class="n">length</span>
</span><span class='line'>  <span class="n">n2</span> <span class="o">=</span> <span class="n">a_21</span><span class="o">.</span><span class="n">length</span>
</span><span class='line'>  <span class="n">c</span> <span class="o">=</span> <span class="nb">Array</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">n1</span><span class="o">+</span><span class="n">n2</span><span class="p">)</span> <span class="p">{</span> <span class="kp">nil</span> <span class="p">}</span>
</span><span class='line'>  <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">0</span><span class="o">.</span><span class="n">.</span><span class="p">(</span><span class="n">n1</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>    <span class="n">c</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">a_11</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">+</span> <span class="n">a_12</span><span class="o">[</span><span class="n">i</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="n">n1</span><span class="o">.</span><span class="n">.</span><span class="p">(</span><span class="n">n1</span><span class="o">+</span><span class="n">n2</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>    <span class="n">c</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">a_21</span><span class="o">[</span><span class="n">i</span><span class="o">-</span><span class="n">n1</span><span class="o">]</span> <span class="o">+</span> <span class="n">a_22</span><span class="o">[</span><span class="n">i</span><span class="o">-</span><span class="n">n1</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">c</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</span><span class='line'>  <span class="n">n</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">length</span>
</span><span class='line'>  <span class="n">c</span> <span class="o">=</span> <span class="nb">Array</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="nb">Array</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="mi">0</span> <span class="p">}</span> <span class="p">}</span>
</span><span class='line'>  <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="mi">0</span><span class="o">.</span><span class="n">.</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>    <span class="k">for</span> <span class="n">j</span> <span class="k">in</span> <span class="mi">0</span><span class="o">.</span><span class="n">.</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>      <span class="n">c</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">=</span> <span class="n">a</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span> <span class="o">+</span> <span class="n">b</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="n">j</span><span class="o">]</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="n">c</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">recursive_matrix_mult</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</span><span class='line'>  <span class="n">n</span> <span class="o">=</span> <span class="n">a</span><span class="o">.</span><span class="n">length</span>
</span><span class='line'>  <span class="k">return</span> <span class="o">[[]]</span> <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">0</span>
</span><span class='line'>  <span class="k">return</span> <span class="o">[[</span><span class="n">a</span><span class="o">[</span><span class="mi">0</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">*</span> <span class="n">b</span><span class="o">[</span><span class="mi">0</span><span class="o">][</span><span class="mi">0</span><span class="o">]]]</span> <span class="k">if</span> <span class="n">n</span> <span class="o">==</span> <span class="mi">1</span>
</span><span class='line'>  <span class="n">a_11</span><span class="p">,</span> <span class="n">a_12</span><span class="p">,</span> <span class="n">a_21</span><span class="p">,</span> <span class="n">a_22</span> <span class="o">=</span> <span class="o">*</span><span class="n">partition</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
</span><span class='line'>  <span class="n">b_11</span><span class="p">,</span> <span class="n">b_12</span><span class="p">,</span> <span class="n">b_21</span><span class="p">,</span> <span class="n">b_22</span> <span class="o">=</span> <span class="o">*</span><span class="n">partition</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">c_11</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">recursive_matrix_mult</span><span class="p">(</span><span class="n">a_11</span><span class="p">,</span> <span class="n">b_11</span><span class="p">),</span>
</span><span class='line'>               <span class="n">recursive_matrix_mult</span><span class="p">(</span><span class="n">a_12</span><span class="p">,</span> <span class="n">b_21</span><span class="p">))</span>
</span><span class='line'>  <span class="n">c_12</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">recursive_matrix_mult</span><span class="p">(</span><span class="n">a_11</span><span class="p">,</span> <span class="n">b_12</span><span class="p">),</span>
</span><span class='line'>               <span class="n">recursive_matrix_mult</span><span class="p">(</span><span class="n">a_12</span><span class="p">,</span> <span class="n">b_22</span><span class="p">))</span>
</span><span class='line'>  <span class="n">c_21</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">recursive_matrix_mult</span><span class="p">(</span><span class="n">a_21</span><span class="p">,</span> <span class="n">b_11</span><span class="p">),</span>
</span><span class='line'>               <span class="n">recursive_matrix_mult</span><span class="p">(</span><span class="n">a_22</span><span class="p">,</span> <span class="n">b_21</span><span class="p">))</span>
</span><span class='line'>  <span class="n">c_22</span> <span class="o">=</span> <span class="n">add</span><span class="p">(</span><span class="n">recursive_matrix_mult</span><span class="p">(</span><span class="n">a_21</span><span class="p">,</span> <span class="n">b_12</span><span class="p">),</span>
</span><span class='line'>               <span class="n">recursive_matrix_mult</span><span class="p">(</span><span class="n">a_22</span><span class="p">,</span> <span class="n">b_22</span><span class="p">))</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">combine</span><span class="p">(</span><span class="n">c_11</span><span class="p">,</span> <span class="n">c_12</span><span class="p">,</span> <span class="n">c_21</span><span class="p">,</span> <span class="n">c_22</span><span class="p">)</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure></div></notextile></p>
<h2>Other methods</h2>
<p><a href="http://en.wikipedia.org/wiki/Strassen_algorithm">Strassen&#8217;s algorithm</a> also involves breaking matrices into smaller pieces. It can multiply two \(n \times n\) matrices in \(\Theta(n^{lg\; 7}) \approx \Theta(n^{2.807})\) time. However, it is far more cumbersome to implement, and is not as numerically stable. Strassen&#8217;s method is used when numerical stability is not critical and the matrices are large enough to provide a speed advantage. (The constant factor is large enough that for smaller matrices the naive method will work better.) Implementations of Strassen&#8217;s method will typically have a crossover point, below which matrices are multiplied using the naive method.</p>
<p>The current theoretical optimum is the <a href="http://en.wikipedia.org/wiki/Coppersmith–Winograd_algorithm">Coppersmith-Winograd algorithm</a> which runs in \(O(n^{2.376})\) time. It is almost never used in practice because the constant factor is so large that matrices of the size required to obtain an advantage over Strassen&#8217;s method cannot be processed by current hardware.</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Finding the remainder left behind when dividing a large number]]></title>
    <link href="http://vikhyat.net/blog//archives/2011/03/30/remainder-when-dividing-large-numbers/"/>
    <updated>2011-03-30T12:31:00+05:30</updated>
    <id>http://vikhyat.net/blog//archives/2011/03/30/remainder-when-dividing-large-numbers</id>
    <content type="html"><![CDATA[<p>It is easy to compute the remainder left behind upon dividing, for example, \( 2^{100} \) by \(3\) using modular arithmetic.</p>
<p>Modular arithmetic is a system of arithmetic in which numbers wrap around, or get ‘reset’ once they reach a certain value. You can think of it as arithmetic using a number circle as opposed to a number line.</p>
<p><!--more--></p>
<p>Consider a circle having circumference \(2\) units:</p>
<p><img src="http://vikhyat.net/blog//images/numbercircle.png"></p>
<p>First, notice that if you start at the point marked \(0\) and move \(2\) units clockwise, you would return to the point marked zero. Also note that, if we start at \(0\), moving \(3\) units clockwise and \(1\) unit clockwise will result in reaching the same destination. We represent this fact using the notation, \( 3 \equiv 1 \pmod 2 \), which is read as “\(3\) is congruent to \(1\) modulo \(2\)”. This is equivalent to saying that \(3\) and one leave the same remainder when divided by \(2\), or that \( (3 &#8211; 1) \) is an integral multiple of \(2\).</p>
<p>Hence, the statement \( x \equiv y \pmod a \) is equivalent to the following statements:</p>
<ol>
	<li>\( x-y \) is an integral multiple of \(a\), and</li>
	<li>\(x\) and \(y\) leave the same remainder upon division by \(a\).</li>
</ol>
<p>Modular arithmetic is very useful because of some of the properties of congruence relations. If \( a&#95;1 \equiv b&#95;1 \pmod n \) and \( a&#95;2 \equiv b&#95;2 \pmod n\), then the following properties will hold true.</p>
<p>$$ (a&#95;1 + a&#95;2) \equiv (b&#95;1 + b&#95;2) \pmod n $$ $$ (a&#95;1 &#8211; a&#95;2) \equiv (b&#95;1 &#8211; b&#95;2) \pmod n $$ $$ (a&#95;1 \cdot a&#95;2) \equiv (b&#95;1 \cdot b&#95;2) \pmod n $$</p>
<p>We will find the last property to be particularly useful.</p>
<h3>Example 1: Remainder upon dividing \( 2^{100} \) by \( 3 \)</h3>
<p>First, we note that \( 2 \equiv -1 \pmod 3 \).</p>
<p>Because of the last property, this implies that \( 2^{100} \equiv (-1)^{100} \pmod 3 \).</p>
<p>Because \( (-1)^{100} = 1 \), the remainder will be 1. This can be verified using <a href="http://www.wolframalpha.com/input/?i=2%5E100+mod+3">Wolfram&#124;Alpha</a>.</p>
<h3>Example 2: Remainder upon dividing \( \; 7^{2010} \) by \(25\)</h3>
<p>First, we note that \( 7^{2010} = 49^{1005} \). Now, because \( 49 \equiv -1 \pmod {25} \),</p>
<p>$$ 49^{1005} \equiv (-1)^{1005} \pmod {25} $$ $$ \Rightarrow 49^{1005} \equiv -1 \pmod {25} $$ $$ \Rightarrow 49^{1005} \equiv 24 \pmod {25} $$</p>
<p>In the last step, I added \(25\) to the right side of the congruence. I was able to do so because of the first property.</p>
<p>Hence, the remainder on dividing \( 7^{2010} \) by \(25\) is \(24\).</p>]]></content>
  </entry>
  
</feed>

