logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

Math::PlanePath::Staircase -- integer points in stair-step diagonal stripes

Description

       This path makes a staircase pattern down from the Y axis to the X,

            8      29
                    |
            7      30---31
                         |
            6      16   32---33
                    |         |
            5      17---18   34---35
                         |         |
            4       7   19---20   36---37
                    |         |         |
            3       8--- 9   21---22   38---39
                         |         |         |
            2       2   10---11   23---24   40...
                    |         |         |
            1       3--- 4   12---13   25---26
                         |         |         |
           Y=0 ->   1    5--- 6   14---15   27---28

                    ^
                   X=0   1    2    3    4    5    6

       The 1,6,15,28,etc along the X axis at the end of each run are the hexagonal numbers k*(2*k-1).  The
       diagonal 3,10,21,36,etc up from X=0,Y=1 is the second hexagonal numbers k*(2*k+1), formed by extending
       the hexagonal numbers to negative k.  The two together are the triangular numbers k*(k+1)/2.

       Legendre's prime generating polynomial 2*k^2+29 bounces around for some low values then makes a steep
       diagonal upwards from X=19,Y=1, at a slope 3 up for 1 across, but only 2 of each 3 drawn.

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

           n_start => 0

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

Formulas

RectangletoNRange
       Within  each  row increasing X is increasing N, and in each column increasing Y is increasing pairs of N.
       Thus for "rect_to_n_range()" the lower left corner vertical pair is the minimum N  and  the  upper  right
       vertical pair is the maximum N.

       A given X,Y is the larger of a vertical pair when ((X^Y)&1)==1.  If that happens at the lower left corner
       then  it's X,Y+1 which is the smaller N, as long as Y+1 is in the rectangle.  Conversely at the top right
       if ((X^Y)&1)==0 then it's X,Y-1 which is the bigger N, again as long as Y-1 is in the rectangle.

Functions

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

       "$path = Math::PlanePath::Staircase->new ()"
       "$path = Math::PlanePath::AztecDiamondRings->new (n_start => $n)"
           Create and return a new staircase path object.

       "$n = $path->xy_to_n ($x,$y)"
           Return  the  point  number  for  coordinates "$x,$y".  $x and $y are rounded to the nearest integers,
           which has the effect of treating each point $n as a square  of  side  1,  so  the  quadrant  x>=-0.5,
           y>=-0.5 is covered.

       "($n_lo, $n_hi) = $path->rect_to_n_range ($x1,$y1, $x2,$y2)"
           The returned range is exact, meaning $n_lo and $n_hi are the smallest and biggest in the rectangle.

Home Page

License

       Copyright 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021 Kevin Ryde

       This file is part of Math-PlanePath.

       Math-PlanePath is free software; you can redistribute it and/or modify it under  the  terms  of  the  GNU
       General  Public  License  as  published  by  the  Free Software Foundation; either version 3, or (at your
       option) any later version.

       Math-PlanePath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without  even
       the  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
       License for more details.

       You should have received a copy of the GNU General Public License along with Math-PlanePath.  If not, see
       <http://www.gnu.org/licenses/>.

perl v5.32.0                                       2021-01-23                    Math::PlanePath::Staircase(3pm)

Name

       Math::PlanePath::Staircase -- integer points in stair-step diagonal stripes

Oeis

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

           <http://oeis.org/A084849> (etc)

           n_start=1 (the default)
             A084849    N on diagonal X=Y
             A210521    permutation N by diagonals, upwards
             A199855      inverse

           n_start=0
             A014105    N on diagonal X=Y, second hexagonal numbers

           n_start=2
             A128918    N on X axis, except initial 1,1
             A096376    N on diagonal X=Y

See Also

       Math::PlanePath, Math::PlanePath::Diagonals, Math::PlanePath::Corner, Math::PlanePath::ToothpickSpiral

Synopsis

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

See Also