NAME
Math::PlanePath::PowerArray -- array by powers
SYNOPSIS
use Math::PlanePath::PowerArray;my $path = Math::PlanePath::PowerArray->new (radix => 2);my ($x, $y) = $path->n_to_xy (123);
DESCRIPTION
This is a split of N into an odd part and power of 2,
12 | 25 50 100 200 400 800 1600 3200 640011 | 23 46 92 184 368 736 1472 2944 588810 | 21 42 84 168 336 672 1344 2688 53769 | 19 38 76 152 304 608 1216 2432 48648 | 17 34 68 136 272 544 1088 2176 43527 | 15 30 60 120 240 480 960 1920 38406 | 13 26 52 104 208 416 832 1664 33285 | 11 22 44 88 176 352 704 1408 28164 | 9 18 36 72 144 288 576 1152 23043 | 7 14 28 56 112 224 448 896 17922 | 5 10 20 40 80 160 320 640 12801 | 3 6 12 24 48 96 192 384 768Y=0 | 1 2 4 8 16 32 64 128 256+------------------------------------------------------X=0 1 2 3 4 5 6 7 8
For N=odd*2^k, the coordinates are X=k, Y=(odd-1)/2. The X coordinate is how many factors of 2 can be divided out. The Y coordinate counts odd integers 1,3,5,7,etc as 0,1,2,3,etc. This is clearer by writing N values in binary,
N values in binary6 | 1101 11010 110100 1101000 11010000 1101000005 | 1011 10110 101100 1011000 10110000 1011000004 | 1001 10010 100100 1001000 10010000 1001000003 | 111 1110 11100 111000 1110000 111000002 | 101 1010 10100 101000 1010000 101000001 | 11 110 1100 11000 110000 1100000Y=0 | 1 10 100 1000 10000 100000+---------------------------------------------------------X=0 1 2 3 4 5
Column X=0 is all the odd numbers, column X=1 is exactly one low 0-bit, and so on.
Radix
The "radix" parameter can do the same dividing out in a higher base. For example radix 3 divides out factors of 3,
radix => 38 | 13 39 117 351 1053 3159 9477 284317 | 11 33 99 297 891 2673 8019 240576 | 10 30 90 270 810 2430 7290 218705 | 8 24 72 216 648 1944 5832 174964 | 7 21 63 189 567 1701 5103 153093 | 5 15 45 135 405 1215 3645 109352 | 4 12 36 108 324 972 2916 87481 | 2 6 18 54 162 486 1458 4374Y=0 | 1 3 9 27 81 243 729 2187+------------------------------------------------X=0 1 2 3 4 5 6 7
N=1,3,9,27,etc on the X axis is the powers of 3.
N=1,2,4,5,7,etc on the Y axis is the integers N = 1or2 mod 3, ie. those not a multiple of 3. Notice if Y = 1or2 mod 4 then the N values in that row are all even, or if Y = 0or3 mod 4 then the N values are all odd.
radix => 3, N values in ternary6 | 101 1010 10100 101000 1010000 101000005 | 22 220 2200 22000 220000 22000004 | 21 210 2100 21000 210000 21000003 | 12 120 1200 12000 120000 12000002 | 11 110 1100 11000 110000 11000001 | 2 20 200 2000 20000 200000Y=0 | 1 10 100 1000 10000 100000+----------------------------------------------------X=0 1 2 3 4 5
Boundary Length
The points N=1 to N=2^k-1 inclusive have a boundary length
boundary = 2^k + 2k = 4,8,14,24,42,76,... (OEIS A100314)
For example N=1 to N=7 is
+---+| 7 |+ +| 5 |+ +---+| 3 6 |+ +---+| 1 2 4 |+---+---+---+
The height is the odd numbers, so 2^(k-1). The width is the power k. So total boundary 2*height+2*width = 2^k + 2k.
If N=2^k is included then it's on the X axis and so add 2 for boundary = 2^k + 2k + 2 (OEIS 2*A052968).
For another radix the calculation is similar
boundary = 2 * (radix-1) * radix^(k-1) + 2*k
For example radix=3, N=1 to N=8 is
87542 61 3
The height is the non-multiples of the radix, so (radix-1)/radix * radix^k. The width is the power k. Total boundary = 2*height+2*width.
FUNCTIONS
See "FUNCTIONS" in Math::PlanePath for the behaviour common to all path classes.
- "$path = Math::PlanePath::PowerArray->new ()"
-
Create and return a new path object.
- "($x,$y) = $path->n_to_xy ($n)"
-
Return the X,Y coordinates of point number
$non the path. Points begin at 1 and if"$n < 0"then the return is an empty list.
- "$n = $path->xy_to_n ($x,$y)"
-
Return the N point number at coordinates
"$x,$y". If"$x<0"or"$y<0"then there's no N and the return is"undef".N values grow rapidly with
$x. Pass in a number type such as"Math::BigInt"to preserve precision.
- "($n_lo, $n_hi) = $path->rect_to_n_range ($x1,$y1, $x2,$y2)"
-
The returned range is exact, meaning
$n_loand$n_hiare the smallest and biggest in the rectangle.
FORMULAS
Rectangle to N Range
Within each row, increasing X is increasing N. Within each column, increasing Y is increasing N. So in a rectangle the lower left corner is the minimum N and the upper right is the maximum N.
| N max| ----------+| | ^ || | | || | ----> || +----------| N min+-------------------
N to Turn Left or Right
The turn left or right is given by
radix = 2 left at N==0 mod radix and N==1mod4, right otherwiseradix >= 3 left at N==0 mod radixright at N=1 or radix-1 mod radixstraight otherwise
The points N!=0 mod radix are on the Y axis and those N==0 mod radix are off the axis. For that reason the turn at N==0 mod radix is to the left,
|C-----A--__ -- point B is N=0 mod radix,| --- B turn left A-B-C is left
For radix>=3 the turns at A and C are to the right, since the point before A and after C is also on the Y axis. For radix>=4 there's of run of points on the Y axis which are straight.
For radix=2 the "B" case N=0 mod 2 applies, but for the A,C points in between the turn alternates left or right.
1-- N=1 mod 4 3-- N=3 mod 4\ -- turn left \ -- turn right\ -- \ --2 -- 2 ---- ---- --0 4
Points N=2 mod 4 are X=1 and Y=N/2 whereas N=0 mod 4 has 2 or more trailing 0 bits so X>1 and Y<N/2.
N mod 4 turn------- ------0 left for radix=21 left2 left3 right
OEIS
Entries in Sloane's Online Encyclopedia of Integer Sequences related to this path include
<http://oeis.org/A007814> (etc)
radix=2A007814 X coordinate, count low 0-bits of NA006519 2^XA025480 Y coordinate of N-1, ie. seq starts from N=0A003602 Y+1, being k for which N=(2k-1)*2^mA153733 2*Y of N-1, strip low 1 bitsA000265 2*Y+1, strip low 0 bitsA094267 dX, change count low 0-bitsA050603 abs(dX)A108715 dY, change in Y coordinateA000079 N on X axis, powers 2^XA057716 N not on X axis, the non-powers-of-2A005408 N on Y axis (X=0), the odd numbersA003159 N in X=even columns, even trailing 0 bitsA036554 N in X=odd columnsA014480 N on X=Y diagonal, (2n+1)*2^nA118417 N on X=Y+1 diagonal, (2n-1)*2^n(just below X=Y diagonal)A054582 permutation N by diagonals, upwardsA209268 inverseA135764 permutation N by diagonals, downwardsA249725 inverseA075300 permutation N-1 by diagonals, upwardsA117303 permutation N at transpose X,YA100314 boundary length for N=1 to N=2^k-1 inclusivebeing 2^k+2kA131831 same, after initial 1A052968 half boundary length N=1 to N=2^k inclusivebeing 2^(k-1)+k+1radix=3A007949 X coordinate, power-of-3 dividing NA000244 N on X axis, powers 3^XA001651 N on Y axis (X=0), not divisible by 3A016051 N on Y column X=1A051063 N on Y column X=1A007417 N in X=even columns, even trailing 0 digitsA145204 N in X=odd columns (extra initial 0)A141396 permutation, N by diagonals down from Y axisA191449 permutation, N by diagonals up from X axisA135765 odd N by diagonals, deletes the Y=1,2mod4 rowsA000975 Y at N=2^k, being binary "10101..101"radix=4A000302 N on X axis, powers 4^Xradix=5A112765 X coordinate, power-of-5 dividing NA000351 N on X axis, powers 5^Xradix=6A122841 X coordinate, power-of-6 dividing Nradix=10A011557 N on X axis, powers 10^XA067251 N on Y axis, not a multiple of 10A151754 Y coordinate of N=2^k, being floor(2^k*9/10)
SEE ALSO
Math::PlanePath, Math::PlanePath::WythoffArray, Math::PlanePath::ZOrderCurve
David M. Bradley "Counting Ordered Pairs", Mathematics Magazine, volume 83, number 4, October 2010, page 302, DOI 10.4169/002557010X528032. <http://www.math.umaine.edu/~bradley/papers/JStor002557010X528032.pdf>
HOME PAGE
<http://user42.tuxfamily.org/math-planepath/index.html>
LICENSE
Copyright 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/>.