collatz_grid(10000)
Создано с collatz_grid(100)
and gem 'chunky_png'
require 'chunky_png'
def random_color
ChunkyPNG::Color.rgba(*(1..3).map{rand(1..255)},255)
end
def collatz(n)
n.even? ? n/2 : 3*n + 1
end
def collatz_grid(max)
grid = []
colors = (1..max).map { |i| random_color }
collatz_steps = (1..max).map { |n| collatz(n) }
overflow = ChunkyPNG::Color::TRANSPARENT
while colors.uniq.count > 4
grid << colors
colors = collatz_steps.map { |i| colors[i-1] || overflow }
end
img = ChunkyPNG::Image.new(max, grid.size, ChunkyPNG::Color::TRANSPARENT)
max.times do |x|
grid.size.times do |y|
img[x,y] = grid[y][x]
end
end
img.save("collatz#{max}.png")
end
:
Я не знаю, если это довольно то, что вы имели в виду, но у меня была идея попробовать это некоторое время назад, но я не дошел до этого. Мы создаем ряд случайных цветов, затем итеративно заменяем каждый цвет n цветом в позиции collatz(n)
, or an empty pixel if greater than the max, until every sequence either escapes or converges. The result is that each pixel gradually propagates to the positions connected to it in the graph.
m=20
Изображения ниже предлагают открыть их в новом окне и увеличить.
dot
:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import networkx as nx
import os
"""Tool to generate collatz sequence graphs."""
def collatz_one(x):
"""Make a single step in the collatz sequence."""
if x % 2 == 0:
x = x/2
else:
x = 3*x + 1
return x
def main(max_collatz=20):
"""Create the collatz graph. """
G = nx.DiGraph()
seen = [1]
G.add_node("1")
edges = []
for i in range(1, max_collatz):
while i != 1:
if i not in seen:
seen.append(i)
G.add_node(str(i))
j = collatz_one(i)
edges.append((str(i), str(j)))
i = j
else:
i = 1
for i, j in edges:
G.add_edge(i, j)
nx.write_dot(G, 'test.dot')
os.system("dot -Tpng test.dot -o test.png")
if __name__ == '__main__':
from argparse import ArgumentParser
parser = ArgumentParser(description=__doc__)
parser.add_argument("-m", dest="m",
help=("The first 1..m elements are guaranteed "
"to be included"),
default=20,
type=int)
args = parser.parse_args()
main(args.m)
: