Based on the seconds part of 'A New Way to Look at Fibonacci Numbers' by Jacob Yatsko youtube.com/watch?v=o1elkodscqw
Pisano sequence path 🧮 (variation)
Pisano sequence path 🧮 (variation)
Pisano sequence path 🧮 (variation)
Pisano sequence path 🧮 (variation)
Log in to post a comment.
// Forked from "Pisano sequence 🧮" by Jurgen
// https://turtletoy.net/turtle/6c8aa31631
const mod = 131; //min=1 max=300 step=1
const stepSize = 5;//min=1 max=50 step=1
const iterations = 773;//min=1 max=1000 step=1
const startX = -5;//min=-100 max=100 step=1
const startY = 60;//min=-100 max=100 step=1
const angle = 60;//min=0 max=360 step=1
const sequence = 0; //min=0 max=4 step=1 (Fibonacci, Lucas, Triangular, MultiplesOfFour, Recamán terms 600-700)
const progressOnZero = 1; //min=0 max=1 step=1 (No, Yes)
// You can find the Turtle API reference here: https://turtletoy.net/syntax
Canvas.setpenopacity(1);
// Global code will be evaluated once.
const turtle = new Turtle();
turtle.jump(startX, startY);
const series = [[fibonacci,[0n,1n]], [fibonacci,[2n,1n]], [triangular,[]], [multiples,[4]], [recaman, [600, 700]]];
const numbers = pisano(mod, series[sequence][0](...series[sequence][1]));
// The walk function will be called until it returns false.
function walk(i) {
if(progressOnZero === 1) turtle.forward(stepSize);
if(numbers[i%numbers.length] !== 0) {
if(progressOnZero === 0) turtle.forward(stepSize);
switch(numbers[i%numbers.length]%2) {
case 0:
turtle.left(angle);
break;
default:
turtle.right(angle);
break;
}
}
return i < iterations;
}
function* recaman(skip = 0, take = 0) {
const sequence = [0];
for(let i = 1; take==0||i<skip+take+1; i++) {
if(i > skip) yield BigInt(sequence[i - 1]);
[sequence[i-1]-i].forEach(next => sequence.push(next > 0 && !sequence.includes(next)? next: sequence[i-1]+i));
}
}
function* multiples(base) {
for(let n = 0n, i = BigInt(base); true; n++) {
yield n*i;
}
}
function* triangular() {
for(let n = 0n, i = 1n; true; i++) {
yield n;
n += i;
}
}
function* fibonacci(a = 0n, b = 1n) {
yield a;
yield b;
while(true) {
const c = a + b;
yield c;
a = b, b = c;
}
}
function pisano(modulo, iterator = null) {
const sequence = [];
const mod = BigInt(modulo);
let start = null;
for(let f of iterator) {
const nxt = f % mod;
if(nxt === start && sequence.length % 2 == 0 && sequence.length > 0) {
const l = sequence.length / 2;
if(sequence.every((v, i, a) => i >= l? true: v == a[i+l])) {
return sequence.filter((v, i) => i < l);
}
}
if(start == null) start = nxt;
sequence.push(Number(nxt));
}
return sequence; //if finite series
}