БлогNot. Вавилонская спираль на Python

Вавилонская спираль на 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 точек
Вавилонская спираль, первые 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 точек
Вавилонская спираль для 500000 точек

Сами видите, что ето не что иное, как опутанные цифровой паутиной материки земного шара диска в проекции плоского мира.

А на десяти тысячах точек вавилонская спираль ещё маскируется...
А на десяти тысячах точек вавилонская спираль ещё маскируется...

03.05.2023, 12:11 [301 просмотр]


теги: python эзотерика графика маразм числа excel математика

К этой статье пока нет комментариев, Ваш будет первым