<?xml version="1.0" encoding="UTF-8" standalone="yes"?><oembed><version><![CDATA[1.0]]></version><provider_name><![CDATA[Azimuth]]></provider_name><provider_url><![CDATA[https://johncarlosbaez.wordpress.com]]></provider_url><author_name><![CDATA[John Baez]]></author_name><author_url><![CDATA[https://johncarlosbaez.wordpress.com/author/johncarlosbaez/]]></author_url><title><![CDATA[The Complexity Barrier]]></title><type><![CDATA[link]]></type><html><![CDATA[<p>Could we grow the whole universe with all its seeming complexity starting from a little seed?  How much can you do with just a little information?</p>
<p>People have contests about this.  My programmer friend Bruce Smith <a href="https://johncarlosbaez.wordpress.com/2011/10/06/chaitins-theorem-and-the-surprise-examination-paradox/#comment-8876">points out</a> this animation, produced using a program less than 4 kilobytes long:</p>
<p><span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='640' height='390' src='https://www.youtube.com/embed/FWmv1ykGzis?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0' allowfullscreen='true'></iframe></span> </p>
<p>As he notes:</p>
<blockquote><p>
&#8230;to be fair, the complexity of some of the OS, graphics drivers, and hardware should be included, but this is a lot less than you might think if you imagine rewriting it purely for compactness rather than for speed, and only including what this sort of program needs to produce output.
</p></blockquote>
<p><a href="http://decoy.iki.fi/">Sampo Syreeni</a> pointed me to this video, all generated from under 64 kilobytes of x86 code:</p>
<p><span class='embed-youtube' style='text-align:center; display: block;'><iframe class='youtube-player' type='text/html' width='640' height='390' src='https://www.youtube.com/embed/Y3n3c_8Nn2Y?version=3&#038;rel=1&#038;fs=1&#038;showsearch=0&#038;showinfo=1&#038;iv_load_policy=1&#038;wmode=transparent' frameborder='0' allowfullscreen='true'></iframe></span></p>
<p>As he points out, one trick is to use <i>symmetry</i>.</p>
<p>These fancy images produced from tiny amounts of information are examples of the &#8216;demoscene&#8217;. a computer art subculture where people produce <a href="http://en.wikipedia.org/wiki/Demo_%28computer_programming%29">demos</a>: non-interactive audio-visual computer presentations that run in real time.  </p>
<p>According to the <a href="http://en.wikipedia.org/wiki/Demoscene">Wikipedia article</a> on the demoscene:</p>
<blockquote><p>
Recent computer hardware advancements include faster processors, more memory, faster video graphics processors, and hardware 3D acceleration. With many of the past&#8217;s challenges removed, the focus in making demos has moved from squeezing as much out of the computer as possible to making stylish, beautiful, well-designed real time artwork [&#8230;]</p>
<p>The old tradition still lives on, though. <a href="http://en.wikipedia.org/wiki/Demoparty">Demo parties</a> have competitions with varying limitations in program size or platform (different series are called <a href="http://en.wikipedia.org/wiki/Compo_%28demoscene%29">compos</a>). On a modern computer the executable size may be limited to 64 kB or 4 kB. Programs of limited size are usually called <a href="http://en.wikipedia.org/wiki/Demo_%28computer_programming%29#Intros">intros</a>. In other compos the choice of platform is restricted; only old computers, like the 8-bit Commodore 64, or the 16-bit Amiga, or Atari ST, or mobile devices like handheld phones or PDAs are allowed. Such restrictions provide a challenge for coders, musicians and graphics artists and bring back the old motive of making a device do more than was intended in its original design.
</p></blockquote>
<p>What else can you do with just a little information?  Bruce listed a couple more things:</p>
<blockquote>
<p>&bull; Bill Gates’ first commercial success was an implementation of a useful version of BASIC in about 4000 bytes;</p>
<p>&bull; the complete genetic code of an organism can be as short as a few hundred thousand bytes, and that has to be encoded in a way that doesn’t allow for highly clever compression schemes.</p>
</blockquote>
<p>So if quite complex things can be compressed into fairly little information, you can&#8217;t help but wonder: how complex can something be?  </p>
<p>The answer: arbitrarily complex!  At least that&#8217;s true if we&#8217;re talking about the <b>Kolmogorov complexity</b> of a string of bits: namely, the length of the shortest computer program that prints it out.   Lots of long strings of bits can&#8217;t be compressed.   You can&#8217;t print most of them out using short programs, since there aren&#8217;t enough short programs to go around.</p>
<p>Of course, we need to fix a computer language ahead of time, so this is well-defined.  And we need to make sure the programs are written in binary, so the comparison is fair.  </p>
<p>So, things can be arbitrarily complex.  But here&#8217;s a more interesting question: how complex can we <i>prove</i> something to be?  </p>
<p>The answer is one of the most astounding facts I know.  It&#8217;s called <a href="http://en.wikipedia.org/wiki/Chaitin%27s_incompleteness_theorem#Chaitin.27s_incompleteness_theorem">Chaitin&#8217;s incompleteness theorem</a>.  It says, very roughly: </p>
<blockquote><p>
<b>There&#8217;s a number <i>L</i> such that we can&#8217;t prove the Kolmogorov complexity of any specific string of bits is bigger than <i>L</i>.</b>
</p></blockquote>
<p>Make sure you understand this.  For any number,<br />
we can prove there are infinitely many bit strings with  Kolmogorov complexity bigger than that.  But we can&#8217;t point to any <i>particular</i> bit string and prove its Kolmogorov complexity is bigger than <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' />! </p>
<p>Over on Google+, Allen Knutson wrote:</p>
<blockquote>
<p>That&#8217;s an incredibly disturbing theorem, like driving to the edge of the universe and finding a wall.
</p></blockquote>
<p>I call <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' /> the <b>complexity barrier</b>.  So one question is, how big is <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' />?  It&#8217;s hard, or perhaps even impossible, to find the smallest <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' /> that does the job.  But we can certainly find numbers <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' /> that work.  And they&#8217;re surprisingly small!</p>
<p>My friend Bruce estimates that the complexity barrier is <i>a few kilobytes</i>.  </p>
<p>I&#8217;d like to see a program a few kilobytes long that produces a video showing a big bang, the formation of stars and galaxies, then planets, including one where life evolves, then intelligent life, then the development of computers&#8230; and finally someone writing the very same program.  </p>
<p>I can&#8217;t prove it&#8217;s possible&#8230; but <i>you can&#8217;t prove it isn&#8217;t!</i></p>
<p>Let&#8217;s see why.  </p>
<p>For starters, we need to choose some axioms for our system of math, so we know what &#8216;provable&#8217; means.  We need a system that&#8217;s powerful enough to prove a bunch of basic facts about arithmetic, but simple enough that a computer program can check if a proof in this system is valid.  </p>
<p>There are lots of systems like this.  Three famous ones are <a href="http://en.wikipedia.org/wiki/Peano_axioms#First-order_theory_of_arithmetic">Peano arithmetic</a>, <a href="http://en.wikipedia.org/wiki/Robinson_arithmetic">Robinson arithmetic</a> (which is less powerful) and <a href="">Zermelo-Fraenkel set theory</a> (which is more powerful).</p>
<p>When you have a system of math like this, <a href="http://en.wikipedia.org/wiki/G%C3%B6del%27s_incompleteness_theorems#First_incompleteness_theorem">G&ouml;del&#8217;s first incompleteness theorem</a> kicks in: if the system is consistent,  it can&#8217;t be complete.  In other words, there are some questions it leaves unsettled.  This is why we shouldn&#8217;t be utterly shocked that while a bunch of bit strings have complexity more than <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' />, we can&#8217;t <i>prove</i> this.</p>
<p><a href="http://en.wikipedia.org/wiki/G%C3%B6del%27s_incompleteness_theorems#Second_incompleteness_theorem">G&ouml;del&#8217;s second incompleteness theorem</a> also kicks in: if the system can prove that it&#8217;s consistent, it&#8217;s not!  (If it&#8217;s not consistent, it can prove <i>anything</i>, so you shouldn&#8217;t trust it.)  So, there&#8217;s a sense in which we can never be completely sure that our system of math is consistent.  But let&#8217;s assume it is.</p>
<p>Given this, Chaitin&#8217;s theorem says:</p>
<blockquote><p> There exists a constant <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' /> such that no string of bits has Kolmogorov complexity that provably exceeds <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' />.
</p></blockquote>
<p>How can we get a number that does the job?  Any number <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' /> with</p>
<p><img src='https://s0.wp.com/latex.php?latex=U+%2B+%5Clog_2%28L%29+%2B+C+%3C+L+&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='U + &#92;log_2(L) + C &lt; L ' title='U + &#92;log_2(L) + C &lt; L ' class='latex' /></p>
<p>will do.  Here:</p>
<p>&bull; <img src='https://s0.wp.com/latex.php?latex=U&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='U' title='U' class='latex' /> is the length of a program where if you input a natural number <img src='https://s0.wp.com/latex.php?latex=i&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='i' title='i' class='latex' />, it will search through all proofs in Peano arithmetic until it finds one that proves some bit string has Kolmogorov complexity <img src='https://s0.wp.com/latex.php?latex=%3E+i&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='&gt; i' title='&gt; i' class='latex' />.  If it finds one, then it outputs this bit string.  If it never finds one, it grinds on endlessly.  (Of course, if <img src='https://s0.wp.com/latex.php?latex=i+%3D+L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='i = L' title='i = L' class='latex' />, it will never find one!)</p>
<p>&bull; <img src='https://s0.wp.com/latex.php?latex=C&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='C' title='C' class='latex' /> is a small overhead cost: the length of the extra &#039;glue&#039; to create a bigger program that takes the number <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' />, written out in binary, and feeds it into the program described above.  </p>
<p>The length of <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' /> written out in binary is about <img src='https://s0.wp.com/latex.php?latex=%5Clog_2%28L%29&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='&#92;log_2(L)' title='&#92;log_2(L)' class='latex' />.  This bigger program thus has length </p>
<p><img src='https://s0.wp.com/latex.php?latex=U+%2B+%5Clog_2%28L%29+%2B+C&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='U + &#92;log_2(L) + C' title='U + &#92;log_2(L) + C' class='latex' /> </p>
<p>and for the proof of Chaitin&#8217;s incompleteness theorem to work, we need this to be smaller than <img src='https://s0.wp.com/latex.php?latex=L.&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L.' title='L.' class='latex' />  Obviously we can accomplish this by making <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' /> big enough, since <img src='https://s0.wp.com/latex.php?latex=%5Clog_2+L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='&#92;log_2 L' title='&#92;log_2 L' class='latex' /> grows slower than <img src='https://s0.wp.com/latex.php?latex=L.&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L.' title='L.' class='latex' /></p>
<p>Given all the stuff I&#8217;ve told you, the proof of Chaitin&#8217;s theorem almost writes itself!  You run this bigger program I just described.  If there were a bit string whose Kolmogorov complexity is provably greater than <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' />, this program would print one out.  But that&#8217;s a contradiction, because this program has length less than <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' />.</p>
<p>So, we just need to pick a computer language and a suitable system of math, and estimate <img src='https://s0.wp.com/latex.php?latex=U&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='U' title='U' class='latex' /> and, less importantly because it&#8217;s so much smaller, <img src='https://s0.wp.com/latex.php?latex=C&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='C' title='C' class='latex' />.   Then <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' /> will be just a bit bigger than <img src='https://s0.wp.com/latex.php?latex=U+%2B+C&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='U + C' title='U + C' class='latex' />.</p>
<p>I picked the language C and Peano arithmetic and asked Bruce if he could guess, roughly, what answer we get for <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' />.  He replied:</p>
<blockquote><p>
I don&#8217;t think it can be done in C, since C semantics are not well-defined unless you specify a particular finite machine size. (Since C programs can do things like convert pointers to integers and back, tell you the size of any datatype, and convert data of any specified datatype to bytes and back.) On a finite machine of <img src='https://s0.wp.com/latex.php?latex=N&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='N' title='N' class='latex' /> bits, all programs either finish in time less than about <img src='https://s0.wp.com/latex.php?latex=2%5EN&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='2^N' title='2^N' class='latex' /> or take forever.</p>
<p>But if you take &#8220;C without size-specific operations&#8221;, or a higher level language like Python, or for that matter a different sort of low-level language like a Turing machine, then that&#8217;s not an issue &#8212; you can define a precise semantics that allows it to run a program for an arbitrarily long time and allocate an arbitrary number of objects in memory which contain pointers to each other. (To stick with the spirit of the question, for whatever language you choose, you&#8217;d want to disallow use of any large external batch of information like a &#8220;standard library&#8221;, except for whatever is so basic that you think of it as part of the native language. This is not a serious handicap for this problem.)</p>
<p>The main things that the program &#8216;<img src='https://s0.wp.com/latex.php?latex=U&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='U' title='U' class='latex' />&#8216; (I&#8217;d rather call the program itself &#8216;U&#8217; than call its length &#8216;<img src='https://s0.wp.com/latex.php?latex=U&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='U' title='U' class='latex' />&#8216;) needs to do are:</p>
<p>&bull; recognize a syntactically correct statement or proof;</p>
<p>&bull; check the validity of a purported proof;</p>
<p>&bull; recognize certain statements as saying or implying &#8220;The Kolmogorov complexity of <img src='https://s0.wp.com/latex.php?latex=n&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='n' title='n' class='latex' /> is more than <img src='https://s0.wp.com/latex.php?latex=i&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='i' title='i' class='latex' />&#8221; for some <img src='https://s0.wp.com/latex.php?latex=n&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='n' title='n' class='latex' /> and <img src='https://s0.wp.com/latex.php?latex=i&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='i' title='i' class='latex' />. (It&#8217;s not necessary to recognize all such statements, just at least one for each <img src='https://s0.wp.com/latex.php?latex=n&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='n' title='n' class='latex' /> and <img src='https://s0.wp.com/latex.php?latex=i&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='i' title='i' class='latex' />; so it can just recognize a statement that consists of some template with specific values of <img src='https://s0.wp.com/latex.php?latex=n&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='n' title='n' class='latex' /> and <img src='https://s0.wp.com/latex.php?latex=i&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='i' title='i' class='latex' /> inserted into it at certain places.)</p>
<p>Assuming that <img src='https://s0.wp.com/latex.php?latex=U&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='U' title='U' class='latex' /> expresses the proofs it wants to check in a practical proof language (which will be more like what a practical theorem-prover like <a href="http://en.wikipedia.org/wiki/Coq">Coq</a> uses than like what a traditional logician would recognize as &#8220;straight Peano arithmetic&#8221;, but which will not be excessively powerful in the spirit of this question), I&#8217;d estimate that the most complex part is checking proof validity, but that that can still be expressed in at most a few dozen syntactic rules, each expressible in a few lines of code. (The authors of a system like Coq, which includes code to actually do that, would know better, as long as they remember that the vast majority of their system&#8217;s actual code is not needed for this problem.)</p>
<p>This makes me think that even without trying to compact it much, in a reasonable language we could write <img src='https://s0.wp.com/latex.php?latex=U&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='U' title='U' class='latex' /> in a few hundred lines of code, or (after a bit of simple compression) a few thousand bytes. (And perhaps much less if we tried hard to compact the whole program in clever ways.)</p>
<p>So <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' /> will also be &#8220;a few thousand&#8221; (bytes or digits), or perhaps less, rather than some number you can never possibly count to.</p>
</blockquote>
<p>Does anyone know if Chaitin or someone actually went ahead a wrote a program that showed a specific value of <img src='https://s0.wp.com/latex.php?latex=L&#038;bg=ffffff&#038;fg=000&#038;s=0' alt='L' title='L' class='latex' /> would work?</p>
]]></html></oembed>