Math::NumSeq::SpiroFibonacci -- recurrence around a square spiral
use Math::NumSeq::SpiroFibonacci; my $seq = Math::NumSeq::SpiroFibonacci->new (cbrt => 2); my ($i, $value) = $seq->next;
This is the spiro-Fibonacci numbers by Neil Fernandez. The sequence is a recurrence
SF[0] = 0 SF[1] = 1 SF[i] = SF[i-1] + SF[i-k]
where the offset k is the closest point on the on the preceding loop of a square spiral. The initial values are
0, 1, 1, ..., 1, 2, 3, 4, ... 61, 69, 78, 88, 98, 108, ... starting i=0
On the square spiral this is
98-88-78-69-61-54-48 | | 108 10--9--8--7--6 42 | | | | 11 1--1--1 5 36 | | | | | 12 1 0--1 4 31 | | | | 13 1--1--2--3 27 | | 14-15-16-18-21-24
Value 36 on the right is 31+5, being the immediately preceding 31 and the value on the next inward loop closest to that new 36 position.
At the corners the same inner value is used three times, so for example 42=36+6, then 48=42+6 and 54=48+6, all using the corner "6". For the innermost loop SF[2] through SF[7] the "0" at the origin is the inner value, hence the run of seven 1s at the start.
Optional recurrence_type => 'absdiff' changes the recurrence formula to an absolute difference
recurrence_type => 'absdiff'
SF[i] = abs (SF[i-1] - SF[i-k])
With the default initial values SF[0]=0 and SF[1]=1 this behaves as an XOR, always giving 0 or 1.
0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, ...
The result plotted around the square spiral is similar to some of the cellular automaton patterns which work on xor feedback.
*** * * ** * ** ** * * * * * * ** * * ***** * *** * * * * ******** ***** ** * * **** * ******** * ** * * ** * * ** * ** * * * *** * ** * ** * * **** * * ****** * *** * * **** * * * ** * * ***** * *** * * ** *** *** ** ** * * **o** ** ** * * * * * * * ** * * * * * * * ****** ** **** * * * ** ********* * ** **** * **** *** * * * * * ** * ** * * * ******* ** ** * ** ** * ** ** * * * * * * * * * ** ** *** * * ** * ****** **** * * * * ***** *** *** * * **
Optional initial_0 and initial_1 can give different initial i=0 and i=1 values. For example initial_0=>1, initial_1=>0 gives
initial_0
initial_1
initial_0=>1, initial_1=>0
1, 0, 1, 2, 3, 4, 5, 6, 6, 6, 6, 7, 8, 9, 11, 14, 17, 20, ...
See "FUNCTIONS" in Math::NumSeq for behaviour common to all sequence classes.
$seq = Math::NumSeq::SpiroFibonacci->new ()
Create and return a new sequence object.
($i, $value) = $seq->next()
Return the next index and value in the sequence.
When $value exceeds the range of a Perl unsigned integer the return is promoted to a Math::BigInt to keep full precision.
$value
Math::BigInt
Math::NumSeq, Math::NumSeq::Fibonacci
Math::PlanePath::SquareSpiral
http://user42.tuxfamily.org/math-numseq/index.html
Copyright 2012, 2013 Kevin Ryde
Math-NumSeq 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-NumSeq 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-NumSeq. If not, see <http://www.gnu.org/licenses/>.
To install Math::NumSeq, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Math::NumSeq
CPAN shell
perl -MCPAN -e shell install Math::NumSeq
For more information on module installation, please visit the detailed CPAN module installation guide.