sniffnoy: (Kirby)
So I haven't posted in a while but woooo I beat Slay the Spire on Ascension 20 (as Watcher, no heart). :D

I, uh, did not expect I would be able to do that (without lots of going and looking up strategy, I mean, as opposed to figuring things out myself). I was going to content myself with just getting all my characters to Ascension 20. But now I guess I've got to beat Ascension 20 with all of them! That still seems daunting, though... (currently, I have Ironclad at 18, Defect at 19, and Silent at 20).

When I beat Ascension 19 as Watcher I had very little health left and was like how will I ever beat 20?? Well uh part of the answer was having Fossilized Helix to tank some big hits near the end! (And then having enough block to not waste it on small hits, due to Kunai + Duality.)

(Beating Ascension 19 as Silent, uh, that was an Apotheosis run, so. :P )

If I do beat Ascension 20 as every character I think I'm just stopping for now -- I'm not going for heart ascensions, no thanks. That's too much. Maybe after another yearlong break from the game. :P

(Slay the Spire 2? Yeah that looks cool but uh I've still got the first one to play... also who knows how long it will take to emerge from early access...)

Meanwhile other things going on! I'm finally looking for work again. Well -- I've been procrastinating on this, because it's a pain, but it's a thing I need to do!

Andreas Weiermann wanted me to come out to Belgium again sometime in 2025 but I don't think it's going to work out, a new job is hardly about to let me take a month off like Truffle did...

Speaking of math, a guy named John Campbell wrote to me recently to suggest a new variant of complexity: What's the smallest number of 1's you need to make a *multiple* of n? I don't know that there's much to do with this (and usually it will equal the ordinary complexity, though not always; 1499 is a counterexample), but it's kind of neat. I guess it satisfies f(mn)≤f(m)+f(n). And it's computable, although I certainly don't know of any good way to compute it... maybe somebody will find one?

Uh, I had a large belated birthday party a few weeks ago! I announced it well in advance in the hopes that some of the always-busy people would show up... it was partly successful at this. Linda showed up so I finally got to show her that look I still have your drawings! But Liz Goetz did not so I did not get to show her that look I still have your sign. Oh well.

We're down to just 163 books to give away, though...
sniffnoy: (Sonic)
Over a decade later, [personal profile] joshuazelinsky finally posted to arXiv his paper with his upper bound on integer complexity!

...the exposition isn't the best because he decided it was more important to just get it up there than to spend more time revising it. But hey! It's up! Go, know about it! Use it and cite it, it's up there! :)
sniffnoy: (SMPTE)
So I was only recently made aware of this paper by Christopher Shriver. In it he takes Stefan Steinerberger's method, and shows that actually it can be used to get bounds on ||n||/(log n) that hold for almost all n... as long as you measure "almost all" using logarithmic density rather than natural density.

This means we need a name for the new type of approximate liminf's and limsup's that arise from this density! :) Perhaps liminfap*? limsupap*? limap*? :)

...of course the thing is that there are other densities beyond natural and logarithmic, so potentially one needs a more general notation. But those are like the most common, so, eh, I'm OK singling those two out. :)
sniffnoy: (Kirby)
Here it is.

For now, I'm going to skip a long explanation of the contents of this paper. Perhaps I'll come back and do it later, but I'm guessing a lot of the people reading this already know a fair bit about it.

But goddamn what a relief it is to finally have this done. I mean it's not done, of course, I'm sure there will be changes necessary for publication. But it's up. It's out there.

We weren't sure whether to include section 5, and in particular the "off-by-one" theorem, but, ultimately, we included it. Otherwise it would have had to be a separate paper, which just makes for more headache, you know? (There is other stuff that got cut for length -- by which I mean, never actually written -- that will have to be a separate paper, but, that was never realistically making it in here.)

I actually haven't said as much on the internet about the contents of this paper as I have about previous paper... really, a lot of the stuff regarding integer complexity that the ideas in here led to, I just haven't really talked about so much. Well, I should remedy that. Maybe in the coming days or weeks I'll go back, and post about some of that stuff, that Arias de Reyna and I have coming down the pipeline in the wake of this. I mean, I imagine it'll be a while before those get written up properly, but I'd like to talk about it some.

But like the thing about this paper, that I've wanted to get this out there so bad is that like... I think this is kind of the best paper I've written, y'know? And it might well be the best one I write for a long time. Not in terms of the strength of the results (we've got stronger ones coming), or the quality of the exposition, but in terms of, tying things together. This paper just really ties everything together really nicely -- answering simultaneously what look like two unrelated conjectures -- and solves problems rather than raises them. It does raise new problems, of course, but ones that don't seem as essential as the ones it solves. And it finally resolves all of Arias de Reyna's old conjectures!

So, that's it. It's up. And I'm going to stop here now. Maybe more on this later.
sniffnoy: (Chu-Chu Zig)
So, upper bounds on integer complexity. We know that (for n>1) we have ||n||≤3log3n, and [personal profile] joshuazelinsky has managed to improve this although he still hasn't published it.

So there are several questions here. The first is, what is the maximum value of ||n||/(log n)? This appears to occur when n=1439, and is about 3.58; however, it never recurs, no other number yields a value that high, so that's probably not what we're really looking for, is it?

A better question would be, what is the limsup of ||n||/(log n)? This is of course a hard question to which we don't know the answer. We know the liminf is 3/(log 3) [about 2.73]; some people have speculated that perhaps this could be the limsup as well, with ||n|| ~ 3log3n. But if ||2^k||=2k for k≥1, then this can't happen, as the limsup must be at least 2/(log 2) [about 2.88].

Josh has previously speculated that the correct value might in fact be equal to 2/(log 2). But really it's hard to get a good read on it; recently I tried graphing it for some pretty large n and I gotta say if I had to guess based on that alone I'd say it's more like 3.2 or so. But who knows? Some other calculations I did recently, which I won't go into here, seem compatible with Josh's idea that it's 2/(log 2)... or maybe it's just 3. We can't really say.

But famously we can do better if we only want to find c such that ||n||≤c log n for almost all n, in the sense that the set of exceptions has natural density 0. So one might ask, what is the infimum of such c? The best known bound on this currently are due to Cordwell et al, and it's about 3.29, so, better than the conjectured value for the maximum!

But here's another question one might ask -- what does one call this value? This may sound like a silly question, but, y'know, this is a useful concept, and it deserves to have a name.

So, more formally: Say (an) is a real-valued sequence. We want to take the infimum (alternatively, supremum) of all c such that {n∈N: an≥c} (respectively, ≤c) has natural density 0. So it's like a limsup (respectively, liminf), but based on natural density. Notably, it can be lower than the limsup (respectively, higher than the liminf), and the two could agree, producing a limit of sorts, even if no actual limit exists.

Fortunately, there seems to be a pre-existing name for, if not this concept, then a very similar one! It turns out that there's a notion of "approximate limsup" and "approximate liminf" (and, when they agree, "approximate limit"); these are denoted "lim sup ap", "lim inf ap", and "lim ap". Now, these are defined in a somewhat different setting, where you're looking at taking a limit of a function f:RdR and taking a limit as you approach some point x0, and is based on Lebesgue measure... but the definition is clearly analogous.

So, I'm choosing to reuse that term for this definition. So, Cordwell et al provide our best upper bounds on limsupap ||n||/(log n). :)

Because the thing is that once you name a concept, it makes it easier to think about, and ask more questions about it. Like: What about the liminf? What is liminfap ||n||/(log n)?

I only first thought to ask this question a few days ago. And I realize that I don't really have any idea! It seems kind of like it ought to be 3/(log 3), same as the liminf, but, well, why should it be? I don't see any reason it couldn't be higher! Maybe there is an easy proof, but if so I'm missing it. If it truly is higher, that'd be pretty crazy! Or imagine if the limit didn't exist, but the approximate limit did...

Anyway yeah. Yay for having good names for things.
sniffnoy: (Kirby)
So, two entries ago, I discussed some variants on the Mahler-Popken problem. I'd like here to return to the original Mahler-Popken problem and discuss a different variant. Namely: What is the second-largest number we can make with k x's?

First, though, we should talk about the answer to the original problem in more detail. As before, I'm going to focus on what happens when k is sufficiently large, and how large k needs to be may depend on x.

So, as mentioned in the previous entry, to make the largest possible number from k x's, we want to group them into groups of m and then multiply them together. How large is m?

Well, m is the m that maximizes (mx)1/m. This is approximately e/x; indeed, e/x would be the maximum if we allowed m to vary continuously, but since that's not possible, m will be either the floor or the ceiling of this. The value of m changes over at the values mm-1/(m-1)m. Or, more specifically, mm-1/(m-1)m is the largest value of x where m is the group size, and (m+1)m/mm+1 is the smallest. (Throughout, I'm going to think of x as decreasing from ∞ towards 0.) As previously mentioned, at the changeover point (m+1)m/mm+1, both groups of size m and of size m+1 work.

So. When k is divisible by m, we group things into groups of m, yielding (mx)k/m. When x is on a boundary, x=(m+1)m/mm+1, then for any k sufficiently large we can make k using groups of m and m+1, yielding ((m+1)/m)k; divisibility conditions don't even come into it.

But what about when m is well-defined but k is not divisible by m? Let's say k is r mod m, 0<r<m. In this case, we'll need to use some groups of size either m+1 or m-1 to make the congruence come out right. But which one?

This is where it gets really neat. Mahler and Popken found that, if x is larger, you want to use groups of m-1; and if x is smaller, you want to use groups of m+1. The changeover point, where both give the same
result, is at

mm-1/(m-1)m ((m²-1)/m²)r

Let's denote this number by x(m,r). There's several really neat things about this:

1. Let's note that occurrence of mm-1/(m-1)m. We've already seen that quantity before, as the value where m itself changes over, from m-1 to m. And here it's what we get if we were to plug in r=0 -- which doesn't make sense, but if you plug it in anyway, that's what you get. So, the changeover point from m-1 to m is x(m,0).

2. For a fixed m, x(m,r) is monotonically decreasing in r.

So as x decreases, the congruence classes change over from using (m-1)'s to using (m+1)'s, one at a time, in order. At first, when we first hit x(m,0), when we first start using this specific value of m, all the congruence classes (other than 0, of course) are using (m-1)'s. Then we hit x(m,1), and now, the r=1 congruence class changes over. Then we hit x(m,2), and the r=2 congruence class changes over. Etc. Until... well, obviously, after x(m,m-1), all the congruence classes have changed over and are using (m+1)'s (except, once again, 0, obviously). But what happens if we plug in r=m? What's x(m,m)?

3. If we plug in r=m, we get (m+1)m/mm+1 -- the point where we change over to the next m! That is to say, x(m,m)=x(m+1,0).

In addition, for fixed m, x(m,r) is exponential in r. Like, literally exactly exponential, not approximately. Meaning that... like, say we've already divided up the positive real line based on the value of m we get, right? With the dividing points being the numbers x(m,0), for m≥1. Let's call those the major dividing points. Now we want to divide it up further based on just on the value of m, but on the more detailed eventual behavior, based on which congruence classes are using (m-1)'s or (m+1)'s. Well now we're putting additional dividing points -- let's call them "minor dividing points" -- at the values x(m,r).

Then for any two adjacent major dividing points, the minor dividing points between them are evenly spaced if use use a log scale!

I think that's really neat! :D

But OK, what about the second-largest?

Well, unfortunately, the answer there is considerably more complicated, and I'm not going to detail it all here. I'll tell you the answer when r=0. If x≥x(m,1), you want to use m groups of size m-1 (in addition to your groups of size m). If x≤x(m,m-1), you want to use m groups of size m+1. When x is inbetween, you want to use one group of size m+1 and one group of size m-1. (This is assuming m≥2. If m=1, then you make the second-highest by throwing in a group of size 2.)

It's nicely symmetric. Unfortunately the general answer is not. Here's another example where I can tell you the full answer: Say x is on a boundary, x=x(m+1,0), so you can make the largest out of groups of size m and m+1. To make the second-largest, you'll also want to throw in a group of size m+2.

(These are actually the only two cases I need to know about for the original motivation; the hard case, when m is well-defined but does not divide k, is not actually necessary for this. But I did it anyway. :P )

Anyway, like I said, I'm not going to detail the hard case here. The hard case actually needs to be divided into several subcases, depending on whether r=1, r=m-1, both (i.e. r=1 and m=2), or (the usual case) neither. I'll just say that it can involve such things as:

  • Using 2m-r groups of size m-1
  • Using m-r+1 groups of size m-1, and a group of size m+1
  • Using r groups of size m+1 when this is merely the second-largest
  • Using m-r groups of size m-1 when this is merely the second-largest
  • Using r-2 groups of size m+1, and a group of size m+2
  • Using m+r groups of size m+1


I'll also note that not all the changeover points are at x(m,r) for integral 0<r<m now. Now, in some cases, there can be changeover points at x(m,½) or x(m,m-½) -- meaning, yes, we can get irrational changeover points! We can also get some changeover points which are rational but can't nicely be expressed in the form x(m,r), not unless we're willing to allow r to be irrational.

There's also the issue of discontinuity. Mk(x) is necessarily continuous in x -- after all, it's the maximum of finitely many polynomials in x. Or, you know, on a graph, in order for it to switch over from one polynomial of x to another, well, the two potential maxima have to meet, and at the point where they meet both are equal, and there's no discontinuity.

But that doesn't apply for the second-largest. Because there's two ways that the second-largest could switch. One is that the current second swaps with the current third. Then yeah, they meet, they're equal, no discontinuity.

But the other way is that it swaps with the current first, becoming the largest. Then at the point where the two meet, both are equal... meaning they're both the largest. Neither is second-largest. Instead, the next-best candidate, which to either side is third, is for an instant exposed to the world as second. You have a discontinuity.

So, above I talked about "changeover points", but I should be clear it's now no longer not always a smooth changeover -- sometimes it is, but when you're considering k that's r mod m, and the changeover point under consideration is x(m,r) itself, that point will have its own special behavior that doesn't match either what's above or what's below it.

And there's one case I want to point out that's particularly weird, and that's what happens when m=2, r=1, and you look at the discontinuity at x=x(2,1)=3/2. Because this case doesn't fall under one of the possibilities I listed above. It can't even be described as group-and-multiply!

Because, you see, while mostly you want to use groups of 2, what you want to do with your remaining 3 x's isn't to make, say, one group of 3 (for a value of 3x), or three groups of 1 (for a value of x³), but rather, to use them to make x²+x. Which, again, then gets multiplied by a bunch of groups of 2.

Isn't that crazy??

Like, I can prove all this. I can definitely prove that this happens when x=3/2 and not for any other x. But I have no good heuristic explanation of it.
sniffnoy: (Sonic)
So I want to discuss here some variants of the Mahler-Popken problem.

The original Mahler-Popken problem is this: Pick a real number x>0. What is the largest number we can make with k x's using addition and multiplication? I want to consider the analogous problem for some other models of computation.

We'll vary things in three ways: Firstly, we can allow addition only, addition and multiplication, or addition, multiplication, and exponentiation. Secondly, we can either use a formula model, where we have k x's available to us to combine with our given operations; or a circuit model, where we start with x and have k steps available to us, and at each step we can combine any two things we've made with one of our given operations.

(The circuit-model problems are easy, as there's no tradeoffs involved, but I want to include them anyway.)

One more note: I may sometimes restrict to k sufficiently large, where how large k has to be depends on x.

So. Let's start with the circuit model. If we have only addition, the problem is trivial: We double at every step, ending up with 2kx as our answer. The particular value of x didn't really play any role here.

If we have addition and multiplication, then, if x≥2, obviously we want to square at each step. But if x<2 -- or more generally, letting y be our largest number made so far, if y<2 -- then doubling is better than squaring. So, again, this is easy -- we double until we get a number at least 2, and then we start squaring.

If we also allow exponentiation, then (again using the notation of "y") from above of course if y≥2 then we want to take yy. But what if y<2? Then doubling is best... until y dips below a number I'll call C1 approximately 0.346, the solution in (0,1) to the equation xx=2x. Then taking yy is better again. So, OK -- starting from y=x, we repeatedly take yy until y≥C1, then double until y≥2, then repeatedly take yy. (Note that if we start with y<C1, it's impossible to skip that middle segment, since we'll necessarily have yy<1.)

But something funny happens here that doesn't happen in the addition-multiplication case. With just plus and times, it could take an arbitrary number of doublings before you hit 2, right? Basically we have infinitely many cases, with transition points at x=21-k. But here, xx is always at least e-1/e, which is about 0.692, and in particular greater than ½ (and also greater than C1).

So in fact we only get finitely many cases:

  • If x≥2, just start doing yy.
  • If 1≤x≤2, double once, then start doing yy.
  • If ½≤x≤1, double twice, then start doing yy.
  • If C1≤x≤½, double three times, then start doing yy.
  • If x≤C1, do yy, then double twice, then start doing yy.


But, OK, circuits are easy. What about formulas?

Obviously, addition-only is pretty silly; you can only make kx.

With addition and multiplication, we have the original Mahler-Popken problem. Now, Mahler and Popken came up with a very interesting solution to this problem, which I'll go into detail on in a subsequent entry. But for now I want to just give it in pretty broad strokes. Basically, given x, you can find a group size, m, such that the thing to do is to add up the x's in groups of approximately m, and then multiply these groups together. If k is not divisible by m, you will need some groups of size m-1 or m+1 as well. Importantly, which of these you should use depends only on x and the congruence class of k modulo m.

(It's also possible to have x right on a boundary point, so that both m and m+1 work as group sizes. In this case one doesn't need to worry about divisibility conditions. But, again, I'm avoiding going too deep into this here. However, there's a reason you'll see in a moment why I want to point out the existence of these boundary cases.)

Regardless, the point is, if Mk(x) is the largest number we can make with k x's, one has, for k sufficiently large,

Mk(x) = mx ⋅ Mk-m(x)

Or, if we want to be more abstract, that

Mk(x) = Mm(x)Mk-m(x).

So. Here is my conjecture for the Mahler-Popken problem for addition, multiplication, and exponentiation, using M'k(x) to denote the largest number we can make this way:

For any x there exists an m such that for sufficiently large k we have

M'k(x) = M'm(x)M'k-m(x).

Moreover, m is the smallest m such that M'm(x)>1.

Now this looks similar to the previous case, the Mahler-Popken problem, right? But that second part means it's actually quite different.

Firstly, as we saw with exponentiation earlier, there are once again only finitely many cases (in a sense -- more on this in a bit). In the original Mahler-Popken problem, as x→0, m→∞. But here, again, for any x, we have xx≥½, and so m can never exceed 4, no matter how small x gets. More specifically, we get the following cases:


  • If x>1, then m=1 and so M'm(x) = x.
  • If ½<x≤1, then m=2 and M'm(x) = 2x.
  • If C1≤x≤½, then m=3 and M'm(x) = 3x.
  • If C2<x≤C1, then m=3 and M'm(x) = xx+x.
  • If x≤C2, then m=4 and M'm(x) = 2xx.


Here C1 is, as above, the solution in (0,1) to xx=2x, and C2 is the solution in (0,1) to xx+x=1. C1 is, as previously mentioned, about 0.346, and C2 is about 0.303.

So, that's different. And it seems to be nicer, right? But there's something else that's very different here. Notice that, with the exception of C1, these bounary points are all sharp boundaries. It's not like in the Mahler-Popken problem, where on one side of the boundary you use m, on the other side you use m+1, and that the boundary point both work and you can use either. Here, there's an abrupt change of behavior when you hit the boundary point, assuming you're approaching it from above.

This might seem to be impossible -- after all, it's easy to see that for any k, M'k(x) must be continuous in x. Doesn't this contradict that?

Well, not quite. Remember I only said "for sufficiently large k". There's no contradiction here, so long as, when you approach when of these sharp boundaries from above, how large k has to be before this kicks in keeps getting higher and higher. Or, in other words, so long as the initial irregularities keep getting worse and worse. So while I said above you only get "finitely many cases", that's only true so long as you only look at the eventual behavior and not at all at the initial irregularities that are going to end up preserved at the top of that chain of exponentials, like the groups of m+1 or m-1 in the Mahler-Popken problem.

I haven't discussed the solution to the Mahler-Popken problem in detail here, but there's nothing like that there. There, things only get bad, you only get "infinitely many cases", as x approaches 0 and m approaches infinity; you never get infinitely many cases when m is fixed.

Of course, my conjecture could be wrong. But, I think it is correct, and that is what it implies. In some ways quite nice. In other ways, not so. (Having tried it experimentally, I can tell you that those initial irregularities that get preserved at the top can get quite bad indeed.)

I have not attempted to define defects for this problem, but to me this suggests that if one were to do so, they would probably not be well-ordered.

Next time: More on the solution to the original Mahler-Popken problem, and a different variant than any of these!
sniffnoy: (Sonic)
By "irresponsible speculation", I mean "speculation without having done my homework first", i.e., without having even tried to look at the existing literature beyond this paper or actually really tried anything at all.

So, Juan Arias de Reyna recently pointed out to me the following paper: Commuting Probabilities of Finite Groups, by Sean Eberhard.

EDIT DEC 1: The paper has been updated; the following refers to the original version of the paper. See the comments for discussion of the updated version.

So: If you have a finite group, you can consider the probability that a randomly chosen ordered pair of elements from it commutes. You could then consider the set of all probabilities obtained this way; this is some set of rational numbers between 0 and 1.

In this paper, Eberhard shows that this set is in fact reverse well-ordered! Its order type is of the form ωα where 2≤α≤ω². (Though Juan Arias de Reyna points out that it's not too hard to find examples that show that in fact α≥ω, so the order type is at least ωω.) He also shows that all the limit points of this set are rational. I think it should be pretty obvious why I'm interested in this! (Even though I have no plans to actually study this, my hands are full as it is.)

Now for the irresponsible speculation:

1. Instead of just doing finite groups, one could generalize to compact groups; one can consider probabilities there as well. How would this affect the set? It would be really nice if this just gave you the closure of the probability set for finite groups! Though Arias de Reyna tells me it's conjectured that the finite group commuting probability set is closed in (0,1], so that would be saying that using general compact groups only gives you 0 in addition. (I mean, it certainly does give you 0 in addition!)

2. I'm reminded of some work of John Wiltshire-Gordon and Gene Kopp. They considered probabilities of randomly chosen elements from a compact group satisfying some general word; the case of commuting probabilities is the case where the word w is aba-1b-1. I wonder if the same phenomenon might be seen for other words.

Probably it would be best to first look at words in one variable. Obviously using w=a generates an ω if we stick to finite groups and an ω+1 if we allow general compact groups -- not ωω, but still well-ordered. As for a² or a³... well, I don't know, and I don't really intend to work on it as I said above, but it seems vaguely plausible and it's an interesting question!

So yeah that's basically all I have to say on the matter.

-Harry
sniffnoy: (Kirby)
Hey hey hey here you go!

So yeah, obviously this was mostly written quite a while ago (it's just Chapter 4 of my thesis, after all), but I'm only putting it on arXiv now.

...I'd write more about it, but honestly, if you're still reading my LJ, chances are you've heard a lot of it before. (At least, I think I've written about it here before...) So I'll stop here. Well unless someone goes in the comments and posts "What the hell is this?", then probably I'll explain. :P

-Harry

It's done!

May. 27th, 2014 08:31 pm
sniffnoy: (Kirby)
And so today I turned in the final version of my thesis and got my certificate of completion. If there are any more mistakes in there, I'm not fixing them. At least, not until I try to get Chapters 4 and 5 published (though Jeff tells me Chapter 5 will need to be split before it can be published).

It's going on ProQuest of course but also I figure I may as well just upload it to my website at UMich? (Hm, that should really be updated.) There's no reason it shouldn't be freely available. I'll also finally put the code up, for those of you who want it. A warning -- the code is far from readable; I didn't really have time to go back and make it readable, and since it wasn't officially submitted to the school, I didn't really have to. I did at least take the time to document all the functions, but I didn't take the time to put them in a sensible order. (Juan Arias de Reyna, meanwhile, tells me that he may rewrite the whole thing in Python.) Well -- I'll post an update here once I've done that.

EDIT: OK, website is updated, with the thesis and code. You wanted to see how awful my code is, Mickey? :)

Anyway, hooray! Now I actually have some free time for a bit. Will I actually write here more often? Uh, maybe...

-Harry

The defense

May. 9th, 2014 07:28 pm
sniffnoy: (Kirby)
Today was my defense. It went well. I "broke everybody's legs", as Heidi wished me yesterday. Jeff had me make slides for it a few days ago, so I mostly used the slides rather than the blackboard; fortunately we didn't have much trouble getting the projector set up.

Committee was Jeff, Andreas Blass, Alexander Barvinok, Martin Strauss, and Kevin Compton (from the CS department). Karen Smith showed up as well. Also Julian (my academic older brother) happened to be in town so he was there. And various other people; this wasn't supposed to be a complete list, so let me head off the possibility before it turns into one. And of course a number of my housemates showed up -- Beatrix, Angus, Seth, Noelle... perhaps one or two more I'm forgetting? Not sure that any of them understood it besides Beatrix.

Still, the topic obviously was pretty accessible to those with a bit of math background (though I did make a point of stopping to explain what ωω is; that's been a sticking point when I've talked about this before). Which meant that I could actually get into the proofs quite a bit. Most defenses I've gone to, the subject and the statement of the results takes so long to explain that there's barely any time to go into how any of it was proved, but I actually got to do quite a bit of that. I was afraid I would go over time, and I did a little, but only by like 5 minutes. Which is probably by about how much I started late anyway.

Kevin (er, by which I mean Kevin Carde, not Kevin Compton) mentioned to me afterward that he really liked the argument for why, when k is an integer, the order type of D∩[0,k) is exactly ωk and not any larger. (Look at what happens for k-ε and take a limit.) That was a pleasant surprise.

Most unexpected question at the defense (I forget whether this Compton or Strauss): "What if you allow addition, multiplication, and nim-addition?" My response was that, since 3k⊕1=3k-1, well-ordering should fail for the same reason as when you allow subtraction. But up till then, in all the variants of the problem I had considered, it had never occurred to me to consider nim-addition. (Or nim-multiplication, or nim-inversion.) Also Compton asked about ωω showing up in other contexts, which gave me a chance to say a bit about how it's possible it might show up with addition-multiplication chains as well... as well as another less speculative generalization which I then forgot to mention, but oh well.

Spent a bunch of time talking to Kevin and Julian and Karen afterward. Mentioned the fact that the closure of the defect set is the set of numbers of the form "a defect plus a whole number"; they were surprised that the latter was a closed set. Since the arguments for these facts were largely unloaded from memory at the time, all I could really say was, "You know, when you put it that way, it does seem weird."

In addition to the usual little math department celebration (Jeff got me sparkling grape juice, since I don't drink), when I got home I found Beatrix had gotten me a cake as well! When Noelle mentioned this via IM to Justine (who has moved out for the summer and is down in Texas), she said [something along the lines of] "Is it an ice cream cake? It should be an ice cream cake." I told Noelle she can tell Justine, I'm glad to hear she cares, but the cake is fine.

EDIT: OK, actually Justine just asked if it was an ice cream cake; she didn't say it should be. Since it was Justine, I imagined that was the implication, but perhaps that wasn't intended.

Anyway, that's done. I mean, aside from writing up the revisions to my thesis and getting those turned in...

-Harry
sniffnoy: (SMPTE)
So! Juan Arias de Reyna and Jan Van de Lune recently posted to arXiv their paper "Algorithms for Determining integer complexity". In it, they A. improve the known bounds on time complexity for computing ||n||, and B. get a new bound on ||n|| that works for almost all n.

(Hey, I'm blogging about things adjacent to my work again! Well, a little, anyway. More will have to wait.)

To review -- a big problem in integer complexity is determining the limsup of ||n||/(log n), which I'll denote Cmax. Certainly Cmax≤3/(log 2), or about 4.328, since ||n||≤3log2n for all n≥1; this bound follows from writing n in base 2. And Josh Zelinsky, in a paper he still needs to write, has lowered this to ||n||≤27log1260n for all n≥1, so Cmax≤27/(log 1260), or about 3.782. The highest known value of ||n||/(log n) occurs at n=1439, for a value of 26/(log 1439), or about 3.576. This seems to be a unique occurrence, so one ought to have Cmax<26/(log 1439), but the current best upper bounds have not beaten this milestone.

For comparison, if it is indeed the case that ||2k||=2k for all k≥1, then one would have Cmax≥2/(log 2), which is about 2.885; Josh has previously suggested that perhaps the limsup is exactly this number. (Though Iraids et al suggested that perhaps it's even larger.) However, at present, nobody's even been able to prove that the limsup is any greater than the liminf, which is 3/(log 3), or about 2.731 (and which is also an absolute lower bound). And indeed, various people have suggested that perhaps the limsup simply is the liminf[0]. Josh and I attempted a while ago to show it was at least slightly larger, but that ended up not working out, though I'm of the opinion it's worth re-exploring.

Anyway. So the state of Cmax is not good. But we can also define a number I'll call Cavg: We'll define Cavg to be the inf of all C such that ||n||≤Clog(n) for almost all n, i.e., on a set of density 1. (So certainly 3/(log 3)≤Cavg≤Cmax). And it's here that Arias de Reyna and Van de Lune have made an improvement. (But first a bit more history, if you don't mind.)

A number of people have noted that based on writing n in base 2, one can show Cavg≤5/(2log2), or about 3.607. (Already this is better than Josh's bound.) Richard Guy and John Isbell took this a step further and tried writing n in base 24, yielding a bound of Cavg≤265/(24log24), or about 3.474. (This is even better than 26/(log 1439), which the current Cmax bounds are not!) Well, now, based on writing n in base 2936, they've shown that in fact

Cavg≤15903451/(2936log(2936))

which is about 3.321. Quite an improvement, in my opinion!

(As for the true value of Cavg, who knows. Maybe it and Cmax are both equal to 2/(log 2). Well -- if Cmax is at most 2/(log 2), then so is Cavg, and if Cmax is equal to 3/(log 3), then so is Cavg; and if either is true, then even this new bound on Cavg is quite a ways away from the true value. Still. A substantial improvement.)

So what's going on here? How did they do this? Well, it's the same method as Richard Guy and John Isbell used, just applied with a much higher base with the help of a bit of automation. Let's go into a bit more detail.

Let's define D(b,r), as Arias de Reyna and Van de Lune do, to be the smallest number of ones needed to turn a number x into the number bx+r. That's not a formal definition, but it's not too hard to write one down; you can write down a recursion similar to that for integer complexity, allowing you to compute it algorithmically. For r=0, D(b,r) will simply be ||b||. (And for b=0, D(b,r) will simply be ||r||, though we won't care about that here.) We'll only be considering here D(b,r) for 0≤r<b, though one can consider it for r≥b as well. Note, by the way, that (excluding r=0 or b=0) one always has D(b,r)≥max(||b||,||r||). (Actually, so long as r>0, one has D(b,r)>||b||, and so long as b>0, one has D(b,r)>||r||.)

With this language, we can make some nice statements. The method of getting upper bounds on Cmax by writing numbers in different bases simply becomes the statement that, for any b≥2,

Cmax ≤ max0≤r<b D(b,r)/(log b)

...or does it? It's possible I'm neglecting some subtleties with the initial digit here. Well -- it's ultimately irrelevant, because so far nobody's ever found a base that does better than base 2 for getting an upper bound on Cmax! And in base 2 one does not have to worry about such things.

But what certainly is true, and much more useful, is that

Cavg ≤ avg0≤r<b D(b,r)/(log b);

this is the method of writing things in base b to get upper bounds on Cavg. Well, Arias de Reyna and Van de Lune have done this with b=2936, and gotten a pretty nice bound.

But -- and now we get to part A -- this isn't the only thing they've done with the values D(b,r)! They present also in their paper an algorithm for computing ||n||, which is apparently due to Martin Fuller. Now, we already knew that you could do better than O(n2) in terms of the time required to compute ||n||; Srinivas and Shankar presented an algorithm that showed that the exponent 2 could be lowered to log23, or about 1.585.

Arias de Reyna and Van de Lune present a time analysis of Fuller's algorithm, and show that it runs in time O(nα), where α is about 1.246. Interestingly, their time analysis depends on the numbers D(b,r) -- once again, you pick a base b, do computations involving D(b,r) for 0≤r<b, and get out a bound. In this case, the computation involved is rather more complicated than just taking an average, and doesn't yield a number that can be written down in a nice short exact form, but it still is a computation based on D(b,r) for 0≤r<b. The best base they found for this problem was 66, which yielded the above value of α.

So, pretty neat! A little different from what I'm mostly working on, but, it's not like integer complexity is a widely-studied thing. And it shows that the numbers D(b,r) have more than one purpose, and may be worth further study.

-Harry

[0]Indeed, if instead of the integer complexity one considers the addition chain length l(n), which is similar in a number of ways (which reminds me, I've never really posted here about any of my work regarding addition chains; I should probably get around to that sometime), one has that the liminf and limsup of l(n)/(log n) are both equal to each other, both being equal to 1/(log 2).
sniffnoy: (Dead face)
So I decided today to try to get some work done other than writing. But what? I could work on this hard problem that I've gotten nowhere on... or that hard problem I've gotten nowhere on... oh! I'm currently writing the paper where I explain the computational side of what I've done, so this would be a good time to go back over the code and improve it -- there's a few optimizations I've intended to implement for a long time. Well, one big one, anyway.

Surprisingly, playing around with the program, I found a bug I never noticed before: When run in "all information" mode[0], and input a number which is divisible by 3 a fair number of times, it sometimes just crashes rather than output anything.

I have no idea why this is -- well, OK, I haven't sat down and looked into it, but knowing how my code is structured[3], I already have a guess. Still. Guess I'd better fix that before worrying about how to speed things up...

-Harry

[0]Meaning, give information about ||3kn|| for all k≥0, instead of just outputting the stabilization length and stable complexity.
[3]At least, I think I remember...
sniffnoy: (Kirby)
Here's a link.

For those of you that are just tuning in: Let's define ||n|| to be the complexity of n, by which in this context we mean the smallest number of 1s needed to write n using any combination of addition and multiplication. (Note that this is the number 1, not the decimal digit 1. Allowing you to write "11" and say you've only used two 1s would just be silly.)

Then we can define the defect of n, denoted δ(n), to be the quantity ||n||-3log3n; and we can then consider the set of all defects δ(n), as n ranges over all natural numbers. Surprisingly, this set is well-ordered, and its order type is ωω.

...OK, this won't be surprising to you if you've spoken to me anytime in, say, the past several years. But it should be a surprise to almost everyone else. And it's pretty damned neat regardless.

Thanks are of course due to Joshua Zelinsky -- who, after all, defined the object of study of this paper in the first place (defect, that is, not complexity) -- and to Juan Arias de Reyna who not only helped a lot with the editing but also helped organize several of the ideas in the paper in the first place. And other people, but, well, you can check the acknowledgements if you really care about that.

We'll see where I can get this published. In the meantime, this should be quite a bit more readable than the old draft sitting around on my website.

Now I guess it's on to the next paper (for now)... or rather, it already has been for a while...
sniffnoy: (Chu-Chu Zig)
EDIT: Clarity.

Here's another entry from the file.

It's an old idea that addition and multiplication of whole numbers don't get along very well. I attended a talk by my advisor recently on the subject. But one thing that struck me from the examples he used is that the idea of "addition and multiplication don't get along very well" seems to take two distinctly different flavors.

One of his examples was the abc conjecture, and some related ideas; another was Gödel's incompleteness theorem. But the first of these, essentially, says that addition predictably destroys multiplicative structure. While the second says that the interaction of addition and multiplication is so tangled as to be unpredictable.

(His third example was my own well-ordering result regarding the defects of integer complexity, but honestly I'm not sure it even fits into this category at all. The set of defects has some really nice structure! But that gets into stuff (due to a combination of Juan Arias de Reyna and myself) I haven't really talked about here and probably won't get to for a while.)

Anyway, I don't really know where I'm going with this. I think my point just is, "Addition and multiplication don't get along" seems to really be two different ideas actually.

-Harry
sniffnoy: (Dead face)
So. As you probably know, I'm currently writing a paper in which I prove that a certain subset of the real numbers is well-ordered with order type ωω. And yes it should have been done like a month ago (or probably earlier). Real life has introduced some delays.

Anyway. The point is, in order to do this, I need to cite various set theory/order theory/point set topology stuff, to handle ordinals embedded in larger totally ordered sets (which here is always the reals). I have a section of the paper where I introduce all the stuff I need from there. I'd held off on actually writing it until pretty recently though. I didn't actually know where I'd cite the stuff from; I figured it wouldn't be too hard to find.

So Jeff suggested I ask Andreas Blass where I might find citations for these things. His response on hearing just what I wanted was, yes, that's certainly easy, but I'm actually not certain you'll find it in the literature. Try the following really old books; they cared a lot about this sort of thing around the turn of the century.

So I got the books Andreas suggested out from the library, and, unfortunately, they mostly didn't help. So, I'm having to write most of the proofs myself.

Anyway. The point of this entry was a particular thing. Say we have an ordinal α, and we let β be the set of all limit ordinals less than α. How can we express β in terms of α? Sounds easy, right? I mean it's basically just "dividing by ω", right?

Well basically yes, but if you actually want the order type on the nose, well, it's surprisingly easy to screw up. Now actually all I really need is that if α<ωn+1 (n finite), then β<ωn, so I don't need to prove a whole formula. (Actually, I guess if you just replaced n+1 with 1+n, this statement would still be true for n infinite.) But today I sat down and figured out just what the correct formula was (because you know I coudln't find this listed anywhere) so I thought I'd record it here for reference.

First off, if α is finite, there are no limit points. Otherwise...

Say α has Cantor normal form ωγ_kaγ_k + ... + ωγ_0aγ_0, and assume that γ_0=0 (we're going to allow the a_i to be 0). Define α/ω (this may have a standard meaning but I forget, oh well) to mean ω(γ_k)-1aγ_k + ... + ω(γ_1)-1aγ_1. (When I write γ-1 for an ordinal γ, I mean subtracting the 1 off the beginning. So for a finite ordinal this is subtracting 1, and for an infinite ordinal it does nothing.)

Then the order type of β is α/ω-1 if a_0=0, and is (α/ω-1)+1 if a_0>0. (Yeah, that notation is kind of crappy -- it looks like (γ-1)+1 should just be γ (and often it is). But we're subtracting 1 off the beginning, not the end, so rather we have 1+(γ-1)=γ, while (γ-1)+1 is only γ if γ is finite. I guess what we need here is some additive equivalent of the \ that gets used for division-on-the-left in certain contexts. Oh well.

-Harry
sniffnoy: (Kirby)
Numbers with Integer Complexity Close to the Lower Bound, by me and Joshua Zelinsky, on arXiv.

It's to appear in INTEGERS as well, but of course that will have to wait.

Again, many thanks to Jeff Lagarias, Juan Arias de Reyna, and... oh, hell, just go see the acknowledgements if you want to see everyone who helped on this.

I should go update my UMich website now...

-Harry
sniffnoy: (Kirby)
Good (if expected) news! (Though not expected this soon, at least not by me.)

Josh's and my paper, "Numbers with Integer Complexity Close to the Lower Bound", has been accepted for publication in INTEGERS (assuming we fix two typos). And then do a proofreading pass, which I guess one of us will have to actually do.

I guess it's now a bit different than whatever the last version I uploaded to my UMich website was, but, eh, not going to bother fixing that; when it's actually published I'll just change the link...

-Harry
sniffnoy: (Kirby)
It worked!

Time it took Jānis Iraids to compute ||n|| for n≤1012, and thus verify ||2a||=2a for 1≤a≤39, presumaby with access to a supercomputer: 3 weeks[0]

Time it took me to verify not only that ||2a||=2a for 1≤a≤40, but that ||2a3k||=2a+3k for a≤40 and a+k≥1 on my laptop: 12 minutes.

Hooray for better algorithms!

Of course, none of what I've written here is verifiable until I've posted the code, but first I want to reorganize it, add some additional features, and ideally actually make it readable...

(I'm also going to hold off on more computations till then, as one thing I'd want to do is add an "indefinite" mode where you can just cut it off at any point, so I don't have to decide beforehand how high to compute up to...)

-Harry

[0]Source: I asked him on Twitter. I didn't ask about the computer used.
sniffnoy: (Chu-Chu Zig)
What with the conclusion of writing this first paper (gods willing) -- and the end of classes -- I have some brief time to actually do some *thinking* about integer complexity again before Jeff makes me get started on writing the next one[0]. (I believe much of what I am thinking about has already been solved by Juan Arias de Reyna, but I will read his solutions later; first I want to think on this myself some more.) Sorry, no details right now -- well, unless you think you can infer them from the rest of this post!

In earlier drafts (that included material we definitely did not have time to cover in this first paper) I defined a class of ternary families I called "primary ternary families". I am thinking now this was not such a good name. (Also, people keep telling me "ternary family" is a terrible name, and I assume they're probably right, but since right now I'm just talking about naming things for the purposes of my own thinking, I'm going to ignore that right now.)

Rather I am thinking that would be a better name for a slightly more general class of ternary families. (The old meaning is still important, but slightly less so.) But I've used this name long enough that I would have trouble switching it over in my mind. And perhaps a more suggestive term could be used, anyway.

The intutition is that these "primary" ternary families are somehow bulky or substantial. And with the more restricted meaning, they're even more bulky. I like the idea of calling "bulky" what previously I called "primary". But what about the more general class? "Substantial ternary family" is a bit of a mouthful. "Meaty?" No, that's a little too out there. "Solid?" Unfortunately, we ended up using "solid number" to refer to additively irreducible numbers, so that's out. Though maybe we can still change that back to the term we were using previously -- we called such numbers "chunks". I still like this better. Actually, so did Josh, but Jeff had problems with it and we decided it was more important to get the thing done than to bikeshed about the term. But I suspect Jeff slightly misunderstood how we intended to use the term, so perhaps if that is made clear he will change his mind.

Yeah, I think I'll stick with "substantial". (Anyway, these things might well end up as polynomials, and "substantial polynomial" is not so bad to say.)

-Harry

[0]Also some time to do some more coding on the classifier, which is most of what I've been doing. The core of it has been done for a long time, of course, but it still needs to be changed to use exact arithmetic, and I'd also like to add some additional output capabilities. Like maybe, "enter a real number (in a format I can work with), get back the order type of defects up to that real number". I don't know if I'll actually implement that one. Computing order type is straightforward from the existing core tools, of course; it's the reading in a real number in a potentially quite general format I find daunting. :P But I guess I can always just implement the actual function itself, and then say "open the program up with ghci if you want to use these additional features"...

June 2025

S M T W T F S
1234567
891011121314
15161718192021
2223 2425262728
2930     

Syndicate

RSS Atom
Page generated Jun. 30th, 2025 02:50 pm
Powered by Dreamwidth Studios