Complexity Science for Simpletons

In this article, we shall describe some of the most interesting topics in the subject of Complexity Science for a general audience. Anyone with a solid foundation in high school mathematics (with some calculus) and an elementary understanding of computer programming will be able to follow this article. First, we shall explain the significance of the P versus N P problem and solve it. Next, we shall describe two other famous mathematics problems, the Collatz 3n + 1 Conjecture and the Riemann Hypothesis, and show how both Chaitin’s incompleteness theorem and Wolfram’s notion of “computational irreducibility” are important for understanding why no one has, as of yet, solved these two problems. 1 Challenge Imagine that you have a collection of one billion lottery tickets scattered throughout your basement in no particular order. An official from the lottery announces the number of the winning lottery ticket. For a possible prize of one billion dollars, is it a good idea to search your basement until you find the winning ticket or until you come to the conclusion that you do not possess the winning ticket? Most people would think not — even if the winning lottery ticket were in your basement, performing such a search could take 10 9 /(60 × 60 × 24 × 365.25) years, over thirty work-years, assuming that it takes you at least one second to examine each lottery ticket. Now imagine that you have a collection of only one thousand lottery tickets in your basement. Is it a good idea to search your basement until you find the winning ticket or until you come to the conclusion that you do not possess the winning ticket? Most people would think so, since doing such would take at most a few hours. From these scenarios, let us postulate a general rule that the maximum time that it may take for one person to search N unsorted objects for one specific object is directly proportional to N. This is clearly the case for physical objects, but what about abstract objects? For instance, let us suppose that a dating service is trying to help n single women and n single men to get married. Each woman gives the dating service a list of characteristics that she would like to see in her potential husband, for instance, handsome, caring, athletic, domesticated, etc. And each man gives the dating service a list of characteristics that he would like to see in his potential wife, for instance, beautiful, obedient, good cook, thrifty, etc. The dating service is faced with the task of arranging dates for each of its clients so as to satisfy everyone’s preferences. Now there are n! (which is shorthand for n × (n − 1) × (n − 2) × ∙ ∙ ∙ × 2 × 1) possible ways for the dating service to arrange dates for each of its clients, but only a fraction of such arrangements would satisfy all of its clients. If n = 100, it would take too long for the dating service’s computer to evaluate all 100! possible arrangements until it finds an arrangement that would satisfy all of its clients. (100! is too large a number of possibilities for any modern computer to handle.) Is there an efficient way for the dating service’s computer to find dates with compatible potential spouses for each of the dating service’s clients so that everyone is happy, assuming that it is possible to do such? Yes, and here is how: Matchmaker algorithm — Initialize the set M = ; . Search for a list of compatible relationships between men and women that alternates between a compatible relationship {x 1 , x 2 } not contained in set M, followed by a compatible relationship {x 2 , x 3 } contained in set M, followed by a compatible relationship {x 3 , x 4 } not contained in set M, followed by a compatible relationship {x 4 , x 5 } contained in