Вавилонская спираль на Python
Штука настолько секретная, что каббалисты её даже в вики не размещают :)
Вавилонская спираль представляет собой последовательность точек на плоскости, расположенных так, чтобы от точки к точке, во-первых, минимально возможным образом увеличивалась длина вектора, соединяющего очередную пару точек с целочисленными координатами, во-вторых, спираль должна минимально изгибаться по часовой стрелке также в строго целочисленных координатах. Из двух критериев длины и угла длина имеет приоритет.
Так, P(1) и P(2) определяются как пары координат (x,y), равные (0,0) и (0,1). Первый вектор проведён от P(1) до P(2). Он вертикальный и имеет длину 1. Квадрат этой длины также равен 1.
Следующим по порядку идет вектор из P(2) в P(3). Это должно быть наименьшее расстояние до точки с целочисленными координатами (x, y), которое длиннее последнего вектора (то есть единицы). Он также должен изгибаться по часовой стрелке более, чем на ноль радиан, но в остальном в наименьшей степени.
Точка, выбранная для P(3), которая соответствует критериям, это (1, 2). Длина вектора от P(2) до P(3) равна квадратному корню из двух, что в квадрате равно 2. Длины определенных таким образом векторов могут быть заданы в виде отсортированного списка возможных сумм двух целых квадратов, включая 0 как квадрат.
В масонском OEIS каббалисты, разумеется, дают некорректное другое описание (A256111 - квадраты расстояний до начала n-й вершины вавилонской спирали, A001481 - квадраты длин векторов спирали, A297346 - последовательности X-координат, A297347 - последовательности Y-координат) и даже прямо пишут, что "название выбрано, чтобы ввести студентов в заблуждение и заставить их выдвинуть неверную гипотезу о долгосрочном поведении Вавилонской спирали" (The name is chosen to mislead school students into making an incorrect hypothesis about the Babylonian Spiral's long-term behavior).
Взгляните сами, как ведут себя уже первые 40 точек этого вавилонского чудовища:
Вавилонская спираль, первые 40 точек
Babylonian_spiral_40.xlsx, книга Excel 2007 и выше в архиве .zip (15 Кб)
Придуманный каббалистами язык Питон, предназначенный для удушения мозгов программирующей молодёжи, включает в себя такую штуку как очередь с приоритетом, что позволит генерировать комбинации пар координат (x, y), фактически не производя никаких реальных математических вычислений, и это намного быстрее, чем считать.
Вот программа на масонском языке "питоне" плюс картинка, получить которую мне удалось не без труда, потому что сотни дебильных онлайн-компиляторов с Python предоставляют лишь консоль, и только вот здесь можно построить диаграмму с помощью библиотеки Matplotlib, не устанавливая к себе на комп вражеского бесплатного ПО.
from itertools import islice, count import matplotlib.pyplot as myplot import heapq def twosquares(): q, n = [], 1 while True: while not q or n*n <= q[0][0]: heapq.heappush(q, (n*n, n, 0)) n += 1 s, xy = q[0][0], [] while q and q[0][0] == s: # толкнуть (не на базар) все векторы одинаковой длины s, a, b = heapq.heappop(q) xy.append((a, b)) if a > b: heapq.heappush(q, (a*a + (b+1)*(b+1), a, b + 1)) yield tuple(xy) def gen_dirs(): d = (0, 1) for v in twosquares(): # включить симметричные векторы v += tuple((b, a) for a, b in v if a != b) v += tuple((a, -b) for a, b in v if b) v += tuple((-a, b) for a, b in v if a) # фильтровать с помощью точечного и векторного произведения d = max((a*d[0] + b*d[1], a, b) for a, b in v if a*d[1] - b*d[0] >= 0)[1:] yield d def positions(): p = (0, 0) for d in gen_dirs(): yield p p = (p[0] + d[0], p[1] + d[1]) # вывести первые 40 точек print(list(islice(positions(), 40))) # построить диаграмму для первых 500000 точек, толщина линии поменьше myplot.plot(*zip(*list(islice(positions(), 500000))), lw=0.1) myplot.gca().set_aspect(1) myplot.show()
Вавилонская спираль для 500000 точек
Сами видите, что ето не что иное, как опутанные цифровой паутиной материки земного шара диска в проекции плоского мира.
А на десяти тысячах точек вавилонская спираль ещё маскируется...
03.05.2023, 12:11 [359 просмотров]