{"id":952,"date":"2010-08-09T11:30:12","date_gmt":"2010-08-09T15:30:12","guid":{"rendered":"http:\/\/scientopia.org\/blogs\/goodmath\/?p=952"},"modified":"2010-08-09T11:30:12","modified_gmt":"2010-08-09T15:30:12","slug":"holy-freaking-cow-p-np","status":"publish","type":"post","link":"http:\/\/www.goodmath.org\/blog\/2010\/08\/09\/holy-freaking-cow-p-np\/","title":{"rendered":"Holy Freaking Cow&#8230; P != NP??"},"content":{"rendered":"<p> Very<\/em> big, <em>very<\/em> exciting news in the theoretical comp sci world today!<\/p>\n<p> A group at HP research has <a href=\"http:\/\/www.scribd.com\/doc\/35539144\/pnp12pt\">published a proof<\/a> that, if correct, shows that <em>the<\/em> classic problem of computational complexity has been solved, once and for all. It&#8217;s still far from certain that it&#8217;s correct. But it&#8217;s the most credible attempt that I&#8217;ve ever seen, and it&#8217;s getting some preliminary favorable feedback from big-names in complexity theory. In fact, one of the <em>biggest<\/em> names in complexity theory, Stephen Cook, has apparently said that it should be taken seriously. If Cook thinks it&#8217;s credible, then it&#8217;s damn-well credible. It might not be <em>correct<\/em>, but it&#8217;s not just crackpottery either.<\/p>\n<p> For the non-CS folks out there, here&#8217;s my attempt to explain what the problem is, and what the solution means.<\/p>\n<p><!--more--><\/p>\n<p> One of the most important areas of theoretical computer science is complexity theory. What complexity theory does is try to characterize, in an abstract way, how long it takes for an algorithm to solve a given problem. In some cases, we can do better that showing how long a single algorithm takes; we can actually analyze the problem, and show intrinsic properties of the problem that dictate a minimum amount of time to compute a solution.<\/p>\n<p> We tend to describe the complexity in terms of functions on the size of an input. So, for example, suppose you&#8217;re given a list of N names, and you&#8217;d like to get them into sorted order. You <em>can&#8217;t<\/em> do than with fewer than <img src='http:\/\/l.wordpress.com\/latex.php?latex=n%20lg_2%28n%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='n lg_2(n)' style='vertical-align:1%' class='tex' alt='n lg_2(n)' \/> comparisons. So, speaking very roughly, we can say that sorting a list of strings has complexity <img src='http:\/\/l.wordpress.com\/latex.php?latex=O%28n%20lg_2%28n%29%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='O(n lg_2(n))' style='vertical-align:1%' class='tex' alt='O(n lg_2(n))' \/> in number of comparisons.<\/p>\n<p> One way of proving that is based on Kolmogorov-Chaitin complexity. Given a list of <img src='http:\/\/l.wordpress.com\/latex.php?latex=N&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='N' style='vertical-align:1%' class='tex' alt='N' \/> names, there are <img src='http:\/\/l.wordpress.com\/latex.php?latex=%28N%21%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='(N!)' style='vertical-align:1%' class='tex' alt='(N!)' \/> possible orderings of that list. To be able to sort the list, essentially, we need to identify which ordering of the list we were given, so that we can select the right permutation the re-arrange it into sorted order. The particular permutation is one of the <img src='http:\/\/l.wordpress.com\/latex.php?latex=%28N%21%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='(N!)' style='vertical-align:1%' class='tex' alt='(N!)' \/> possible ones. To select one of those, we need to know the number that identifies the permutation in a list. So we need <img src='http:\/\/l.wordpress.com\/latex.php?latex=lg_2%28N%21%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='lg_2(N!)' style='vertical-align:1%' class='tex' alt='lg_2(N!)' \/> bits &#8211; which is <img src='http:\/\/l.wordpress.com\/latex.php?latex=O%28n%20lg_2%28n%29%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='O(n lg_2(n))' style='vertical-align:1%' class='tex' alt='O(n lg_2(n))' \/> bits. A comparison generates exactly one bit of data. So we need to do <img src='http:\/\/l.wordpress.com\/latex.php?latex=O%28n%20lg_2%28n%29%29&#038;bg=FFFFFF&#038;fg=000000&#038;s=0' title='O(n lg_2(n))' style='vertical-align:1%' class='tex' alt='O(n lg_2(n))' \/> comparisons.<\/p>\n<p> Moving on, we can broadly characterize the complexity of algorithms in terms of the functions that describe the complexity bounds. We can talk about constant-time algorithms; sub-linear time algorithms; linear time; quadratic time; etc.<\/p>\n<p> The most important distinction in terms of complexity is <em>polynomial time<\/em> versus <em>exponential time<\/em>.  A problem or algorithm is polynomial time if its complexity function is no larger than something which can be expressed as a fixed polynomial. We call the set of problems that can be solved in polynomial time <b>P<\/b>.  It&#8217;s exponential time if it&#8217;s no <em>smaller<\/em> than something which must be expressed with a variable exponent; we call things that require exponential time <b>EXP<\/b>.<\/p>\n<p> In very general terms, we tend to say that something which is polynomial time is solvable in practical terms; whereas something which is exponential time, we can&#8217;t solve non-trivial examples before the universe comes to an end.<\/p>\n<p> Within the exponential-time domain, there&#8217;s a really important subset, which we care about, called <b>NP<\/b>. NP stands for <em>nondeterministically polynomial-time<\/em>. Once again, speaking very loosely, problems in NP are problems where to the best of our knowledge, <em>computing<\/em> a solution to the problem is in EXP; but checking a solution for correctness is in P.<\/p>\n<p> NP contains a lot of very classical and very important problems. For example, there&#8217;s the traveling salesman problem: given a set of N cities, what&#8217;s the shortest route which visits all of them? Actually getting the optimum answer for that is amazingly difficult! It&#8217;s an NP problem. <\/p>\n<p> One of the questions that has plagued computer scientists for decades is: does P = NP? In other words, does the fact that a solution is testable in polynomial time mean that the solution is computable in polynomial time? There are some good arguments either way &#8211; some people think that the fact that there&#8217;s a polynomial time test is simply irrelevant; others think that there&#8217;s a deep relationship between the testability of a solution, and the process of generating that solution. Without getting into some hairy math, it&#8217;s hard to explain the two arguments any more deeply &#8211;  but many people a lot smarter than I am have spent years thinking about it.<\/p>\n<p> If this paper is correct, then it shows, once and for all, that P != NP; that the problems that we know are NP have no polynomial time solutions. <\/p>\n<p> I&#8217;m reading the paper, but it&#8217;s rough going. If there&#8217;s anything wrong with it, I doubt that I&#8217;ll be able to find it. But so far, it&#8217;s difficult but absolutely fascinating. They&#8217;ve taken a really interesting approach to analyzing the problem. If it holds up, they&#8217;re probably in line for a Fields medal.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Very big, very exciting news in the theoretical comp sci world today! A group at HP research has published a proof that, if correct, shows that the classic problem of computational complexity has been solved, once and for all. It&#8217;s still far from certain that it&#8217;s correct. But it&#8217;s the most credible attempt that I&#8217;ve [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[80],"tags":[134,209],"class_list":["post-952","post","type-post","status-publish","format-standard","hentry","category-computational-complexity","tag-computational-complexity-3","tag-pnp"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p4lzZS-fm","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/posts\/952","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/comments?post=952"}],"version-history":[{"count":0,"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/posts\/952\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/media?parent=952"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/categories?post=952"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.goodmath.org\/blog\/wp-json\/wp\/v2\/tags?post=952"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}