NAME
Math::Arrow - Handle Knuth-style arrow notation
SYNOPSIS
In Knuth arrow notation, one arrow is simple exponentiation:
2 ↑ 3 # gives 8
Every additional arrow in the operator implies a layer of reduction of the form:
a ↑{n number of ↑'s} b =
a ↑{n-1 ↑'s} ( a ↑{n-1 ↑'s (... a)...)
where there are b
number of a
s in the second form.
But this module only implements up to five arrows (really, if you need more than five, I question what the hell you think Raku is going to do for you...)
More concretely:
4 ↑↑↑↑ 3 =
4 ↑↑↑ ( 4 ↑↑↑ 4 ) =
4 ↑↑↑ ( 4 ↑↑ ( 4 ↑↑ ( 4 ↑↑ 4 ))) =
4 ↑↑↑ ( 4 ↑↑ ( 4 ↑↑ ( 4 ↑ (4 ↑ (4 ↑ 4 ))))) =
4 ↑↑↑ ( 4 ↑↑ ( 4 ↑↑ ( 4 ** 4 ** 4 ** 4))) = ...
As you can see, this quickly gets out of hand. In fact, there are very few arrow-notation expressions which can be evaluated in a practical period of time (the above example would take longer to fully evaluate than the universe has been around, even on the fastest computers available, today.
Probably the best-known arrow-notation example is Graham's Number (G) which is defined as:
$g1 = 3 ↑↑↑↑ 3;
$g2 = arrow(3, 3, $g1);
...
$g64 = arrow(3, 3, $g63);
use constant G = $g64;
operator ↑
The ↑
operator is an infix operator which is equivalent to arrow(left-hand-side, right-hand-side, 1)
and **
and performs simple exponentiation. It is right-associative, just like **
.
operator ↑↑
The ↑↑
operator is also a right-associative infix operator and is equivalent to arrow(lhs, rhs, 2)
.
operator ↑↑↑
See ↑↑
for details. Equivalent to arrow(lhs, rhs, 3)
.
operator ↑↑↑↑
See ↑↑
for details. Equivalent to arrow(lhs, rhs, 4)
.
operator ↑↑↑↑↑
See <↑↑> for details. Equivalent to arrow(lhs, rhs, 5)
.
arrow($a, $b, $arrows)
Returns the arrow-notation expansion for $a ↑[$arrows] $b
where ↑[$arrows]
denotes $arrows
many ↑
in the final operator. Thus these two are equivalent:
arrow(3, 3, 4) == (3 ↑↑↑↑ 3)
term G
use Math::Arrow :constants;
say G; # you won't have enough CPU or memory to see it
Only exported via the :constants
tag.
The value G
is defined as a more-or-less humorous element of this module. It can never be used for anything practical, as evaluating its value would take such a mind-bogglingly large amount of time and memory that you might as well simply shoot your computer. But... don't do that.
This value is Graham's number, defined as described above.
AUTHOR
Aaron Sherman
COPYRIGHT AND LICENSE
Copyright 2016-2017 Aaron Sherman
Copyright 2024 Raku Community
This library is free software; you can redistribute it and/or modify it under the Artistic License 2.0.