The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Math::PlanePath::ImaginaryHalf -- half-plane replications in three directions

SYNOPSIS

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

DESCRIPTION

This is a half-plane variation on the ImaginaryBase path.

     54-55 50-51 62-63 58-59 22-23 18-19 30-31 26-27       3
       \     \     \     \     \     \     \     \
     52-53 48-49 60-61 56-57 20-21 16-17 28-29 24-25       2

     38-39 34-35 46-47 42-43  6--7  2--3 14-15 10-11       1
       \     \     \     \     \     \     \     \
     36-37 32-33 44-45 40-41  4--5  0--1 12-13  8--9   <- Y=0

    -------------------------------------------------
    -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 X=0 1  2  3  4  5

The pattern can be seen by dividing into the following blocks,

    +---------------------------------------+
    | 22   23   18   19   30   31   26   27 |
    |                                       |
    | 20   21   16   17   28   29   24   25 |
    +---------+---------+-------------------+
    |  6    7 |  2    3 | 14   15   10   11 |
    |         +----+----+                   |
    |  4    5 |  0 |  1 | 12   13    8    9 |
    +---------+----+----+-------------------+

N=0 is at the origin, then N=1 is to the right. Those two are repeated above as N=2 and N=3. Then that 2x2 repeated to the right as N=4 to N=7, then 4x2 repeated below N=8 to N=16, and 4x4 to the right as N=16 to N=31, etc. The repetitions are successively to the right, above, left. The relative layout within a replication is unchanged.

This is similar to the ImaginaryBase, but where it repeats in 4 directions there's only 3 here. The ZOrderCurve is a 2 direction replication.

Radix

The radix parameter controls the "r" used to break N into X,Y. For example radix => 4 gives 4x4 blocks, with r-1 copies of the preceding level at each stage.

     radix => 4  

     60 61 62 63 44 45 46 47 28 29 30 31 12 13 14 15      3
     56 57 58 59 40 41 42 43 24 25 26 27  8  9 10 11      2
     52 53 54 55 36 37 38 39 20 21 22 23  4  5  6  7      1
     48 49 50 51 32 33 34 35 16 17 18 19  0  1  2  3  <- Y=0

    --------------------------------------^-----------
    -12-11-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 X=0 1  2  3

Notice for X negative the parts replicate successively towards -infinity, so the block N=16 to N=31 is first at X=-4, then N=32 at X=-8, N=48 at X=-12, and N=64 at X=-16 (not shown).

Axis Values

N=0,1,4,5,8,9,etc on the X axis (positive and negative) are those integers with a 0 at every third bit, starting from the second least significant bit. This is simply demanding that the bits going to the Y coordinate must be 0.

    X axis Ns = binary ...__0__0__0_     with _ either 0 or 1
    in octal, digits 0,1,4,5 only

The N=0,1,8,9,etc on the X positive axis have the high 1 bit in the first slot of a 3-bit group. N=0,4,5,etc on the X negative axis have the high 1 bit in the second slot,

    X pos Ns = binary 1_0__0__0__0...0__0__0_
    in octal, high octal digit 1

    X neg Ns = binary  10__0__0__0...0__0__0_
    in octal, high octal digit 4 or 5

N=0,2,16,18,etc on the Y axis are conversely those integers with a 0s in each two of three bits, again simply demanding the bits going to the X coordinate must be 0.

    Y axis Ns = binary ..._00_00_00_0    with _ either 0 or 1
    in octal, digits 0,2 only

For a radix other than binary the pattern is the same. Each "_" is any digit of the given radix, and each 0 must be 0. The high 1 bit for X positive and negative becomes the high non-zero digit, 1 to radix-1.

Level Ranges

Because the X direction replicates twice for each once in the Y direction the width grows at twice the rate, so width = height*height, after each 3 replications. For this reason N values for a given Y grow quite rapidly.

Proth Numbers

The Proth numbers fall in columns on the path.

    *                               *                               *



    *                               *                               *



    *                               *                               *



    *               *               *               *               *



    *               *               *               *               *

                            *       *       *       *

    *       *       *       *       *       *       *       *       *

                            *   *   *   *   *       *
                                    *
    *       *       *       *   * *   * *   *       *       *       *

    -----------------------------------------------------------------
    -31    -23     -15     -7  -3-1 0 3 5   9      17       25     33

The height of the column follows the position of the number of zeros in X ending ...1000..0001 in binary as this limits the "k" part of the Proth numbers which can have N ending suitably. Or for X negative the ending ...10111...11.

FUNCTIONS

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

$path = Math::PlanePath::ImaginaryBase->new ()
$path = Math::PlanePath::ImaginaryBase->new (radix => $r)

Create and return a new path object.

($x,$y) = $path->n_to_xy ($n)

Return the X,Y coordinates of point number $n on the path. Points begin at 0 and if $n < 0 then the return is an empty list.

SEE ALSO

Math::PlanePath, Math::PlanePath::ImaginaryBase, Math::PlanePath::ZOrderCurve

HOME PAGE

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

LICENSE

Copyright 2012 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/>.