The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

# NAME

Math::PlanePath::AnvilSpiral -- integer points around an "anvil" shape

# SYNOPSIS

`````` use Math::PlanePath::AnvilSpiral;
my \$path = Math::PlanePath::AnvilSpiral->new;
my (\$x, \$y) = \$path->n_to_xy (123);``````

# DESCRIPTION

This path makes a spiral around an anvil style shape,

``````                           ...-78-77-76-75-74       4
/
49-48-47-46-45-44-43-42-41-40-39-38 73          3
\                             /  /
50 21-20-19-18-17-16-15-14 37 72             2
\  \                 /  /  /
51 22  5--4--3--2 13 36 71                1
\  \  \     /  /  /  /
52 23  6  1 12 35 70              <- Y=0
/  /  /        \  \  \
53 24  7--8--9-10-11 34 69               -1
/  /                    \  \
54 25-26-27-28-29-30-31-32-33 68            -2
/                                \
55-56-57-58-59-60-61-62-63-64-65-66-67         -3

^
-6 -5 -4 -3 -2 -1 X=0 1  2  3  4  5  6  7``````

The pentagonal numbers 1,5,12,22,etc, P(k) = (3k-1)*k/2 fall alternately on the X axis X>0, and on the Y=1 horizontal X<0.

Those pentagonals are always composites, from the factorization shown, and as noted in "Step 3 Pentagonals" in Math::PlanePath::PyramidRows, the immediately preceding P(k)-1 and P(k)-2 are also composites. So plotting the primes on the spiral has a 3-high horizontal blank line at Y=0,-1,-2 for positive X, and Y=1,2,3 for negative X (after the first few values).

Each loop around the spiral is 12 longer than the preceding. This is 4* more than the step=3 `PyramidRows` so straight lines on a `PyramidRows` like these pentagonals are also straight lines here, but split into two parts.

The outward diagonal excursions are similar to the `OctagramSpiral`, but there's just 4 of them here where the `OctagramSpiral` has 8. This is reflected in the loop step. The basic `SquareSpiral` is step 8, but by taking 4 excursions here increases that to 12, and in the `OctagramSpiral` 8 excursions adds 8 to make step 16.

## Wider

An optional `wider` parameter makes the path wider by starting with a horizontal section of given width. For example

``    \$path = Math::PlanePath::SquareSpiral->new (wider => 3);``

gives

``````    33-32-31-30-29-28-27-26-25-24-23 ...            2
\                          /  /
34 11-10--9--8--7--6--5 22 51                1
\  \              /  /  /
35 12  1--2--3--4 21 50              <- Y=0
/  /                 \  \
36 13-14-15-16-17-18-19-20 49               -1
/                             \
37-38-39-40-41-42-43-44-45-46-47-48            -2

^
-6 -5 -4 -3 -2 -1 X=0 1  2  3  4  5``````

The starting point 1 is shifted to the left by ceil(wider/2) places to keep the spiral centred on the origin X=0,Y=0. This is the same starting offset as the `SquareSpiral` `wider`.

Widening doesn't change the nature of the straight lines which arise, it just rotates them around. Each loop is still 12 longer than the previous, since the widening is essentially a constant amount in each loop.

## N Start

The default is to number points starting N=1 as shown above. An optional `n_start` can give a different start with the same shape. For example to start at 0,

``````    n_start => 0

20-19-18-17-16-15-14-13 ...
\                 /  /
21  4--3--2--1 12 35
\  \     /  /  /
22  5  0 11 34
/  /        \  \
23  6--7--8--9-10 33
/                    \
24-25-26-27-28-29-30-31-32``````

The only effect is to push the N values around by a constant amount. It might help match coordinates with something else zero-based.

# FUNCTIONS

See "FUNCTIONS" in Math::PlanePath for behaviour common to all path classes.

`\$path = Math::PlanePath::AnvilSpiral->new ()`
`\$path = Math::PlanePath::AnvilSpiral->new (wider => \$integer, n_start => \$n)`

Create and return a new anvil spiral object. An optional `wider` parameter widens the spiral path, it defaults to 0 which is no widening.

# OEIS

Entries in Sloane's Online Encyclopedia of Integer Sequences related to this path include

``````    default wider=0, n_start=1
A033570    N on X axis, alternate pentagonals (2n+1)*(3n+1)
A126587    N on Y axis
A136392    N on Y negative (n=-Y+1)
A033568    N on X=Y diagonal, alternate second pents (2*n-1)*(3*n-1)
A085473    N on south-east diagonal

wider=0, n_start=0
A211014    N on X axis, 14-gonal numbers of the second kind
A139267    N on Y axis, 2*octagonal
A049452    N on X negative, alternate pentagonals
A033580    N on Y negative, 4*pentagonals
A051866    N on X=Y diagonal, 14-gonal numbers
A094159    N on north-west diagonal, 3*hexagonals
A049453    N on south-west diagonal, alternate second pentagonal
A195319    N on south-east diagonal, 3*second hexagonals

wider=1, n_start=0
A051866    N on X axis, 14-gonal numbers
A049453    N on Y negative, alternate second pentagonal
A033569    N on north-west diagonal
A085473    N on south-west diagonal
A080859    N on Y negative
A033570    N on south-east diagonal
alternate pentagonals (2n+1)*(3n+1)

wider=2, n_start=1
A033581    N on Y axis (6*n^2) except for initial N=2``````

http://user42.tuxfamily.org/math-planepath/index.html