<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>

		<title>jtolds.com</title>
		<link>http://www.jtolds.com/</link>
		<description>JT Olds' RSS Feed</description>

		<language>en-us</language>
		<copyright>Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License</copyright>

<item>
	<title><![CDATA[Erdos number idea]]></title>
	<author>JT Olds</author>

	<link><![CDATA[http://www.jtolds.com/newsletter/2008/11/8/erdos-number-idea]]></link>

	<guid>1226131038</guid>
	<pubDate>Sat, 8 Nov 2008 07:57:18 +0000</pubDate>
	<description><![CDATA[<p>One of the ways to know how high up on the famous-mathematician ladder you are is to calculate your <a href="http://en.wikipedia.org/wiki/Erd%C5%91s_number">Erdos number</a>. <a href="http://en.wikipedia.org/wiki/Paul_Erd%C5%91s">Paul Erdos</a> was certainly very prolific. It's basically a game of <a href="http://en.wikipedia.org/wiki/Bacon_number">six degrees of Kevin Bacon</a>, but played with math papers, instead of movies, and Paul Erdos, instead of Kevin Bacon.</p><p>What's interesting (or not, if you realize the ubiquity of <a href="http://en.wikipedia.org/wiki/Small-world_network">small-world networks</a>), is that the median Erdos number is just 5. What's even more interesting is that, according to the <a href="http://www.oakland.edu/enp/trivia.html">Erdos number project</a>, the highest finite Erdos number is 13, with only 5 people in that state!</p><p>So, here's a more interesting game to me. Obviously I can't get an Erdos number of 1 (Paul Erdos is no longer among the living), and I suppose if I really dedicated my academic life to such a pursuit, I could probably reach some similarly low number. However, my interest sort of tapers off near the median (5), since that's common. What would be better is to be the 1 person with an Erdos number of 14! So, I need to write a paper with one of the 5 people that have an Erdos number of 13. More importantly, once I do, I can't screw it up by writing any papers with anyone else. Furthermore, I should probably choose the least likely of those 5 people to write more papers. I suppose I still have the problem in which any sub-path in the supposed full path from me to Erdos might collapse into a smaller path at any time. Hmm.</p><p>On a slightly related note, another interesting dimension is the intersection of the <a href="http://en.wikipedia.org/wiki/Erd%C5%91s-Bacon_number">Erdos number and the Bacon number</a>. The Erdos-Bacon number is the sum of someone's Erdos number and their Bacon number. Evidently the lowest such number is 3. <a href="http://en.wikipedia.org/wiki/Erd%C5%91s-Bacon_number#Methodology">Wikipedia's discussion</a> on how a lower number could be achieved is hilarious. Observe:</p><pre>The only way a lower number could be achieved would be:

    * for an individual who had co-authored an academic paper with Paul Erdos to
      appear in a movie with Kevin Bacon;
    * for Bacon to co-author an academic paper with someone with an Erdos number
      of 1, which would give Bacon an Erdos-Bacon number of 2;
    * for anyone who appeared in the documentary N is a Number along with Erdos
      to appear in a film with Bacon, which would posthumously give Erdos an
      Erdos-Bacon number of 2;
    * for Kevin Bacon to appear in a film that also uses stock footage of Erdos,
      giving Erdos an Erdos-Bacon number of 1;
    * for a heretofore unknown joint academic paper by Bacon and Erdos to be
      published, giving Bacon an Erdos-Bacon number of 1.</pre>]]></description>
</item>

<item>
	<title><![CDATA[To-Dlo!]]></title>
	<author>JT Olds</author>

    <link><![CDATA[http://www.jtolds.com/projects/p/to-dlo]]></link>

	<guid>1225568754</guid>
	<pubDate>Sat, 1 Nov 2008 19:45:54 +0000</pubDate>
	<description><![CDATA[<p>Back when I had a plain Nokia cellphone, I had this need to keep track of notes and todo lists. What I wanted was simply a service to which I could text message reminders and todo items that would store them for me on the internet. There were a few services that did similar things, but none scratched my particular itch. So, I wrote <a href="http://todlo.appspot.com/">the service I wanted</a>.</p>

<p>Please see <a href="http://todlo.appspot.com/about">To-Dlo's about page</a> for a more detailed explanation.</p>

<p><i>Note:</i> I just got my <a href="http://en.wikipedia.org/wiki/T-Mobile_G1">G1</a>, so I don't know how much more I'll be working on this. Perhaps I'll end up making an Android/iPhone interface.</p><br/><a href="http://www.jtolds.com/projects/p/to-dlo">Please click here to read more and see the project's associated files.</a>]]></description>
</item>

<item>
	<title><![CDATA[Website ported to Google App Engine]]></title>
	<author>JT Olds</author>

	<link><![CDATA[http://www.jtolds.com/newsletter/2008/10/31/website-ported-to-google-app-engine]]></link>

	<guid>1225483780</guid>
	<pubDate>Fri, 31 Oct 2008 20:09:40 +0000</pubDate>
	<description><![CDATA[<p>I just converted my website to Google App Engine (you can tell if any website is running on GAE if the <a href="/form">/form</a> URL returns a Google error). As you may notice, there is now a <a href="/feeds/">feeds</a> page. Furthermore, the categories for my "newsletter" are now more useful. A newsletter entry can be in more than one category, and there is an RSS feed for each category. So, if, say, you want to subscribe to my website's feeds about <a href="/newsletter/category/math">math</a> and <a href="/newsletter/category/programming">programming</a> but not <a href="/newsletter/category/politics">politics</a>, you are now able to do so.</p>
]]></description>
</item>

<item>
	<title><![CDATA[Primes]]></title>
	<author>JT Olds</author>

	<link><![CDATA[http://www.jtolds.com/newsletter/2008/10/7/primes]]></link>

	<guid>1223419334</guid>
	<pubDate>Tue, 7 Oct 2008 22:42:14 +0000</pubDate>
	<description><![CDATA[<i><b>Update:</b> oh my goodness. Had I just checked the Wikipedia's entry on <a href="http://en.wikipedia.org/wiki/Prime_number">Prime numbers</a>, I would have been reminded of fundamental things like the <a href="http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes">Sieve of Eratosthenes</a> (which I of course forgot the name of, but the idea is featured prominently in my parallel algorithm, mentioned at the end of this post) and <a href="http://en.wikipedia.org/wiki/Sieve_of_Atkin">newer improvements</a>, along with a <a href="http://en.wikipedia.org/wiki/Prime_gap">ton</a> <a href="http://en.wikipedia.org/wiki/Formula_for_primes">of</a> <a href="http://en.wikipedia.org/wiki/Primality_test">other</a> <a href="http://en.wikipedia.org/wiki/Prime-counting_function">incredibly</a> <a href="http://en.wikipedia.org/wiki/Prime_number_theorem">interesting</a> <a href="http://en.wikipedia.org/wiki/Perfect_number#Even_perfect_numbers">facts</a>, and even <a href="http://en.wikipedia.org/wiki/Image:PrimeNumbersSmall.png">a prime distribution graph</a>! Wikipedia: +1, JT: 0</i><br/>
<br/>
In my static analysis meeting, my professor noted that indexing objects with primes led to an easy set representation scheme, in which a set is simply the product of the prime indices of the objects in that set. I thought this was pretty fascinating. I started wondering about the constraints involved in implementing such a scheme, and inevitably this led to rather worthless homework procrastination that I thought I'd share here.<br/>
<br/>
First, I was curious about prime number distribution over the integers. I made a graph.<br/>
<img src="/newsletter/images/primes.png" alt="prime number distribution"/><br/>
So, how to read the graph. At a given point X on the X-axis, there are Y-many prime numbers within a diameter of 100,000 around X. In other words, it's a histogram of all primes below 1 billion, displayed with 10,000 buckets.<br/>
<br/>
Second (but really a prerequisite to the first), I wrote a program to quickly generate as many prime numbers as possible.<br/>
<style type="text/css"><!-- /**  * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann  * (http://qbnz.com/highlighter/ and http://geshi.org/)  */ .cpp.cpp .de1, .cpp.cpp .de2 {font-family: monospace; font-weight: normal; font-style: normal; margin:0; padding:0; background:inherit;color: #000020;} .cpp.cpp  {font-family:monospace;color: #006; border: 1px solid #d0d0d0; background-color: #f0f0f0; font-size: 10px; padding-left: 20px;} .cpp.cpp a:link {color: #000060;} .cpp.cpp a:hover {background-color: #f0f000;} .cpp.cpp .imp {font-weight: bold; color: red;} .cpp.cpp li, .cpp.cpp .li1 {font-weight: normal;font: normal normal 130% 'Courier New', Courier, monospace; color: #003030;} .cpp.cpp .ln {width:1px;font-weight: normal;text-align:right;margin:0;padding:0 2px;} .cpp.cpp .li2 {font-weight: bold;font-weight: bold; color: #006060;} .cpp.cpp .kw1 {color: #0000ff;} .cpp.cpp .kw2 {color: #0000ff;} .cpp.cpp .kw3 {color: #0000dd;} .cpp.cpp .kw4 {color: #0000ff;} .cpp.cpp .co1 {color: #666666;} .cpp.cpp .co2 {color: #339900;} .cpp.cpp .coMULTI {color: #ff0000; font-style: italic;} .cpp.cpp .es_h {color: #666666; font-weight: bold;} .cpp.cpp .br0 {color: #008000;} .cpp.cpp .sy0 {color: #008000;} .cpp.cpp .sy1 {color: #000080;} .cpp.cpp .sy2 {color: #000040;} .cpp.cpp .sy3 {color: #000040;} .cpp.cpp .sy4 {color: #008080;} .cpp.cpp .st0 {color: #FF0000;} .cpp.cpp .nu0 {color: #0000dd;} .cpp.cpp .nu6 {color: #208080;} .cpp.cpp .nu8 {color: #208080;} .cpp.cpp .nu12 {color: #208080;} .cpp.cpp .nu16 {color:#800080;} .cpp.cpp .nu17 {color:#800080;} .cpp.cpp .nu18 {color:#800080;} .cpp.cpp .nu19 {color:#800080;} .cpp.cpp .me1 {color: #007788;} .cpp.cpp .me2 {color: #007788;} .cpp.cpp span.xtra { display:block; }  --!></style><div class="cpp cpp" style="font-family:monospace;color: #006; border: 1px solid #d0d0d0; background-color: #f0f0f0;"><ol><li class="li1"><div class="de1"><span class="co2">#include &lt;iostream&gt;</span></div></li> <li class="li1"><div class="de1"><span class="co2">#include &lt;list&gt;</span></div></li> <li class="li1"><div class="de1"><span class="co2">#include &lt;math.h&gt;</span></div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li2"><div class="de2"><span class="kw2">using</span> <span class="kw2">namespace</span> std;</div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1"><span class="co1">// this program finds all primes &lt;= 1 billion and notes if they are twin primes</span></div></li> <li class="li1"><div class="de1"><span class="co1">// or mersenne primes.</span></div></li> <li class="li1"><div class="de1"><span class="co1">// compile with (on JT's machine):</span></div></li> <li class="li2"><div class="de2"><span class="co1">// g++ -O3 -march=nocona -funroll-loops -fomit-frame-pointer -o primes primes.cpp</span></div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1"><span class="kw2">inline</span> <span class="kw4">bool</span> is_mersenne<span class="br0">&#40;</span><span class="kw4">int</span> val<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// so, ((x - 1) &amp; x) is 0 iff x is a power of 2. See</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// http://www.cprogramming.com/tutorial/powtwosol.html for a good</span></div></li> <li class="li2"><div class="de2">&nbsp; &nbsp; <span class="co1">// explanation of why.</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// since a mersenne number should be of the form 2^n - 1,</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// (x &amp; (x + 1)) is 0 iff x is of form 2^n - 1.</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="sy3">!</span><span class="br0">&#40;</span>val <span class="sy3">&amp;</span> <span class="br0">&#40;</span>val <span class="sy2">+</span> <span class="nu0">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li> <li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li> <li class="li2"><div class="de2">&nbsp;</div></li> <li class="li1"><div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc, <span class="kw4">char</span><span class="sy2">**</span> argv<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// strategy: as we calculate primes, we store previous primes so we only</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// have to check divisibility by known primes to know if a new number is</span></div></li> <li class="li2"><div class="de2">&nbsp; &nbsp; <span class="co1">// prime.</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; list<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span> primes;</div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// largest_number is the largest number we will check for primeness</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> largest_number <span class="sy1">=</span> <span class="nu0">1000000000</span>; <span class="co1">// 1,000,000,000</span></div></li> <li class="li2"><div class="de2">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// we use last_prime to keep track of if the last number we checked was</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// prime. this way determining twin primes is easy.</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw4">bool</span> last_prime <span class="sy1">=</span> <span class="kw2">true</span>;</div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li2"><div class="de2">&nbsp; &nbsp; <span class="co1">// book keeping</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw4">bool</span> factor_found;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw4">int</span> sqrt_i;</div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// we start with 3, because 3 and every prime after is odd, so we can</span></div></li> <li class="li2"><div class="de2">&nbsp; &nbsp; <span class="co1">// increment by 2.</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; primes.<span class="me1">push_back</span><span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span>;</div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// we don't check divisibility by 1, since that's always true, but we output</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// it and 2 as primes.</span></div></li> <li class="li2"><div class="de2">&nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="nu0">1</span> <span class="sy1">&lt;&lt;</span> endl <span class="sy1">&lt;&lt;</span> <span class="nu0">2</span> <span class="sy1">&lt;&lt;</span> endl;</div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// check all odd numbers starting with 3 until the largest number</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">3</span>; i <span class="sy1">&lt;=</span> largest_number; i <span class="sy2">+</span><span class="sy1">=</span> <span class="nu0">2</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// no factor found yet.</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; factor_found <span class="sy1">=</span> <span class="kw2">false</span>;</div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// store the square root of the number we're checking. we only need to</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// check up to the square root.</span></div></li> <li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; sqrt_i <span class="sy1">=</span> <span class="kw3">sqrt</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>;</div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// iterate over previously calculated primes up to the square root of</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// the current number. note that we don't have to check if the iterator</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// is primes.end() because there is empirically always a prime stored</span></div></li> <li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// greater than the square root of the number we're checking. i wonder</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// if there's a proof there. it would probably be of the form of proving</span></div></li><li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// that for a given integer i, a prime p exists such that i &lt;= p &lt; i^2</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span>list<span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span><span class="sy4">::</span><span class="me2">iterator</span> it<span class="br0">&#40;</span>primes.<span class="me1">begin</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="sy2">*</span>it <span class="sy1">&lt;=</span> sqrt_i; <span class="sy2">++</span>it<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// if the current number mod the current prime is 0, we found a</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// factor. not prime, break out.</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>i <span class="sy2">%</span> <span class="sy2">*</span>it <span class="sy1">==</span> <span class="nu19">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; factor_found <span class="sy1">=</span> <span class="kw2">true</span>;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span>;</div></li> <li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span><span class="sy3">!</span>factor_found<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li> <li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// no factor found! this is a prime. store it.</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; primes.<span class="me1">push_back</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>;</div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// output the prime</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> i;</div></li> <li class="li2"><div class="de2">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// is it a twin prime? (p, p+2)</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>last_prime<span class="br0">&#41;</span> <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot; *&quot;</span>;</div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// is it a mersenne prime? (2^n-1)</span></div></li> <li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>is_mersenne<span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> <span class="st0">&quot; +&quot;</span>;</div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">cout</span> <span class="sy1">&lt;&lt;</span> endl;</div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// keep track of if the last number was prime.</span></div></li> <li class="li2"><div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; last_prime <span class="sy1">=</span> <span class="kw2">true</span>;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; last_prime <span class="sy1">=</span> <span class="kw2">false</span>;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li2"><div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li> <li class="li1"><div class="de1">&nbsp;</div></li> <li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="nu19">0</span>;</div></li> <li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li> </ol></div><br/>
Third, I think I've figured out a pretty clever algorithm for parallelizing the computation of primes. I was inspired by <a href="http://en.wikipedia.org/wiki/Software_pipelining">software pipelining</a>. I hope to actually write up the algorithm to check its effectiveness. I'll post it here if/when I do. Stay tuned.]]></description>
</item>

<item>
	<title><![CDATA[VP debate]]></title>
	<author>JT Olds</author>

	<link><![CDATA[http://www.jtolds.com/newsletter/2008/10/3/vp-debate]]></link>

	<guid>1223005980</guid>
	<pubDate>Fri, 3 Oct 2008 03:53:00 +0000</pubDate>
	<description><![CDATA[The best moment of the VP debate was the amazing irony captured below:<br/>
<br/>
<i>"I like being able to answer these tough questions without the filter, even, of the mainstream media kind of telling viewers what they've just heard."</i><br/>
<img src="/newsletter/images/palin1.png" alt="palin"/><br/>
<br/>
Note the literal filter of what a survey group in Ohio is thinking, projected on to CNN's coverage, literally suggesting to viewers something about what they've just heard. Ha. I laughed so hard when she said that. I was bothered the entire time by CNN telling me what to be feeling.]]></description>
</item>

<item>
	<title><![CDATA[Google Blog Search updated]]></title>
	<author>JT Olds</author>

	<link><![CDATA[http://www.jtolds.com/newsletter/2008/10/1/google-blog-search-updated]]></link>

	<guid>1222903968</guid>
	<pubDate>Wed, 1 Oct 2008 23:32:48 +0000</pubDate>
	<description><![CDATA[So, Google Blog Search just turned into something way more awesome. Still not incredibly awesome though. For it to be incredibly awesome, they need to add RSS feeds. I'll explain that in a bit.<br/>
<br/>
<a href="http://blogsearch.google.com">The front page of Google Blog Search</a> is now a feed aggregator, keeping track of the most popular stories currently on the internet, and is filterable by topic (on the left).<br/>
<br/>
Yes.<br/>
<br/>
This is exactly the sort of thing for which I have been relying on the Techmeme family of websites (<a href="http://www.techmeme.com/">Techmeme</a>, <a href="http://www.memeorandum.com/">memeorandum</a>, etc). However, Google's solution is much more open to other categories. I think this notion of stories being independent from the feeds which contain them, combined with a measure of how many feeds are talking about a particular story, is incredibly important. This is a major stepping stone for my <a href="/newsletter/5/44/">previous post on news aggregation</a>.<br/>
<br/>
The downside, of course (there's always a downside), is that Google's new feed aggregator is lacking in a bunch of fundamental features. Clearly this is just a homepage for their main product of "blog search," but it seems painfully clear that they didn't really want to put both feet into the feed aggregator market. I went to look for an RSS feed of the content on their homepage and in the specific topics, but they don't even have that. Whoa.<br/>
<br/>
Google, add that. Please.<br/>
<br/>
<b>Update:</b> Here's <a href="http://www.techcrunch.com/2008/10/01/google-launches-its-own-memetracker/">TechCrunch's coverage</a>, and <a href="http://googleblog.blogspot.com/2008/10/browse-what-world-is-saying-on-blog.html">Google's original announcement</a>.]]></description>
</item>

<item>
	<title><![CDATA[News aggregation and economics]]></title>
	<author>JT Olds</author>

	<link><![CDATA[http://www.jtolds.com/newsletter/2008/9/24/news-aggregation-and-economics]]></link>

	<guid>1222289886</guid>
	<pubDate>Wed, 24 Sep 2008 20:58:06 +0000</pubDate>
	<description><![CDATA[Currently, news websites and newspapers have news for people at the granularity of a day. Headlines are day-specific, and there is no way to decrease your granularity. Say you've been out of touch for a week or a month. I want to just read the major headlines over that week or month. As it is, however, I can only read the last few headlines for the last few days if I want to catch up, and hope that enough information is there to explain what's going on.
<br/>

<br/>
Really, what would be nice is, given a timescale (a week, 2 weeks, 13 days, a month, or something), a news service would feed back the most important headlines or news stories sorted by topic that happened over that timescale such that it would be easy to get up to speed on what happened. Even better (but harder): summaries of each issue.
<br/>

<br/>
By the way, the above service is <i>totally</i> on my list of things I think would make for a successful startup. If someone gets involved making the above thing, <a href="/contact/">I want to be involved</a>. It shouldn't be that spectacularly hard. I can't imagine it would be much different than the technology that runs the Techmeme family of news websites (<a href="http://www.techmeme.com/">Techmeme</a>, <a href="http://www.memeorandum.com/">memeorandum</a>, <a href="http://www.ballbug.com/">Ballbug</a>, and <a href="http://www.wesmirch.com/">WeSmirch</a>). Seems like a perfect Google App Engine application once they roll out automated job support.
<br/>

<br/>
Occasionally news services do this manually for stories when really big stuff happens. I link to <s>two</s> <i>three</i> of those that seem relatively important right now.<ul><li><a href="http://money.cnn.com/2008/09/15/news/economy/subprime_timeline/index.htm">Subprime timeline</a></li><li><a href="http://money.cnn.hu/galleries/2008/news/0809/gallery.week_that_broke_wall_street/index.html">The crisis: A timeline</a></li><li><b>New:</b> <a href="http://culture11.com/node/32322">5 Easy Pieces</a></li></ul>]]></description>
</item>

<item>
	<title><![CDATA[Re: An open letter to "the religious right"]]></title>
	<author>JT Olds</author>

	<link><![CDATA[http://www.jtolds.com/newsletter/2008/9/12/re-an-open-letter-to-the-religious-right]]></link>

	<guid>1221249962</guid>
	<pubDate>Fri, 12 Sep 2008 20:06:02 +0000</pubDate>
	<description><![CDATA[<span class="highlight"><i><b>Update:</b> more discussion by a friend <a href="http://economicthought.blogspot.com/2008/09/faith-empirical-question-yes-and-no.html">here</a>.</i></span>
<br/>

<br/>
<a href="http://culture11.com/user/13/view">Joe Carter</a> writes <a href="http://culture11.com/node/32162?page_view=1">Being on God's Side: An open letter to "the religious right"</a>. I'm replying to his point #10.
<br/>

<br/>
Disclaimer: according to his definition of "religious right" at the beginning of the article, evidently I fall into that category, though I'm starting to doubt I would ever define myself that way, as I'm finding I'm not incredibly politically conservative.
<br/>

<br/>
At the end of the article, Joe says that "because the Bible says so" is not a reasonably persuasive argument to put forward in a political discourse. Instead, he posits that the religious right should make efforts to find arguments that support their beliefs, and use those as reasoning for political motivation.
<br/>

<br/>
I think this is inherently, and in some senses, disastrously, backwards. Arguments should not be found to support beliefs, though I'd say the common occurrence of this is unfortunately part of the human condition <span class="highlight"><i>(<b>Update:</b> A related quote: "The difficulty lies, not in new ideas, but in escaping from the old ones, which ramify, for those brought up as most of us have been, into every corner of our minds." -John Maynard Keynes)</i></span>. Instead, beliefs should be founded on arguments.
<br/>

<br/>
Let me explain. <i>Belief</i> is an indication that someone says they <i>know</i> something. A belief is actually knowledge if the belief is true (describing this distinction between belief and knowledge is what the whole field of <a href="http://en.wikipedia.org/wiki/Epistemology">epistemology</a> is all about). In other words, the human action of belief is, in some sense, the manifestation of attempting to understand the world by forming an hypothesis about what is true.
<br/>

<br/>
I am a firm believer (haha, believer) that there is an external truth that is true regardless of anyone's beliefs about it. I don't think truth is subjective. I think it's quite seriously objective. So, the question is, does a belief matter if it's untrue? My answer? No.
<br/>

<br/>
Now, bringing this back to Joe Carter's article, I am not attacking anyone in "the religious right"'s beliefs in any way. Evidently, if I was, I would be guilty of attacking myself. What I am saying is that those beliefs should be based on reason, and not the other way around. There are reasons for having the beliefs the religious right have, but if those reasons were to vaporize, we should not try to construct new reasons to support our existing beliefs; instead, we should endeavor to make sure our beliefs are solidified by existing reasons. If the belief is true (and therefore matters), then there is a reason. No need to make any up. And while I doubt Joe Carter would ever suggest that making up reasons is a good idea, I think his inverted order of priorities in <a href="http://www.wsu.edu/~brians/errors/affect.html">effecting</a> political discourse is prone to incite this sort of thing.
<br/>

<br/>]]></description>
</item>

<item>
	<title><![CDATA[Grooveshark: Awesome]]></title>
	<author>JT Olds</author>

	<link><![CDATA[http://www.jtolds.com/newsletter/2008/9/12/grooveshark-awesome]]></link>

	<guid>1221247440</guid>
	<pubDate>Fri, 12 Sep 2008 19:24:00 +0000</pubDate>
	<description><![CDATA[I got this email back from Grooveshark a day or two ago, responding I guess not to my email, but to <a href="/newsletter/1/41/">this blog post</a>. Evidently they are either working on or at least aware of the issues I pointed out. Yay.<br/>
<br/>
To: me. :)<br/>
Subject: Greetings from Grooveshark<br/>
<br/>
Hey JT,<br/>
<br/>
First off, thanks so much for all your help and interest. Incredibly thoughtful feedback like yours is something we don't see too terribly often, and it really makes my day. We're a small bunch, and we're insanely grateful for you checking us out--and doubly so for taking the time to give us all your thoughts and kindness.<br/>
<br/>
The biggest suggestion/critique you mentioned is the duplication of results in searching/displaying/adding to your queue--which is definitely valid! I understand exactly where you're coming from, not just as a Grooveshark employee, but as someone who uses Grooveshark on a daily basis. Ironically, this is also something we have spent a long time analyzing and trying to figure out the best solution for. We've considered audio fingerprinting, something like CDDB (Gracenote), and various kinds of internal sorting. We made a large push to map many-to-one relationships in our database, so that the 500 copies of Money for Nothing would be collapsed into one display result that is then linked to all the versions users have uploaded.  Unfortunately, it was a bit more difficult than we anticipated (as huge database shifts seem to be :-).<br/>
<br/>
Though we're working on ways to fix this (our Editing system is nearly complete), we've been having to focus a bunch of time on keeping all of our servers/load stable and everything generally working.<br/>
<br/>
Other points:<br/>
<br/>
Search! If you do a search for "Honey, as an example, then click artists, it does actually parse through both artist names *and* songs by artists with the given phrase. So when I search for Honey and click on artists, I see Van Morrison (thanks to his song "Tupelo Honey"). The results aren't as refined as we'd like them to be, but fortunately the basic infrastructure is there. But you're still right on about it filtering the displayed songs under the given artists based on the search query.<br/>
<br/>
Favorite Playlist, or add to your queue: I agree!<br/>
<br/>
Autoplay Distinction: Since Autoplay is a pretty new feature, we're working on exactly how we think it should work, in both implementation and the backend algorithm that determines that songs are suitable. If there is any runover between songs recommended during a soft rock session and a jazz session (there should hopefully be very little), you can see which songs you have Hearted or Smiled/Frowned in the past, and adjust how they make you feel during this particular current Autoplay. Also, since we're still gathering a bunch of data on what songs *should* be recommended to other songs, this should get better. We're soon going to start mapping song-to-song recommendations, so the overall feeling of one Autoplay won't be compromised as much as they are with artist-to-artist recommendations (what we have now).<br/>
<br/>
But in essence, songs that are chosen as recommendations during Autoplay are only based on what songs previously appear in the queue for that particular Autoplay. Basically, as you wished, the integrity is maintained because it only recommends based on what you've been listening to during this session, but we still want to make the song-to-song recommendations much better.<br/>
<br/>
Recently Played being actually useful: again, completely agree! We will!<br/>
<br/>
Phew, that was quite a mouthful to type! Hopefully I cleared up some confusion and answered your questions satisfactorily--but I know I get pretty confusing sometimes. If there's anything I was too vague about, or if you have absolutely any other questions, suggestions, requests, bugs, or anything else on your mind, I'm more than happy to help!<br/>
<br/>
Again, thanks so much for everything, JT. It means so much to us, and I wanted to personally reply to your amazing email. Don't hesitate to get in touch with me personally at <i>[email removed for spam harvesting reasons]</i>, or on Twitter at <a href="http://twitter.com/grooveshark">http://twitter.com/grooveshark</a>. You rock, and I hope to hear back soon!<br/>
<br/>
Regards,<br/>
Ben]]></description>
</item>

<item>
	<title><![CDATA[To Grooveshark: So close to awesome.]]></title>
	<author>JT Olds</author>

	<link><![CDATA[http://www.jtolds.com/newsletter/2008/9/10/to-grooveshark-so-close-to-awesome]]></link>

	<guid>1221017729</guid>
	<pubDate>Wed, 10 Sep 2008 03:35:29 +0000</pubDate>
	<description><![CDATA[<span class="highlight"><b>Another update:</b> <a href="/newsletter/1/42/">They responded.</a></span><br/>
<br/>
The following is a (slightly modified) email I just sent to Grooveshark's feedback system. If you haven't seen Grooveshark yet, it's so close to awesome, but check it out! <a href="http://listen.grooveshark.com/">http://listen.grooveshark.com/</a><br/>
<br/>
<div class="highlight"><b>Update:</b> So, the email below laments the song fragmentation on Grooveshark. Since sending, I've decided that my suggestions just might already be implemented on Grooveshark, and I'm not noticing them due to user interface crappiness. Basically, I'm upset that when I search for a music artist, I want to add <i>one</i> of each of their unique songs into my play queue. The easiest way to add all of an artist's songs is to search for them, go to the artist search results, and drag in their name into your queue. That ends up with <i>tons</i> of song duplicates though. However, the initial search results do seem to do a pretty good job of removing duplicate songs. But there's no way to just say "add all these to my queue." So, that would be easy to fix.</div><br/>
To: feedback@grooveshark<br/>
Subject: So close to awesome!<br/>
<br/>
Grooveshark is amazing, and potentially a complete game changer. I've found that while I used to listen to my meticulously organized music collection, I now find myself using Grooveshark in many cases instead.<br/>
<br/>
Completely ignoring the possibly uncountable future directions Grooveshark could move <i>[(they have so much potential! they could become the universal music gateway, streaming any music you want to any device you have!)]</i>, here's the biggest problems <i>[(besides a worrisome revenue model)]</i> with Grooveshark I've found that prevent it from replacing my music library completely, in decreasing order:<br/>
<br/>
<ul><li>Grooveshark suffers from massive fragmentation of songs. Popular songs are listed thousands of times in a search, while unpopular songs are listed maybe once or twice. This is to be expected for a service that culls its musical library from its diverse users. <b>However</b>: this could be <i>easily</i> fixed by employing some sort of audio fingerprinting to identify duplicate songs, and only list songs once. I vaguely understand that users get compensated when <i>their</i> version of a song is used, but this is a huge user interface problem. Implement audio fingerprinting-based duplicate removal, and choose which user gets compensated via round robin selection. Or whichever song is of the highest quality. Or something. Suggestion for audio fingerprinting? Look at <a href="http://musicbrainz.org/">http://musicbrainz.org/</a>.</li></ul><br/>
All the other problems below are tiny compared to the huge, glaring one above.<br/>
<br/>
<ul><li>The search interface is unintuitive. When I search for a term, I want the initial response list to be every song that matches the term. Then, when I click "Artists", I want to filter those results, not get a list of all artists that matched that search. When I click a specific artist, I want the songs that matched my search from that artist, not all songs from that artist, since the artist matched my search. Really, the iTunes interface is great. You can search, and then add filters by selecting Artists or Albums by which to filter. Just do it that way.</li><li>I want to be able to drag my whole list of favorites (a new feature, I understand) into my queue.</li><li>I want to have profiles for the autoplay feature. I want to train the machine learning algorithm behind it with soft rock when I'm in a soft rock mood, and not have that affect the training of jazz I did when I was in a jazz mood. <i>[Haha, as an example. Smooth jazz rocks.]</i></li><li><b>Update:</b> Please cache the most recent play queue between website visits! That way, if someone accidentally closes a window or navigates away from Grooveshark, they can return and not lose their play queue. You could even do it just for logged in users.</li></ul><br/>
All in all, a great product, but please add audio fingerprinting-based duplicate removal! <i>Please!</i><br/>
<br/>
(I'm posting this to my blog, too)<br/>
<br/>
-JT]]></description>
</item>

	</channel>
</rss>
