
Inventing an Operation to Solve x^x = y (2000) - ColinWright
http://mathforum.org/library/drmath/view/54586.html
======
hprotagonist
It’s always nice when people independently reinvent good ideas! This poster’s
more or less come up with up-arrow notation and a shot at its inverse.

edit: actually meant
[https://en.wikipedia.org/wiki/Tetration](https://en.wikipedia.org/wiki/Tetration)

[https://en.wikipedia.org/wiki/Knuth%27s_up-
arrow_notation](https://en.wikipedia.org/wiki/Knuth%27s_up-arrow_notation)

~~~
ColinWright
As is pointed out further down, it does effectively invent tetration, which is
cool, but that's not Knuth's arrow notation.

 _Edited: I 've removed the original and replaced it with the above because
clearly my original comment wasn't being understood the way it was intended.
Possibly this is no better, but it's worth a try._

 _To provide context, the comment by elil17 is in response to my original, in
which I asked what this had to do with Knuth 's arrow notation._

~~~
elil17
a@2 = a↑↑2

~~~
ColinWright
Except the essence of Knuth's up-arrow notation is the recursive nature. This
is going one step, and while I agree that it's a first step, it doesn't
actually get the recursive nature. So this is a notation for a single thing,
not a general thing. It's good, but i's missing the generalisation step that
is what makes Knuth's notation particularly special.

Maybe I know too much about the field, maybe I don't know enough, but I've
looked over this many times and it doesn't seem to me to be making "the step."

Maybe I'm just expecting too much, but it feels like the heart of Knuth's
notation is missing.

 _< fx: shrug />_ I'll leave it at that. Feel free to disagree, perhaps it's
an interesting talking point.

~~~
perl4ever
I find it hard to focus on this stuff, but is there really any ultimate
generalization? Like, you always can recurse once more - once you define up
arrows, then why not iterate them?

↑n means n up arrows, so why not have an operator that applies up arrows a
number of times defined with up arrows?

It seems like it's just dipping your toe into large numbers, no matter how far
you go.

~~~
Gondolin
The ultimate generalization is to use an inductive definition based on
recursive ideals. For instance the fast growing hierarchy f_alpha:
[https://en.wikipedia.org/wiki/Fast-
growing_hierarchy](https://en.wikipedia.org/wiki/Fast-growing_hierarchy)

Since ordinals are the ultimate recursion tool, any such function will
ultimately grow faster than whatever recursive definition you can cook up by
hand.

For instance even the slow growing hierarchy g_alpha, which grows _very very_
slowly catches up to the fast hierarchy at extremely large ordinals.

Some examples:

\- f_0 behaves like addition, f_1 like multiplication, f_2 like
exponentiation, f_3 like tetration, f_w like Ackerman

\- Graham number is bounded by f_{w+1}(64)

\- Goodstein function behaves like f_{epsilon_0} (this show how much faster it
grows than Ackerman). Similar for the Kirby-Paris Hydra

\- n-Iterated goodstein behaves live f_{\phi(n-2,0)} where \phi is Veblen's
function

\- the tree function from Kruskal's tree theorem behaves like
f_{\psi(Omega^Omega^omega}, ie by the small Veblen ordinal. And the graph
function from the Robertson-Seymour theorem behaves like \psi(Omega_omega).

By contrast the slow growing hierarchy grows extremely slowly, for instance
g_{epsilon_0} only grows like tetration. But it still catches up to the fast
growing hierarchy at very large ordinals.

~~~
perl4ever
Like I said, I can't really follow this stuff, but maybe the ultimate would be
the Busy Beaver function? Is there such a thing as a proof of how many
functions can be between something computable and Busy Beaver, given some sort
of constraints?

~~~
Gondolin
Yes, the Busy Beaver function grows faster than the functions I gave,
basically it behaves like f_{w^1_CK} (although this does not really make sense
because w^1_CK, the Church Kleen ordinal, is not recursive).

By "ultimate generalisation" I was speaking about a family of computable
functions that ultimately grow faster than other functions you could cook up
by hand: you put all the recursivity in the ordinals, they are there for that,
and logicians are very good at constructing very large (recursive) ordinals.

If you just want a very very fast growing function (but that is still
computable, unlike busy beaver), you can do the a light busy beaver version:
Beaver(N)=the maximal output of all turing machines T with N state where there
is a proof in ZFC of length <=N that T terminates.

This function grows much faster than the other functions I described
(basically it is a f_{ordinal consistency of ZFC}. If you are interested in
this kind of ideas, there is this reddit post that develops these ideas:
[https://www.reddit.com/r/math/comments/283298/how_to_compute...](https://www.reddit.com/r/math/comments/283298/how_to_compute_a_very_large_number/)

------
youareawesome
This is easily solved using the Lambert W function:

Observe: W(x * e ^ x) = x

    
    
        x ^ x = y
        ln(x ^ x) = ln(y)
        ln(x) * x = ln(y)
        ln(x) * e ^ ln(x) = ln(y)
        W(ln(x) * e ^ ln(x)) = W(ln(y))
        ln(x) = W(ln(y))
        x = e^W(ln(y))
    

[https://en.wikipedia.org/wiki/Lambert_W_function](https://en.wikipedia.org/wiki/Lambert_W_function)

~~~
throwlaplace
That's pretty asinine since the W function is that inverse (basically). You're
just saying "this is easily solved by easily solving".

Before anyone jumps on me: I'm perfectly familiar and comfortable with
functions that aren't defined in closed form.

~~~
knzhou
That's true for almost any nontrivial transcendental algebraic or differential
equation. Special functions to solve special cases are the norm.

We could repeat the same discussion at a lower level. Suppose you tell a
bright middle schooler about the basics of integration, and the power rule.
Then they ask,

"So what's the integral of 1/x? It can't be x^0/0..."

"That's a special case. It's a function called "natural logarithm", ln(x)."

"But what's the definition of that weird function?"

"It's defined to be the integral of 1/x." [0]

"That's pretty asinine..."

[0]
[https://en.wikipedia.org/wiki/Natural_logarithm#Definitions](https://en.wikipedia.org/wiki/Natural_logarithm#Definitions)

------
anon1253
I asked the same question a while ago,
[https://math.stackexchange.com/questions/613946/xx-y-
given-y...](https://math.stackexchange.com/questions/613946/xx-y-given-y-
solve-for-x-analytically)

Interesting analysis of the problem :-) it has been bugging me since high
school!

Might be worth linking to the Lambert W function
[https://en.wikipedia.org/wiki/Lambert_W_function](https://en.wikipedia.org/wiki/Lambert_W_function)

This was the best comment I'd reckon:

> As you probably saw, the solution of x^x = y is x = Log(y) / W[Log(y)]. Now
> you take us in a highly philosophical debate. What is the limit of
> elementary functions ? Thanks for this question. Cheers. – Claude Leibovici

~~~
edflsafoiewq
That comment references the worked examples that used to be on the Lambert W
wiki page, including this exact problem, x^x=y. Here's the last version before
it was deleted if anyone wants to see it:

[https://en.wikipedia.org/w/index.php?title=Lambert_W_functio...](https://en.wikipedia.org/w/index.php?title=Lambert_W_function&oldid=910867451#Example_2)

------
ludamad
One thing that has got me thinking in the past was another kind of
formula,`f(f(x)) = g(x)`, where `g` is given. It bothered me that far from a
general algorithm being known, individual cases were stumping (e.g., `f(f(x))
= e^x`). Any insights/references from HN folks about this?

~~~
dan-robertson
Problems like these (typically restricted to integers/natural numbers) come up
in competitions from time to time. Sometimes there are some tricks required
that are very hard to find on the spot. Here is a related problem you may
enjoy:

    
    
      Find all increasing functions f : N -> N such that f(f(x)) = 3x

~~~
a1369209993
∅

assume f exists

increasing requires that x < f(x) < f(f(x))

f(f(0)) = 3*0 = 0 ≮ 0

therefore f does not exist, qed

~~~
AnimalMuppet
f(x) = sqrt(3) * x. Then f(f(x)) = sqrt(3) * sqrt(3) * x = 3x.

So there is at least one solution.

~~~
a1369209993
That's not increasing (√3 * 0 = 0 ≮ 0) _and_ it's not on natural numbers (√3 *
1 = √3 (≈ 1.732) ∉ ℕ).

~~~
JoshuaDavid
I think in this context "increasing" means f(x+ε)>f(x) for all x, not f(x) > x
for all x.

~~~
a1369209993
What is ε? The original problem is about natural numbers (ie
nonnegative/unsigned integers).

~~~
AnimalMuppet
Well then, f(x + 1) > f(x). I don't know where you're getting this x < f(x) as
"increasing".

The point about sqrt(3) not working for the naturals is a valid point,
however.

~~~
a1369209993
> Well then, f(x + 1) > f(x). I don't know where you're getting this x < f(x)
> as "increasing".

 _Headdesk_ Yes, that's correct; I misparsed "increasing functions f" as
"functions f that increase [the value passed through them]" and then got
distracted by the discrete vs continuous confusion.

~~~
AnimalMuppet
Well, I missed that the domain was N, so... let's both just blame the
tryptophan and call it good.

------
yiyus
The J language makes trivial to solve this problem without a tetration
operator:

    
    
           (^~^:_1)5
        2.12937

~~~
H8crilA
How's that implemented? Newton's method like in the OP? I.e. if there's at
least one solution there's an okay chance to find at most one solution?

~~~
xelxebar
Essentially, yes.

> (^~^:_1) 5

First, let me break this down, in the interest of sharing the joys of J.

The thing in parenthesis is our inverse operation of x^x; we then evaluate
that at 5. The first ^ is exponentiation and the following ~ makes binary
operators into unary ones by evaluating on the diagonal. In other words it
turns f(x,y) into f(x) = f(x,x), which for x^y corresponds to x^x.

Next we have the ^: modifier. This is function iteration, i.e. exponentiation
over function composition. The function is on the left (here ^~) and the count
on the right (here _1). So f ^: 2 means f(f(x)). In fact, this function
exponentiation is extended to negative integers as well! In J, negative
numbers are prefixed with _ (underscore), and f^:_1 actually gives us the
inverse of f (if it exists)!

Anyway, we can see inspect the definition for an operation's inverse using the
b. verb. From the jconsole:

    
    
            ^~ b. _1
        3 : '(- -&b@(*^.) % >:@^.)^:_ ]1>.b=.^.y'"0 :.(^~)
    

The part we are interested in is in single quotes. Pulling this one apart
would involve introducing the various operator combinators in J, so suffice it
to say that the ^:_ part numerically approximates a fixed point of the part in
parenthesis, which essentially is a straightforward transcription of the
recursive relation in Newton's method.

------
Straw
We can express the solution in terms of the Lambert-W function, the inverse of
f(x) = x*exp(x).

We still need a new function, but at least Lambert-W comes up in other places
as well- not much worse than introducing log.

------
chewzerita
All this talks about centers, operations and inverse operations reminds me of
monoids from learning haskell:
[https://en.wikibooks.org/wiki/Haskell/Monoids](https://en.wikibooks.org/wiki/Haskell/Monoids)

~~~
DoctorOetker
is it just belgium where we call these "center's" _neutral elements_ of an
operation, or did the rest of the HN geography just forget that term?

~~~
47348436885325
I think what the original author meant by "centers" of addition and
multiplication is closer to "empty sum" and "empty product" respectively. From
what they wrote, it seems that they wanted more than just neutrality. In any
case I don't think we should retroactively label their novel and necessarily
unique concept with a familiar name.

------
zw123456
I couldn't resist chucking it into wolfram alpha
[https://www.wolframalpha.com/input/?i=solve+x^x+-+y+=+0](https://www.wolframalpha.com/input/?i=solve+x^x+-+y+=+0)
[https://www.wolframalpha.com/input/?i=x%5Ex%3Dy](https://www.wolframalpha.com/input/?i=x%5Ex%3Dy)
I think someone else mentioned W function, which is shown in the wolfram
solution The thing I found interesting is the graph, there is a local min at
1/e, so the solution depends on y >1 or e^-1/e <= 1 very interesting curve.

------
macawfish
Reminds me of this fascinating paper:
[https://arxiv.org/pdf/math/0112050.pdf](https://arxiv.org/pdf/math/0112050.pdf)

It's about an infinite chain of operations where each is to the last as
multiplication is to addition.

------
throwaway71828
Here is another fun problem for you folks:

x^x^x^... (infinite power tower) = 2.

If you solved it, try the general case of

x^x^x^... = y, for some arbitrary constant y.

~~~
H8crilA
How do you define infinite power? A limit of such series, if exists?

{x, x^x, x^x^x, ...}

~~~
lokedhs
That would be equal to x^y, which means that the solution is the y'th root of
y?

However, don't you have to prove that the series converges? Is the approach
even valid if it doesn't?

~~~
jwilk
Note that according to your solution, x=√2 for both y=2 and y=4. But of course
the sequence cannot converge to both 2 and 4 at the same time!

------
zabzonk
Might be useful if it was stated at the start of the post exactly what the ^
operator is supposed to do - it does different things in different programming
languages.

~~~
namirez
I always felt the Fortran exponentiation operator (* *), which is inherited by
javascript and php, was more intuitive notation.

~~~
samatman
Interesting, the caret looks better to my eyes, since the real notation is x²,
thus x^2 is pointing at where the 2 should be.

But I get the reading of double-asterisk as 'multiplication of multiplication'
as well, either is fairly transparent really.

~~~
kaoD
Indeed. To me C's ^ as xor has always been the weird one since it actually
looks like a logical and:
[https://en.m.wikipedia.org/wiki/List_of_logic_symbols](https://en.m.wikipedia.org/wiki/List_of_logic_symbols)

