The Asymmetry Between Gains and Losses

It dawned on me a while back that there’s a fundamental asymmetry between financial gains and losses, in that gains are strictly positive events from a utility or other subjective preference perspective, whereas losses are strictly negative events, but with the possibility to cause catastrophic knock-on events. Specifically, gains will never cause a default, whereas a loss can. That is, if someone gives you money, or your net worth appreciates for some other reason, this simply cannot cause a default. In contrast, if someone steals your money, or your net worth otherwise decreases for some other reason, you could default on existing liabilities, which will create not only losses for others, but potentially catastrophic financial consequences on an individual level (e.g., homelessness or even death in the case of losing health insurance). This implies that we should seek to avoid defaults as a society, as opposed to losses, which are not innately harmful to others, and not generally catastrophic to individuals (e.g., just because you lose some money in the market doesn’t mean you’ll lose your home).

The problem is that default risks are idiosyncratic, in that one firm could be perfectly fine incurring a million dollars in losses over some period of time, whereas another would go bankrupt. This means that the market for hedging loss of income (which doesn’t to my knowledge exist yet) is going to be heterogeneous, and probably not exchange traded. But so what, so is lending, and that’s nothing new to banks.

In fact, you can posit a simple market that is basically unfinanced credit exposure, where firm A buys protection on some level of income for a fixed period of time, from bank B. Specifically, firm A pays bank B to underwrite the risk that a particular asset ends up generating less than a particular amount of revenue over a particular amount of time. For example, imagine a large food chain buys such a contract from a bank, so that if one of their franchises fails to produce at least $1,000,000 in revenue per year, for a window of let’s say 5 years, the bank writes them a check for $1,000,000 – X, where X is the revenue actually generated in the year the shortfall occurred. The bank would charge a fee based upon the revenue history of the particular franchise, which is distinct from (but of course related to) the credit risk of the franchise. In fact, the whole point of this, is for the franchise itself to avoid contributing to an overall default by the food chain. I would call it a revenue shortfall swap.

This is potentially a really attractive product from the perspective of the bank, because they can contract with the food chain holding company, presumably a much better credit than the specific franchise location. As a result, the bank gets a corporate quality credit (as a counterparty), but the exposure is to a potentially highly diversified set of revenue streams, across huge, and individually selected geographies, with different consumer profiles. This should be attractive to the corporates as well, because they can micromanage revenue risk, over specific periods of time, where they might be willing e.g., to forgo some profit, in exchange for stability.

In thinking further about this, I think it could set the stage for individual employment insurance, something this country (the U.S.) desperately needs. Specifically, banks can probably use in-house municipal bond experts that have knowledge of state and local economies. This would allow them to at least contribute to the knowledge necessary to create the corporate products above, but also potentially create a market where people can buy insurance on their income (e.g., get fired, get a payout for one year equal to your previous income). This will probably be too expensive for most low income people, and frankly, banks won’t write those contracts because they’re probably bad credits, and also they won’t trust poor people to maintain employment. As a fix, I think we could instead require everyone in e.g., New York to buy employment insurance, unless you have one year in after-tax savings. This would be paid for by the state, and the high income earners (including seriously high earners that in this state make $10 million and $100 million per year), would also have to participate, unless they again have one year’s worth of after-tax cash. So e.g., Jamie Dimon would not pay into this system today, because he’s worth over a $1 billion, and makes about $40 million per year. However, a young Jamie Dimon would have to pay in, until his savings reached the one year after-tax threshold. That kind of revenue, will attract banks, and might even be enough revenue to pay for the system (people like that generally don’t get fired, and banks know this, in particular J.P. Morgan).

Bilateral Comparison of Ancestry Flows

In a previous note, I presented an algorithm that allows you to test ancestry flows between three populations. The method in the previous note already allows for bilateral comparisons, between the three populations. However, if you repeatedly apply the trilateral test, using all possible triplets from a dataset of populations, you will produce a graph. This graph will have bilateral flows using information derived from the entire dataset, as opposed to just three populations.

I’m still mulling through the data, but in the previous note, I stated that Norway seems to be the root population for basically everyone. I now think it’s somewhere around Holland and Denmark, using the full graph produced by the algorithm below. This is not to undermine the hypothesis that human life began in Africa, instead, the hypothesis is that modern homosapiens seem to have emerged pretty recently, in Northern Europe. All of this stuff needs to be squared off with other known results, in particular archeological results, but it does explain how, e.g., South East Asians have the gene for light skin, by descendancy (i.e., they’re the ancestors of white Europeans). I’m merely expanding the claim, pointing out that a lot of Africans also test as the descendants of Europeans, using mtDNA.

Here’s the code, more to come. You just call it from the command line saying “graph_matrix = generate_full_ancestry_graph(dataset, num_classes, N);”. The resultant graph flows are stored in graph_matrix. You’ll need the rest of the code, which is included in the paper I link to in the previous note.

Determining Ancestral Flow Across Populations

In my paper, “A New Model of Computational Genomics” [1], I introduced an algorithm that allows you to test whether genome A is the ancestor of genomes B and C. You can read [1] to understand how it works, but for intuition, if both B and C begin identical to A, and then evolve independently in different environments, the number of bases they have in common going forward has to be the result of chance. Therefore, the genomes A and B, and A and C, should have more bases in common than B and C (i.e., both B and C deviate away from A independently of each other).

If we apply this test to three populations of genomes, instead of a single genome, we can count how many times the population A satisfied the inequality above, over all combinations of genomes selected from populations A, B, and C. Every time it is satisfied, we increment a counter associated with population A. We can then treat B and C as the ancestor (of course separately), again counting how many times the inequality is satisfied, producing a total of three counters. This will allow us to compare A, B, and C, and select the population that produced the greatest number of satisfied tests as the most likely to be the ancestor of the three populations. This is exactly what I did yesterday.

Each of the populations will again be associated with a counter that tells you how many times the inequality above is satisfied. If we divide by the total number of comparisons (i.e., the number of times we tested the inequality), we can produce a percentage. If e.g., we assume that Norway is the ancestor of Nigeria and Ancient Egypt, it turns out that test is satisfied 39.722% of the time. We can represent this as a graph with three vertices, one for each population, and a labelled edge running from the purported ancestor population to the two dependent populations. This is crudely represented below in my diagram, with an edge from Norway to both Nigeria and Ancient Egypt, labelled with the percentage of successful ancestry tests.

 

If we run the same tests again, this time treating each of Nigeria and Ancient Egypt as the ancestor population, we will produce an additional four edges, together producing a complete di-graph on three vertices in the form below. I nixed the labels for clarity, but did however include a new label “f”, representing the net percentage, and therefore net flow between the populations. This is easy to calculate, you just take the difference between e.g., the edge connecting A to B, and the edge connecting B to A, producing a single net figure from A to B. If the figure is positive, it means that A is more likely to be the ancestor of B, and if negative, that B is more likely to be the ancestor of A.

Below is some code that calculates the net flows for three populations, but I haven’t written any graph software yet (hence the “artwork” above). Astonishingly, Norway seems to be the root population for Nigeria and Ancient Egyptian. Now, this is subject to falsification, and there could be some other triplet of genomes that implies otherwise. That said, preliminary testing so far suggests that Northern Europeans, in particular Norwegians and Swedes, really might be the source population for a simply enormous number of people. And again, this could explain why South East Asians are literally white, genetically, which makes no sense, because it’s an extremely hot climate.

Interpreting the output below, we see that, in the context of the three populations, Norway is the best-fit ancestor of the Nigerians and Ancient Egyptians, and the Nigerians fit as a descendant of the Ancient Egyptians. What’s amazing about this, is you can use mtDNA, and literally impute geographic, directional flow, in this case, pointing mostly south, from Norway to West Africa and North East Africa. Thinking through all of this, it’s astonishing, because it’s just mtDNA, but you can literally project this onto a map, and determine geographic flows among populations.

This sounds crazy, Ancient Egyptians, they’re African! Sure, geographically, but when you look at their mtDNA, they appear to be South East Asian, and when you look at their artwork prior to Ancient Rome, they also look South East Asian. One sensible explanation, is that after the last Ice Age, about 10,000 years ago, populations that were otherwise stuck in Scandinavia started migrating. They don’t have to conquer to spread, they just have to survive with a higher probability than other populations. Given that they likely lived through Hell in a frozen tundra, once conditions improved, I think it’s perfectly sensible to assume that they survived with a higher probability than many other populations. This would cause them to spread without conquest, which seems to be the case, and I think what happened is, they ended up in South East Asia, migrating by foot (note Norwegians also test as the ancestor of Mongolians, Chinese, and Indian people, consistent with this hypothesis). Then, I think a group of South East Asians came back to the Middle East and North Africa (specifically the Pre-Roman Egyptians) by boat, which kicked off the ferocious competition of the Classical World. This is also consistent with the fact that the modern day Sri Lankans and Phoenicians are literally identical on the maternal line. This makes no sense, in the absence of interactions between the Classical World (or prior) and Asia. Also, there are obviously Asian Churches in Norway and several Buddha statues found at Viking sites. I don’t know for sure, because I’m only looking at mtDNA, but common sense suggests it’s something like this, otherwise you don’t have white people in a tropical climate like Thailand. I’ve been there, and I got horrible sunburn, it doesn’t make sense, absent an explanation like this.

Here’s the code, the dataset and any missing code can be found in [1].

Testing Ancestry Algorithmically

In my paper, “A New Model of Computational Genomics” [1], I presented an algorithm that allows you to test for ancestry given three genomes A, B, and C. In short, if genomes B and C descend from genome A, then genomes A and B, and genomes A and C, should have more bases in common than genomes B and C. You can read [1] to see why, but it’s mathematically impossible for B and C to have anything meaningfully more than chance in common with each other, since they both start the same (i.e., identical to genome A), and then evolve independently.

In [1], I provide the code to implement this algorithm, but tonight I wrote a really fun algorithm that finds the best root population among entire populations A, B, and C. That is, it tests, genome by genome, whether a given combination of three genomes from populations A, B, and C (one from each population), satisfies the test stated above. By doing this repeatedly, it can report back the root population with the highest percentage of satisfied tests.

I’ve noted in the past (including in [1]) that it’s obvious the Northern Europeans are closely related to the Ancient Egyptians. Specifically, it looks like they descend from the Ancient Egyptians. More recently, I’ve noticed that a lot of people globally are related to Northern Europeans. Applying the algorithm I wrote tonight, it looks like the flow is from West to East, in that e.g., when you ask whether South Koreans are the ancestors of the Norwegians and Germans, you get a low metric. In contrast, when you ask whether the Norwegians are the ancestors of the South Koreans and Germans you get a significantly higher metric. This requires a lot more testing, but it could explain why e.g., South East Asians are literally white, in the genetic sense.

Overall, my view now is that human life began in Africa, at some point turning into Denisovans, which in turn produced Neanderthals, which in turn produced modern humans. Heidelbergensis also seems to flow from Denisovans, but Heidelbergensis does not seem to be the ancestor of modern humans. You can test all of this using the code below. Really interesting, the people of Cameroon are significantly Denisovan (and so are the Finns, Danes, and Jews). In some cases, the people of Cameroon test as the ancestors of Asian Denisovans found in a cave, dated to about 50,000 years ago. This suggests at least the possibility that the people of Cameroon are the real thing, our closest link to our original ancestors, that began in Africa, moved to Asia, moved back to Africa and Europe (in particular Ancient Egypt), and then spread all over the world, including back to Asia, and South East Asia in particular. I suppose by the time they made that last journey to South East Asia, they were already white. It’s a crazy story, and it’s simply incredible that mathematics allows you to deduce all of this from just mtDNA. Note that it’s an ordinal test only, so you can’t say how long these transitions took, but you can say that one genome is the ancestor of two others.

Here’s the code, enjoy! Any missing code (and the dataset) can be found in [1].

Using Software to Assist Speech Impediments

It just dawned on me using my Apple Watch that you could use a simple tweak to improve dictation software, probably really easily. You just create a dataset targeted at people that have speech impediments, probably broken out by type (e.g., a lisp versus a stammer), where the training dataset is generated by people correcting text generated by the existing dictation software. That is, you use whatever dictation software you have, and then build a new dataset mapping inputs to corrected outputs. I wouldn’t even call this machine learning, it’s just a simple added layer that accounts for the fact the user has a speech impediment. In fact, you should probably allow this to be a feature in any dictation device, since someone could just have a funny voice that doesn’t map well to the training dataset or more generally, simply doesn’t perform well for whatever reason. This is a trivial adjustment, that could have real utility.

I did a quick Google search, and it looks like a simple version of this product does not exist, and instead people are using Machine Learning. There’s no way this is a hard problem, especially using machine learning. A lot of people stutter, and so there should be demand for exactly this software. I don’t have time to implement this (in particular because it requires people to generate the dataset), so you can keep this one, there it is, public domain.

On Selection and Intelligence

Intuitively, it makes sense that intelligence would persist in Nature, because for all animals, brain power is useful and therefore at a minimum shouldn’t hurt a species. That said, it’s not clear why in particular homosapiens have grown more intelligent over time. As a general matter, selection should explain it. For example, it’s generally accepted that some kind of apocalyptic event lead to the demise of the largest dinosaurs, presumably an asteroid hitting the Earth. This killed off the largest animals above ground, presumably because they needed more food to survive than the small ones, and a catastrophic event could of course limit the total amount of food available for all animals. Smaller animals could survive on less food, and then eventually get bigger once conditions improved, which seems to be roughly what happened. So we can plainly see the mechanics involved: the total food supply literally shrinks, which kills anything that needs too much food, and whether or not this is exactly what happened, it makes sense, mechanically. Now why on Earth would animals get more intelligent as a function of time?

I think the answer is the same: disaster. When disaster strikes, the ability to predict the behavior of your environment could mean the difference between life and death. Because reality is governed by physics and mathematics, disaster could again be responsible for the selection of intelligence. So it’s indirect in this view: disaster forces selection for mechanical intuition and mathematics, and both of those require intelligence. Just imagine starting a fire near a bunch of wolves, near a body of water. Now set that same fire near a bunch of monkeys. Do the same with a bunch of people. Only the stupidest people won’t realize that the water probably won’t set on fire, whereas the same is not true of the wolves, and might not be true of the monkeys. That’s all you need to have literally all animals replaced by humans, disaster, and further, that’s all you need to get rid of stupid people as well, which could explain why humans have generally become more intelligent as a function of time.

Keep in mind a UTM is equivalent to processing language, suggesting that once you speak a language, you have all the intelligence you need, as a technical matter, to do all of computable mathematics. This suggests that in some sense humanity peaked at the development of language, and I think this could explain the proliferation of Phoenician-like languages, all the way out to Mongolia, for the simple reason that the Phoenicians might have been the first people to develop a written language, of course taking into account the possibility of a prior group that was subject to disaster.

On the Complexity of a Graph

Introduction

I’ve been thinking about representational complexity for a long time, and in fact one of the first papers I wrote was on the intersection number of an infinite graph. Despite literally 20 years of thinking on the subject, for some reason, I wasn’t until today able to accurately think about the Kolmogorov Complexity of a graph. Sure, it’s a complex topic, but the answer is pretty trivial. Specifically, every graph can be represented as an N x N matrix, where N is the number of vertices. However, this is obviously too big of a structure to be the K-complexity, since it contains duplicate entries (I’m assuming it’s an undirected graph with no loops). That is, entry i,j in the matrix is the same as entry j,i, and as such contributes no new information about the graph. Therefore, the K-complexity of a graph must be less than N^2.

We can improve our measure of K-complexity by noting that any graph can be described by simply listing its edges. For example, a complete graph on three vertices can be represented by the set of vectors E = \{(1,2), (2,3), (3,1)\}. That is, each vector represents an edge, and the digits in the vector tell you the labels of the vertices connected by the edge in question. In this case E connects vertex 1 to 2, 2 to 3, and 3 to 1, producing a circuit on three vertices, i.e., a complete graph on three vertices. As a consequence, the K-complexity of a graph cannot exceed the complexity of its edge set. Each label in a graph will be less than the order of the graph (i.e., the number of vertices N), and as a result, we can encode each label in the edge set with at most \log(N) bits. Each edge consists of two labels, and so the K-complexity of a graph must be less than or equal to |E| 2\log(N) + C.

Structural Complexity

Note that |E| 2\log(N) is again an upper bound on the K-complexity of a graph, it’s just much better than N^2, since it at least takes into account the number of edges, and uses a more efficient representation of the graph. However, particular graphs can definitely be expressed in fewer bits. Specifically, the empty graph, the complete graph, and a Hamiltonian circuit, each of a given order N, can be expressed in \log(N) + C bits, where C is a constant that is the length of the program that constructs the graph, which we can think of as simply generating the list of edges that defines the graph. For example, the following Octave Code will generate a Hamiltonian circuit of any order N:

E{1} = (1,N);

for i = 2 : N – 1

E{i} = (i, i+1);

endfor

As a result, we can produce a Hamiltonian circuit of any order, using at most \log(N) + C bits, where C is the length of the program above in bits. Analogous code will produce a complete graph, whereas an empty graph can be produced by simply specifying N (i.e., there are no edges), which again requires exactly \log(N) + C bits, but using different code. Note that even in these cases, it’s still possible that an even shorter, presumably not universal program produces a given graph as its output when fed as the input to a UTM. That is, e.g., U(x) = M(G), where x is a binary string, U is some UTM, and M(G) is the matrix that defines the graph G. As a theoretical matter, the length of x could be even smaller than \log(N), where again N is the order of G. This would be true for empty graphs, complete graphs, and Hamiltonian circuits of order N, where the number N itself is highly compressible.

Kolmogorov-Random Graphs

It turns out it’s pretty easy to prove that Kolmogorov-Random Graphs exist, in the sense that we can produce graphs using Kolmogorov-Random strings. There’s obviously scholarship on point, but I think the ideas I’ve set out in this note are a lot easier to think about, and unify perfectly with the complexity of strings. Specifically, recall that we can represent any graph using its edge set. If we modify the method used to do so above, we can show that Kolmogorov-Random strings will produce graphs when fed as inputs to a UTM, which implies that those graphs are literally Kolmogorov-Random, in the same sense as a binary string.

Returning to the example of a complete graph on three vertices above, let’s represent that graph using three sets: the set of vertices adjacent to v_1, the set of vertices adjacent to v_2, and the set of vertices adjacent to v_3. Because it’s a complete graph on three vertices, we would have the following: \{v_2\}, \{v_3\}, \{v_1\}. Note that as we move forward in the labels, e.g., from vertex 1 to vertex 2, we gain information about the graph. Specifically, there’s no reason to include v_1 in the set of vertices adjacent to v_2, since that information is contained in the set of vertices adjacent to v_1. As a result, the maximum number of elements in the set for v_1 is N-1, and for v_2 it’s N-2, and so on. As a result, we can represent the graph as a “matrix” where the number of columns begins at N-1 for v_1, and decreases by 1 for each row. Note that as a result, the N-th row has no columns, implying that the “matrix” has N-1 rows. We can treat every entry in this “matrix” as a binary number indicating the presence or absence of a given edge. For example, if entry (1,3) is 1, then edge (1,3) is included in the graph. This is just like a regular graph matrix, except it contains no duplicate entries, and therefore the number of columns is not constant. Note that therefore, it corresponds to a binary string of length (N - 1) + (N - 2) + \ldots + 1 = \frac{N (N - 1)}{2} = N \choose 2, which is also the maximum number of edges.

Let s be a Kolmogorov-Random string of length N = n \choose 2. All we have to do is restructure s into the shape of a “matrix” described above, which will produce a graph G. Because s is Kolmogorov-Random, there cannot be another binary string shorter than s that will generate G on a UTM, by which we mean generating the edges of G. Assume such a string y exists. It follows that E(G) = U(y), which in turn will allow us to construct a “matrix” of the type above, which will in turn produce s. Because s is Kolmogorov-Random, there cannot be a string shorter than s that generates s, yet y is exactly such a string, which produces a contradiction, completing the proof.

Note that such a graph G cannot be a complete graph, since a complete graph has a trivial complexity, as we’ve seen above. It is therefore interesting that a Kolmogorov-Random Graph has a Kolmogorov Complexity of exactly the number of edges in a complete graph of the same order. Because not all numbers are of the form N = n \choose 2, we cannot say that the Kolmogorov Complexity of a Kolmogorov Random graph is always the number of edges in a complete graph of the same order, though it might nonetheless be true.

Computability and Infinite Sets of Graphs

Let H_N denote the Hamiltonian circuit of order N, and let \Gamma = \{H_1, H_2, \ldots \}. Despite the fact the set is infinite, because each such graph has a simple structure, we can define a computable test that will allow us to determine whether a graph G is in that set, or not. Just to sketch the algorithmic test, we would begin by testing the degree of each vertex in G, and if it’s not 2, the algorithm terminates and returns “false”. If the degree of each vertex is in fact 2, then we traverse the edges of the graph, and if we don’t return to the original vertex, we again return “false”, otherwise we return “true”. As a result, there is a computable test that allows us to state whether or not a given graph G is in \Gamma. Note that as a consequence, we can also generate \Gamma, using brute force, producing all graphs of orders N = 1, 2, \ldots and testing which of those belong in \Gamma. Similarly, as noted above, we can algorithmically construct a Hamiltonian circuit of all orders, and can therefore, test whether or not a given graph is in the set of graphs generated by that process. Note that the constructive algorithm above, is very different from the algorithmic test we just articulated in this section. Therefore, we have an interesting equivalence, in that the existence of an algorithmic test implies a constructive algorithm (via brute force), and a constructive algorithm implies an algorithmic test (again via brute force, e.g., in the case where there are multiple graphs of a given order).

At the same time, because the set of graphs is countably infinite, and the set of algorithms is countably infinite, the number of infinite subsets of the set of all graphs is uncountable and therefore larger than the set of all algorithms. Therefore, it must be the case that there are infinite sets of graphs that do not have an algorithmic test, and therefore do not have a constructive algorithm. One simple example follows from the existence of non-computable infinite strings. Again, the set of all infinite binary strings is uncountable, whereas the set of all algorithms is countable. As a consequence, there must be infinite strings that cannot be generated by a finite program running on a UTM.

Let \sigma be such a non-computable infinite string. Define \bar{\Gamma} as the subset of \Gamma such that H_i is included in \bar{\Gamma} if \sigma(i) = 1. That is, where \sigma(i) = 1, we include the corresponding element of \Gamma. As noted above, there is a simple algorithmic test to determine whether or not each element of \bar{\Gamma} is Hamiltonian, but this is distinct from an algorithmic test that determines whether or not a given graph G, is in \bar{\Gamma}. That is, not all Hamiltonian circuits are in \bar{\Gamma}. Now assume that such an algorithmic test T exists. It follows that we can then generate every Hamiltonian circuit starting with N = 1, and T will tell us whether or not that particular order is included in \bar{\Gamma}. If H_i is included, set binary string entry \zeta(i) = 1 and otherwise set  \zeta(i) = 0. It follows that \zeta = \sigma. However, we generated \zeta on a UTM, which is not possible, since \sigma is by definition non-computable, which leads to a contradiction. This implies T does not exist. This demonstrates that even if a set is computable, it will have non-computable subsets, just like the natural numbers, and all countable sets generally.

Properties without Computable Tests

In the previous section I noted that Hamiltonian circuits are simple structures, and therefore, we can come up with simple algorithms that test for whether or not a graph is a Hamiltonian circuit. Testing whether or not a given graph contains a Hamiltonian circuit as a subgraph is believed to be intractable. As such, there are simple structures that correspond to simple algorithms, though finding simple structures in more complex graphs is suddenly intractable. This raises the question of whether or not there are properties that cannot be tested for algorithmically at all. The answer is yes.

Order the set of all finite graphs G_1, G_2, \ldots, and let \gamma be an infinite binary string. If \gamma(i) = 1, then we can interpret this as G_1 having property \gamma given the ordering, or equivalently, view \gamma as defining a set of graphs. There are again more binary strings than there are algorithms, and therefore, in this view, more properties than there are algorithms. The question is whether there are more interesting and / or useful properties than there are algorithms, but the bottom line is, the number of properties is uncountable, and therefore the density of testable properties is zero. You might be tempted to say that all such properties are uninteresting, or not useful, but unfortunately, whether or not a program will halt is precisely one of these properties, which is both useful and interesting, suggesting at least the possibility of other such useful and interesting properties.

The Distribution of Graph Properties

Ramsey Theory is one of the most astonishing fields of mathematics, in particular, because like all combinatorics, it has intrinsic physical meaning, in that combinatorics provides information about the behavior of reality itself. What’s astonishing about Ramsey Theory in particular, is that it’s fair to say that it shows that structure increases as a function of scale, in that as objects get larger, they must have certain properties. What I realized today, is that the number of properties that they can have also grows as a function of scale. For intuition, consider all graphs on N = 1,2,3 vertices. You can see right away that the complete graph on 3 vertices is the smallest possible Hamiltonian circuit, and therefore, the smallest Hamiltonian graph. It is simply not possible to have a Hamiltonian graph with fewer vertices. This suggests the possibility that the number of properties that a graph can have grows as a function of its order, and we show using some not terribly impressive examples, that this in fact must be true, suggesting the possibility, that useful and interesting properties of objects continue to arise as a function of their scale.

Let \gamma be an infinite binary string, and define an infinite subset of the natural numbers A such that k \in \mathbb{N} is included in A if \gamma(i) = 1. Now define an infinite set of graphs \Gamma such that H_i is in \Gamma if the number of edges of H_i is divisible by A(i). Because each H_i is a Hamiltonian circuit, the number of edges in H_i is simply i. Putting it all together, we have an infinite set of graphs, each of which are Hamiltonian circuits of different orders, and whether or not a given order is included in the set, is determined by whether or not that order is divisible by the corresponding integer value in A. Note that larger graphs will have orders that are divisible by more numbers, though the number of divisors does not increase monotonically as a function of n \in \mathbb{N}. Therefore, in this view, larger graphs have more properties in the sense of being included in more sets of this type.

Complexity Versus Computability

Intuitively, there is a connection between complexity and computability. In at least one case, this is true, in that the Kolmogorov Complexity of a non-computable infinite string is countable. That is, if a string is non-computable, then there is no finite input to a UTM that will generate that string. As a result, its complexity cannot be finite. At the same time, we can simply copy the string from the input tape, to the output tape, assuming both are infinite tapes. Therefore, the Kolmogorov Complexity of a non-computable infinite string is countable. However, this intuition is subject to more careful examination in the case of infinite sets, in that you can construct non-computable sets of low-complexity objects.

Now assume that \gamma from the example in the previous section is non-computable, which implies that both A and \Gamma are non-computable. As discussed above, it follows that there is no computable test for inclusion in \Gamma. At the same time, each of the graphs in \Gamma is a Hamiltonian circuit, with a Kolmogorov Complexity of \log(N) + C. Note that the ratio \frac{\log(N)}{{N \choose 2}} approaches zero as N approaches infinity. As such, we have an infinite set of graphs that is non-computable, but each of the individual graphs are low-complexity objects, though note that the set was generated using a non-computable string.

Ancestry Test Code

As I’ve noted several times, I’ve devised an ancestry test that is impossible to argue with, using whole-genome mtDNA. See Section 6.1 of A New Model of Computational Genomics [1]. Specifically, given whole-genomes A, B, and C, if genome A is the ancestor of both genomes B and C, then it must be the case with near certainty that genomes A and B, and A and C, have more bases in common than genomes B and C. Again, see [1] for an explanation. The test in Section 6.1 of [1] is at the genome level, and as such, using a dataset of genomes, the number of tests required to compare whether an entire population is the ancestor of two other populations grows quickly as a function of population sizes. As a tractable approximation, the attached code uses the average match count between populations A and B, A and C, and B and C, which of course loses information, but should at least help you reduce the number of cases that you investigate exhaustively.

Applying the attached, it turns out, that yet again, the Denisovans test as the common ancestor of humanity (though I now think the Cameroon might be more modern than I first suspected), specifically, the common ancestor of both Heidelbergensis and Neanderthals. Further, the Phoenicians again test as the common ancestor of basically everyone alive today, including the modern Thai, Nigerians, Norwegians, Koreans, the Saqqaq (in B.C. Greenland!), the Swedes, Indians, and Chinese. As a result, I’m fairly convinced early Middle Eastern people settled a significant portion of Europe and Asia, and possibly America (given Greenland), but I can’t put a date on it. Ugarit goes back to 6,000 BC, which should leave enough time, but this is an ordinal test only, and therefore cannot be used to date the relationships. Moreover, I’ve recently cast serious doubt on the idea that mtDNA has a single, stable rate of mutation. The net point is, therefore, the ancestry test is real, and very difficult to argue with, but limited to ordinal testing; further, mtDNA doesn’t seem to have a single, stable rate of mutation; as a result, it looks plausible (1) that the Denisovans are the first humans and (2) that either the Phoenicians or people close to them (on the maternal line) we’re prolific settlers, but we don’t know when either got started.

The code is below, the balance can be found in [1]. One modification I plan to make is to use Monte-Carlo probing on the data that informs the averages. This will allow you to test a fixed portion of the genome-level data that you can scale given the power of your machine. BTW I just bought a Mac Mini running the M2 Pro chip, and I cannot recommend this machine enough, it is more than 10 times faster than my windows laptop. Running the ancestry test described above over 673 full mtDNA genomes takes about 0.5 seconds. I cannot believe this is a retail machine.

On the Age of Humanity

Introduction

My research shows unequivocally, that archaic humans are still alive today, in that many living humans carry archaic mtDNA. The obvious question is, how did archaic humans survive for so long? The answer is, they probably didn’t, but their mtDNA did, just like the widely accepted fact that many living humans carry archaic DNA generally. What makes mtDNA unique, is that it is so stable, passed from a mother to its offspring, with basically no mutations at all, even over thousands of years. One estimate claims that one mutation occurs roughly every 7,990 years, though this estimate is qualified and plainly subject to doubt. I show below that assuming this is correct, Denisovan mtDNA existed about 38,000,000 years ago.

This is obviously way earlier than anyone thinks, but it’s not totally absurd, especially in light of relatively recent finds, including Graecopithecus, which was dated to 7.2 million years ago, in Greece, not Africa, which of course implies it’s possible the species emerged much earlier in Africa itself. Also note that we’re only discussing mtDNA, not the full genome. As a result, the claim is limited to the existence of Denisovan mtDNA, not the full genome. The discussion below of course considers the case that the estimate of 7,990 years per mutation is simply wrong, which is arguably the point of this note. Specifically, not all systems have stable averages over time, and a system as complex as the human genome of course might not behave in a predictable, stable manner.

Alignment, Insertions, and Deletions

Assume you have two copies of the exact same genome, and call them A and B. Note that mtDNA is N = 16,579 bases long, and as a result, the match count between genomes A and B is 16,579 bases, or 100% of the genome. Now insert a random base in genome B, at index 2. This will shift every base after the first index in B, by 1 position. This should cause the remaining N-1 bases to match to genome A about 25% of the time. That is, because we’ve shifted one of the otherwise identical genomes by one base, whatever bases that happen to match post insertion, should be the result of chance, and because there are four possible bases, the probability of a match is 1/4. Note that a deletion will cause an analogous reduction to chance. As a result, a single insertion or deletion will cause the match count to drop to around chance, after the index of the insertion or deletion.

The work I present in, “A New Model of Computational Genomics” [1], makes use of a global alignment, which means that when comparing two genomes, you assign each base an index, and the comparisons are made by testing whether the bases are equal at each index. The match count is simply the total number of matching bases. See [1] generally. In contrast, local alignments take segments from a given genome A (e.g., bases 1 through 100), and attempt to find the highest match count anywhere in genome B (e.g., bases 100 through 200). This would therefore, ignore insertions and deletions, since e.g., in the example above, a local alignment would search all of genome A for the best match, which would produce a match count of N (i.e., 100% of the genome), with one “gap” to account for the insertion. In contrast, a global alignment (i.e., just counting matching corresponding bases) would produce a match count of 1 + approximately 0.25*(N-1) (i.e., the first matching base, plus approximately 25% of the remaining N-1 bases).

Insertions and deletions are, at least anecdotally, very impactful in terms of the affect they have, since, e.g., Williams Syndrome, Down Syndrome, and many others, are caused by insertions and deletions. As a result, it’s not surprising that local alignments don’t seem terribly useful in terms of predictive power, because they effectively ignore insertions and deletions, creating very high match counts across all human mtDNA. In contrast, the software in [1], makes use a global alignment, which ultimately allows ethnicity to be predicted with approximately 80% accuracy.

Application to Data

As noted in [1], and many other research notes I’ve written, there are plenty of modern living humans with archaic mtDNA, in particular, Denisovan mtDNA. Denisovans test as the common ancestor of all archaic humans, suggesting that they are in fact the first humans. Though technically the modern people of Cameroon test as the ancestors of the Denisovans, which is again possible because mtDNA is so stable, I’ll work instead with the actual Denisovan genomes in my dataset, which were all taken from the NIH database.  The goal of this section is to approximate the date of the first Denisovans, given the genomes of modern living humans that carry Denisovan mtDNA, and the actual Denisovan genomes recovered from Siberia. There are 8 such Denisovan genomes in the dataset, out of a total of 664 genomes. All genomes are complete mtDNA genomes, again taken from the NIH database.

If we fix a minimum match threshold of 50% of the genome, we find that 82 non-Denisovan genomes are at least a 50% match to at least one Denisovan genome. These are living, modern humans that carry Denisovan mtDNA. The average match count over all such genomes is 11,779.32 bases, or 71.05% of the full genome. This means that since the Denisovan cave, 100% – 71.05% = 28.95% of the genome has mutated. This is 4,799.62 bases.

Though the rate at which mtDNA mutates is still a subject of discussion, as noted above, one cited figure is one mutation per 7,990 years. This would put the age of the Siberian Denisovans at 38,348,963.80 years before the present. This is way out of the ballpark for the low-end of what I’ve seen regarding the dates of these finds, which is around 300,000 years ago. As noted above, it’s at least possible that the modern living Denisovans instead carry the mtDNA of the ancestors of the Siberian Denisovans, which would again force us to reject the date of 38,348,963.80 years before the present. However, the data suggests this is not the case. See Section 6 of [1] generally.

It could also be the case that a single insertion or deletion is causing the match count to drop to around 70% of the genome when comparing the Siberian Denisovans to modern living humans. That is, there’s a single insertion or deletion further down the genome that causes the balance of the genome match count to drop to around 70%. This would not require that much time, since it is technically a single mutation. We can however rule this out by looking at the distribution of the matching bases along the genome. This can be done by grouping sequential bases (i.e., bases 1 through K, K+1 through 2K, etc), and then counting the percentage of matching bases in those segments. If the matching percentage of bases in each segment is always significantly above 25%, then it simply cannot be the case that the resultant match count is due to a single insertion or deletion within a given segment. The chart below shows the average percentage of matching bases for all 8 of the Siberian Denisovan genomes when compared to all other genomes that have at least a 50% match, breaking the full genome into 100 segments of 165 bases each.

You can plainly see that it’s not the result of a single insertion or deletion, since the match count is always above 40% of the bases in each segment. That said, there is still plainly a portion of the genome from around segment 5 to segment 40, that seems to have been impacted by insertions and deletions, but this is distinct from a single trivial insertion or deletion. As a result, we have an enormous amount of change to account for when comparing Siberian Denisovan mtDNA to the mtDNA carried by some modern, living humans. This again implies that either the estimated rate of mutation is wrong (probably correct) or the dates associated with the Siberian cave are way off (not as convincing). The software for this is below, and the balance of the software can be found in [1].

mtDNA and IQ

Introduction

I’ve noticed in the past that Finns have significantly higher IQ’s than the Swedes and Norwegians. This is in my opinion the group of people to study if you’re interested in the nature of intelligence, because they’re all very similar people, from roughly equally rich nations, in the same part of the world, which should allow innate ability to take control. One notable difference is that the Finns speak an Uralic language, whereas the Norwegians and Swedes speak a Germanic language. There could be something to this, but investigating the problem again today led me to what seems an inescapable conclusion, that whatever the connection is between mtDNA and intelligence, it simply cannot account for the distribution of IQ as it exists.

Instead I now believe that brain structure is the most important factor in intelligence, which simply cannot be controlled by mtDNA in any credible way. Specifically, my thinking is rooted in algorithmic complexity, that if you have two equally powered machines, running different algorithms that accomplish the same task, then the machine with the more efficient algorithm of the two will be the most powerful of the two. Translated to biology, if you have two brains that both consume the same amount of power per unit of time, and have the same “clock rate”, one brain could still be vastly more powerful than the other, due simply to different structure. This could explain e.g., the fact that some birds can talk, whereas some dogs will eat until they vomit, despite the fact that birds have brain volumes that are a small fraction of a dog’s brain volume.

mtDNA and Intelligence

Despite the apparent complexity of the subject, this is going to be a short note, because the idea that mtDNA controls for IQ is apparently nonsense, despite the scholarship on the topic (not picking on anyone, but here’s a decent article that runs through some credible arguments for the role of mtDNA in intelligence). But as you’ll see, whole-genome sequencing throws the argument in the garbage.

There’s no nice way to say this, but the Roma people have pretty low IQs, but what’s most interesting about them, is that they are basically identical to each other, and all other people of that maternal line, including about 100% of Papuans, 67% of Russians, and about 30% of Taiwanese people. If you want to test the results yourself, you can see my paper, “A New Model of Computational Genomics” [1], which includes all the software, and a detailed walkthrough to explain how I end up with these numbers. At a high level, the Papuans, Russians, and Taiwanese people in this group of Roma lineage, are all a 99% match to the Iberian Roma, with respect to their mtDNA. If mtDNA controlled intelligence, then all of those populations should have similarly low IQ’s, since they’re basically identical to the Roma. This is just not true, and instead the Taiwanese have around the highest and second highest IQ on Earth, and the Russians have roughly the same IQ as the Norwegians and Swedes, despite the fact that Russia is, quite frankly, poor and dysfunctional compared to Norway and Sweden.

One important note, though you’ll often hear that “humans are 98% monkey”, or some nonsense like that, the algorithms in [1] use what’s called a global alignment, and as a consequence, they’re extremely sensitive to changes in position, causing e.g., the Roma to have little more than chance in common with some people (i.e., about 25% of the mtDNA bases). This sensitivity is probably why the software in [1] is so powerful, and is able to predict ethnicity with about 80% accuracy, using mtDNA alone (which is pretty amazing). In contrast, NIH’s BLAST algorithm uses a local alignment, and so it deliberately seeks to maximize the number of matching bases, by shifting two genomes around, causing everyone to look the same, and therefore, throwing away valuable information about the genome.

Getting back to the core topic, if you pay attention to this limited set of facts, mtDNA is in the garbage as a driver of intelligence, and moreover, the role of poverty is not exactly clear either, since Russia is really poor compared to Norway and Sweden, and yet they have roughly the same IQs. So what is driving this? Cynically, I think IQ testing is really just testing for basic education (when you look at a map), which is absent in the truly poorest countries, but that doesn’t mean that we can’t debunk the connection between mtDNA and intelligence. But to be clear, I do think intelligence is genetic, and in anomalous cases like Finland, Cambodia, and Suriname, IQ becomes something interesting, because it’s at least a test. I just doubt it’s mtDNA driving the bus.

Some Answers from Computer Science

Even if we posit arguendo (which is not very nice) that there’s something wrong with Roma mtDNA, this would simply imply that they have low energy per unit of time, perhaps as a function of fixed caloric intake and environment. To make this less abstract, let’s fix a Norwegian guy (not Roma) and a Russian guy (Roma), and give them the same food, education, climate, environment, clothes, etc., over a lifetime. Under this assumption, the Russian guy will produce less energy over his lifetime, and therefore, his brain has a lower output. But this is garbage as an argument, for mechanical reasons: if the Russian guy has a more efficient brain, then he doesn’t need as much power to run his brain. As a consequence, his output over a lifetime could in fact be higher.

To make things completely concrete, if you use a brute force method to sort a list of 10 letters, you’ll have to perform 10! = 3,628,800 calculations. If you instead use my parallel method, you’ll have to make between 3 and 4 calculations. As you can plainly see, there is an ocean between these two approaches to solving even the simple problem of sorting a list. As a consequence, the most sensible answer is, in my opinion, that brain structure controls for intelligence, for the simple reason, that it encodes the algorithms we use to solve the problems we face every day. Some people have fast ones, some people have dumb ones, and then there’s (probably) most people in the middle.

Returning to the birds versus dogs analogy, I think it’s not ridiculous to argue that birds have vastly more efficient brains than dogs, that something along the lines of computational efficiency is taking place in the brain of a bird, that allows it to perform complex tasks, with a smaller, presumably lower-energy brain. For the same reasons, this could explain the obvious fact that some people are wildly more intelligent than others, despite (possibly) having the same maternal line. Because intelligence varies within a given ethnicity, I can tell you that you are e.g., Norwegian, with high accuracy using just your mtDNA, but there’s no way of knowing (to my knowledge) whether you’re one of the dumb ones. This doesn’t preclude identifying deficiencies in mtDNA that will make you dangerously ill, and therefore not very bright, but it just doesn’t make sense that the means of power-production controls the most complex structure in the Universe –

It’s a single bean, in an ocean of genetic information.