Видимым парадом планет называется планетная конфигурация, когда пять ярких планет Солнечной системы (Меркурий, Венера, Марс, Юпитер и Сатурн) в своём движении по небосводу подходят друг к другу на близкое расстояние и становятся видны в одно время в небольшом секторе (10 — 40 градусов) неба.
Допустим, мы знаем дату, когда солнце и 5 планет были точно на одной линии, прикинем, когда они окажутся снова в одном секторе, скажем 30°:
from itertools import count
n = 12 # число секторов, мы же взяли сектор в 30°
year = 365.256363004
periods = (
87.969, # Меркурий
224.698, # Венера
686.98, # Марс
4332.589, # Юпитер
10759.22 # Сатурн
)
speeds = [n / p for p in periods] # угловые скорости планет, сектор/день
for t in count(40): # стартанём не сразу, а погодя, чтобы планеты разошлись,
# за 40 дней меркурий убежит почти на 180°
mercury, *others = (int(t * speed) % n for speed in speeds)
if all(planet == mercury for planet in others):
y = int(t / year)
print(f'{y} лет {round(t - y * year)} дней')
break
Выхлоп - 377 лет 212 дней.
Это очень грубая прикидка, ведь я считал парадом положение планет а одном секторе с центром в солнце, а надо бы - в одном секторе с центром в точке наблюдения, те на Земле. Но честный рассчет гораздо сложнее.
UPDATE
Парадом планет называется также конфигурация планет Солнечной системы, когда планеты, в том числе и невидимые невооружённым глазом, «выстраиваются» по одну сторону от Солнца в небольшом секторе. В такой конфигурации Меркурий и Венера могут быть невидимы с Земли, так как находятся в нижнем соединении с Солнцем, но зато внешние планеты видимы, практически, в одном направлении. Ближайший прошедший такой парад был 10 марта 1982 года, а следующий будет в 2161 году.
Ага, так лучше.
Вот более аккуратный код, легко видеть, что никакого периода нет, и нетрудно понять почему: периоды обращения планет не кратны хоть какому-то протяженному времени.
Ну и зазора в (2161 - 1982) лет не наблюдается - ведь я стартовал из воображаемого момента в прошлом, когда планеты были строго на одной линии - а такого наверняка никогда не было.
n = 360. # просто 360°
occupied = 45. # размер сектора, в который должны впихнуться планеты
year = 365.256363004
periods = (
87.969, # Меркурий
224.698, # Венера
year, # Земля
686.98, # Марс
4332.589, # Юпитер
10759.22, # Сатурн
60190.03, # Нептун
# 90553.02 # Плутон # всё равно он не планета
)
speeds = [n / p for p in periods] # угловые скорости планет
t = t0 = 0 # текущая дата, дата 'нулевого' парада
for _ in range(32): # число выводимых парадов
while True:
t += 1
if t - t0 < 43:
continue # пусть планеты разойдутся, за 43 дня меркурий убежит на 180°
def width():
planets = sorted((t * speed) % n for speed in speeds)
a, max_free_angle = planets[-1] - n, 0.
for b in planets:
if max_free_angle < b - a:
max_free_angle = b - a
a = b
return 360. - max_free_angle
if width() < occupied: # подкараулим день, когда сектор будет минимальным
u = v = width()
while u >= v:
t += 1
u, v = v, width()
print(f'через {round((t - t0 - 1) / year):>4} лет '
f'планеты соберутся в секторе {round(u)}°')
t0 = t - 1
break