Rand Stats

Math::Arrow

zef:raku-community-modules

Actions Status Actions Status Actions Status

NAME

Math::Arrow - Handle Knuth-style arrow notation

SYNOPSIS

In Knuth arrow notation, one arrow is simple exponentiation:

23 # 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 as 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(44 ))))) =
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.