Лингвофорум

Общий раздел => Наука и техника => Математика => Тема начата: RawonaM от октября 1, 2019, 14:31

Название: Распределение даты по дням недели
Отправлено: RawonaM от октября 1, 2019, 14:31
Цитата: злой от октября  1, 2019, 14:02
Я читал, что парадоксальным образом первое января чаще других дней недели выпадает на воскресенье.
А в чем парадоскальность? Тем более, что это неправда. Заинтересовало, скриптик написал:


>>> import datetime
>>> count = {}
>>> for year in range(1, 2020):
...     weekday = datetime.datetime(year, 1, 1).weekday()
...     count[weekday] = count[weekday]+1 if weekday in count else 1
...
>>> count
{0: 283, 1: 294, 2: 287, 3: 288, 4: 292, 5: 282, 6: 293}


На вторник больше всего.

А вот почему на субботу всего 282 раза, а на вторник 294 раза? Вроде должно одинаково выпадать. Каждый год на один вперед сдвигается, а каждый високосный еще на один, должно быть примерно одинаково.
Название: Распределение даты по дням недели
Отправлено: RawonaM от октября 1, 2019, 14:36
В годах 1 по 9999 такое распределение:
{0: 2800, 1: 2900, 2: 2850, 3: 2850, 4: 2899, 5: 2798, 6: 2900}


Очевидно связано с тем, что дней недели 7, а високосные года каждые четыре.
Название: Распределение даты по дням недели
Отправлено: злой от октября 1, 2019, 14:52
Цитата: RawonaM от октября  1, 2019, 14:36
В годах 1 по 9999 такое распределение:
{0: 2800, 1: 2900, 2: 2850, 3: 2850, 4: 2899, 5: 2798, 6: 2900}


Очевидно связано с тем, что дней недели 7, а високосные года каждые четыре.

Может если сделать 100 тысяч лет, то воскресенье ещё на один день чаще будет выпадать?
Название: Распределение даты по дням недели
Отправлено: Hellerick от октября 1, 2019, 15:10
La calendario de Gregorio ave un sicle de 400 anios = 146074 dias = 20871 semanas. Esamina un periodo plu longa no es razonable.

У Григорианского календаря цикл 400 лет = 146097 дней = 20871 недель. Более долгий период проверять не имеет смысла.

{0: 56, 1: 58, 2: 57, 3: 57, 4: 58, 5: 56, 6: 58}
Название: Распределение даты по дням недели
Отправлено: RawonaM от октября 1, 2019, 15:13
Цитата: злой от октября  1, 2019, 14:52
Может если сделать 100 тысяч лет, то воскресенье ещё на один день чаще будет выпадать?

Да нет, цикл состоит из 28 (=4х7) лет:
0 1 2 3 в 5 6 0 1 в 3 4 5 6 в 1 2 3 4 в 6 0 1 2 в 4 5 6 0 в 2 3 4 5 в (0 1 2 3 в ...)

Дальше все повторяется. Достаточно посчитать распределение за первые 28 лет и дальше уже все понятно хоть до бесконечности.

{0: 4, 1: 4, 2: 4, 3: 4, 4: 4, 5: 3, 6: 4}

То есть все по 4 и только суббота 3 раза.

Если вы работаете в месте, где нужно сманипулировать данные, то можно взять с середины цикла по середину цикла, так, как вам будет удобно, и результат получится.

>>> for year in range(6, 13+28*10):
...     weekday = datetime.datetime(year, 1, 1).weekday()
...     count[weekday] = count[weekday]+1 if weekday in count else 1
...
>>> count
{0: 41, 1: 44, 2: 40, 3: 44, 4: 44, 5: 42, 6: 45}


Вот если брать с 6 года по 12-ый, а потом добавить любое произвольное количество циклов для красоты, то выйдет на 1 больше. :)
Название: Распределение даты по дням недели
Отправлено: Hellerick от октября 1, 2019, 15:15
Цитата: RawonaM от октября  1, 2019, 15:13
Да нет, цикл состоит из 28 (=4х7) лет:

Lo es la calendario de Julio. Me suspeta ce ante la anio 1582 python trata datos como julian.

Это юлианский календарь. Подозреваю, что до 1582 года питон трактует даты как юлианские.
Название: Распределение даты по дням недели
Отправлено: RawonaM от октября 1, 2019, 15:20
Цитата: RawonaM от октября  1, 2019, 15:13
Вот если брать с 6 года по 12-ый, а потом добавить любое произвольное количество циклов для красоты, то выйдет на 1 больше.
Нет, там я все равно ошибся, не тот результат подсунул, но принцип понятен. Что-то меня эта задачка слишком увлекла, надо отвлечся :)
Название: Распределение даты по дням недели
Отправлено: злой от октября 1, 2019, 17:14
Цитата: RawonaM от октября  1, 2019, 15:20
Цитата: RawonaM от октября  1, 2019, 15:13
Вот если брать с 6 года по 12-ый, а потом добавить любое произвольное количество циклов для красоты, то выйдет на 1 больше.
Нет, там я все равно ошибся, не тот результат подсунул, но принцип понятен. Что-то меня эта задачка слишком увлекла, надо отвлечся :)
Я давным-давно читал, что стандартная юниксовая программа date знает, что в 1500-каком-то году у англичан был переход с юлианского на григорианский календарь, и показывает дни недели с учётом того, что несколько дней выпало. Возможно, на ваш алгоритм этот факт оказывает влияние, я не знаю, что за datetime в Питоне.
Название: Распределение даты по дням недели
Отправлено: Hellerick от октября 1, 2019, 17:27
Цитата: злой от октября  1, 2019, 17:14
Я давным-давно читал, что стандартная юниксовая программа date знает, что в 1500-каком-то году у англичан был переход с юлианского на григорианский календарь, и показывает дни недели с учётом того, что несколько дней выпало. Возможно, на ваш алгоритм этот факт оказывает влияние, я не знаю, что за datetime в Питоне.

La engleses ave lo en anio 1752. En anio 1500-e-alga lo ia es aveda par la paises catolica. En cuando en la SU/Rusia la abitua es retrotiva cambia tota la datas a la stilo nova, en la paises ueste la abitua scrive la datas seguente la calendario asetada alora.

У англичан это было в 1752 году. В 1500-каком-то было у католических стран. Если в СССР/России принято задним числом переводить все даты на новый стиль, в западных странах принято даты указывать по действовавшему на тот момент календарю.
Название: Распределение даты по дням недели
Отправлено: RawonaM от октября 2, 2019, 10:31
Вчера не давала мне покоя эта задачка, много мы ошибок наделали.

Цитата: RawonaM от октября  1, 2019, 15:13
Да нет, цикл состоит из 28 (=4х7) лет:
...
То есть все по 4 и только суббота 3 раза.
На самом деле каждый по 4 (ошибся конечным индексом).
Итак повторяется каждые 28 лет, то есть в Юлианском календаре распределение 100% равномерное. Очевидно становится, что неравномерность в этом цикле появляется только в Григорианском календаре.

Цитата: злой от октября  1, 2019, 17:14
Цитата: RawonaM от :)
Я давным-давно читал, что стандартная юниксовая программа date знает, что в 1500-каком-то году у англичан был переход с юлианского на григорианский календарь, и показывает дни недели с учётом того, что несколько дней выпало. Возможно, на ваш алгоритм этот факт оказывает влияние, я не знаю, что за datetime в Питоне.
Оказывается питоновский дейттайм менее смышленый и ретроактивно считает все в Григорианском календаре.

>>> datetime.datetime(100, 2, 29)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: day is out of range for month
>>> datetime.datetime(400, 2, 29)
datetime.datetime(400, 2, 29, 0, 0)
>>> datetime.datetime(1600, 2, 29)
datetime.datetime(1600, 2, 29, 0, 0)
>>> datetime.datetime(1500, 2, 29)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: day is out of range for month
>>>


Итак смотрим:

x1:~/fun$ python weekdaycount.py 1 28
{0: 4, 1: 4, 2: 4, 3: 4, 4: 4, 5: 4, 6: 4}
x1:~/fun$ python weekdaycount.py 29 56
{0: 4, 1: 4, 2: 4, 3: 4, 4: 4, 5: 4, 6: 4}
x1:~/fun$ python weekdaycount.py 57 84
{0: 4, 1: 4, 2: 4, 3: 4, 4: 4, 5: 4, 6: 4}
x1:~/fun$ python weekdaycount.py 85 112
{0: 3, 1: 5, 2: 3, 3: 5, 4: 4, 5: 4, 6: 4}
x1:~/fun$ python weekdaycount.py 113 140
{0: 4, 1: 4, 2: 4, 3: 4, 4: 4, 5: 4, 6: 4}
x1:~/fun$ python weekdaycount.py 197 224
{0: 4, 1: 4, 2: 5, 3: 4, 4: 4, 5: 3, 6: 4}


Первые три цикла идеальное распределение, а потом входит григорианская ересь, пропуская високосный год в 100-ом году.
Дальше идет снова три хороших цикла, дальше на 200 снова хрень.

Цитата: Hellerick от октября  1, 2019, 15:10
La calendario de Gregorio ave un sicle de 400 anios = 146074 dias = 20871 semanas. Esamina un periodo plu longa no es razonable.

У Григорианского календаря цикл 400 лет = 146097 дней = 20871 недель. Более долгий период проверять не имеет смысла.

{0: 56, 1: 58, 2: 57, 3: 57, 4: 58, 5: 56, 6: 58}
Действительно получается так, проверил скриптом отрезки в 400 лет, но теоретически так и не могу понять.
Ведь григорианский цикл в 400 лет не кратен юлианскому циклу в 28 лет, каждый григорианский пропуск високосного года сбивает юлианский цикл. Как в итоге они сходятся? Пока что не придумал.
Название: Распределение даты по дням недели
Отправлено: RawonaM от октября 2, 2019, 10:37
А кажется понял, ведь получается, что в 400 лет кратно 7 дней, то есть каждый 1+400*х год начинается снова с понедельника сам по себе. Интересное совпадение.
Название: Распределение даты по дням недели
Отправлено: RawonaM от октября 2, 2019, 10:47
Еще так можно посмотреть:

Цитата: RawonaM от октября  1, 2019, 15:13
0 1 2 3 в 5 6 0 1 в [b]3[/b] 4 5 6 в 1 2 3 4 в 6 0 1 2 в 4 5 6 0 в 2 3 4 5 в (0 1 2 3 в ...)

Так как 401-ый год выпадает на 9-ый год в этом юлианском цикле, но при этом за 400 лет по-григориански было пропущено 3 високосных года, то следовательно этот девятый и будет не четверг, как в ю, а понедельник. И пошел новый цикл.
Название: Распределение даты по дням недели
Отправлено: RawonaM от октября 2, 2019, 11:06
Распределение 29 февраля по дням недели в Григорианском цикле:


import datetime

def is_leapyear(year):
    if (year % 4) == 0:
       if (year % 100) == 0:
           if (year % 400) == 0:
               return True
           else:
               return False
       else:
           return True
    else:
       return False

count = {}

for y in range(1, 401):
    if is_leapyear(y):
        wd = datetime.datetime(y, 2, 29).weekday()
        count[wd] = count[wd]+1 if wd in count else 1

print count

$ python leapyear.py
{0: 15, 1: 13, 2: 15, 3: 13, 4: 14, 5: 14, 6: 13}

Название: Распределение даты по дням недели
Отправлено: RawonaM от октября 2, 2019, 11:14
Более компактное определение високосного года:

def is_leapyear(year):
    return (year % 4) == 0 and ( (year % 100) != 0 or (year % 400) == 0 )

Название: Распределение даты по дням недели
Отправлено: Mona от октября 2, 2019, 22:03
Интересно, что по старому стилю революция 17-го года случилась раньше революции по новому стилю. А Рождество по старому стилю отмечается позже Рождества по новому. Одно время хотел этот вопрос в "Что, где, когда" послать.
Название: Распределение даты по дням недели
Отправлено: Basil от октября 2, 2019, 23:43
Цитата: Mona от октября  2, 2019, 22:03
Интересно, что по старому стилю революция 17-го года случилась раньше революции по новому стилю. А Рождество по старому стилю отмечается позже Рождества по новому. Одно время хотел этот вопрос в "Что, где, когда" послать.
Так вроде разница только в 2000 году набежала, нет?
Название: Распределение даты по дням недели
Отправлено: Mona от октября 2, 2019, 23:47
Ничего в 2000-м не набежало, мы и до 2000-го ВОСР отмечали 7-го ноября по-новому, а не 25-го октября по-старому, а Рождество после реформы стали отмечать 8-го января по-старому, а не 25-го декабря по-новому :-). Так что противоречию больше ста лет. Хотя на самом деле оно только видимое.
Название: Распределение даты по дням недели
Отправлено: Basil от октября 3, 2019, 04:04
Цитата: Mona от октября  2, 2019, 23:47
Ничего в 2000-м не набежало, мы и до 2000-го ВОСР отмечали 7-го ноября по-новому, а не 25-го октября по-старому, а Рождество после реформы стали отмечать 8-го января по-старому, а не 25-го декабря по-новому :-). Так что противоречию больше ста лет. Хотя на самом деле оно только видимое.
А ну да, наоборот, в 2100 набежит разница и станет 14 дней, а не тринадцать.

Остальное не очень понял.

25 октября (ЮК) + 13 дней = 7 ноября (ГК) 
25 декабря (ЮК) + 13 дней = 7 января (ГК)

Цитировать
Рождество Христово

Русская, Грузинская, Сербская, и Польская православные церкви, а также Грекокатолическая церковь (в пределах Украины), старообрядцы и старостильные церкви празднуют 25 декабря по юлианскому календарю.

(wiki/ru) Рождество_Христово (https://ru.wikipedia.org/wiki/%D0%A0%D0%BE%D0%B6%D0%B4%D0%B5%D1%81%D1%82%D0%B2%D0%BE_%D0%A5%D1%80%D0%B8%D1%81%D1%82%D0%BE%D0%B2%D0%BE)
Или вы не про Русскую церковь?

ЦитироватьКонстантинопольская, Элладская, Болгарская и ряд иных поместных православных церквей празднуют 25 декабря по новоюлианскому календарю. Католическая и протестантские церкви — 25 декабря по григорианскому календарю. Армянская апостольская церковь — 6 января.
Название: Распределение даты по дням недели
Отправлено: Hellerick от октября 3, 2019, 19:35
Me ia conta la cuantia de dias de semana per cada dia 13 de mense. Par 400 nos ave tal statistica:
Посчитал, на какие дни недели выпадает 13-е число. За 400 лет набирается такая статистика:


Lun  Mar  Mer  Jov  Ven  Sat  Sol
ПН   ВТ   СР   ЧТ   ПТ   СБ   ВС
685  686  689  687  692  689  693
Название: Распределение даты по дням недели
Отправлено: Bhudh от октября 3, 2019, 20:28
И чем 13-е сильно отличается от других чисел?
Название: Распределение даты по дням недели
Отправлено: Hellerick от октября 3, 2019, 21:02
Me ia vole sabe la cuantia de venerdi la 13.
Хотелось знать число пятниц тринадцатого.
Название: Распределение даты по дням недели
Отправлено: Mona от октября 3, 2019, 21:08
Цитата: Basil от октября  3, 2019, 04:04
Цитата: Mona от октября  2, 2019, 23:47
Ничего в 2000-м не набежало, мы и до 2000-го ВОСР отмечали 7-го ноября по-новому, а не 25-го октября по-старому, а Рождество после реформы стали отмечать 8-го января по-старому, а не 25-го декабря по-новому :-). Так что противоречию больше ста лет. Хотя на самом деле оно только видимое.
А ну да, наоборот, в 2100 набежит разница и станет 14 дней, а не тринадцать.

Остальное не очень понял.

25 октября (ЮК) + 13 дней = 7 ноября (ГК) 
25 декабря (ЮК) + 13 дней = 7 января (ГК)

Цитировать
Рождество Христово

Русская, Грузинская, Сербская, и Польская православные церкви, а также Грекокатолическая церковь (в пределах Украины), старообрядцы и старостильные церкви празднуют 25 декабря по юлианскому календарю.

(wiki/ru) Рождество_Христово (https://ru.wikipedia.org/wiki/%D0%A0%D0%BE%D0%B6%D0%B4%D0%B5%D1%81%D1%82%D0%B2%D0%BE_%D0%A5%D1%80%D0%B8%D1%81%D1%82%D0%BE%D0%B2%D0%BE)
Или вы не про Русскую церковь?

ЦитироватьКонстантинопольская, Элладская, Болгарская и ряд иных поместных православных церквей празднуют 25 декабря по новоюлианскому календарю. Католическая и протестантские церкви — 25 декабря по григорианскому календарю. Армянская апостольская церковь — 6 января.

Вы абсолютно правильно математически сделали, что подписали ЮК и ГК, сразу стало все ясно. Но в человеческом языке революция по старому календарю раньше, чем по-новому, а Рождество по-старому - позже, чем по новому. Просто, сменив календарь, европейцы решили Рождество праздновать того же числа того же месяца, что и раньше, а русские православные решили его праздновать астрономически в тот же день, что и раньше, и вообще оставить все праздники и интервалы между ними так, как было, даже если они теперь по гражданскому календарю выпадают на непривычные даты.
Название: Распределение даты по дням недели
Отправлено: Mona от октября 3, 2019, 21:13
Цитата: Hellerick от октября  3, 2019, 21:02
Me ia vole sabe la cuantia de venerdi la 13.
Хотелось знать число пятниц тринадцатого.

А оказалось, что воскресений 13-го намного больше...
Название: Распределение даты по дням недели
Отправлено: Bhudh от октября 3, 2019, 22:11
Цитата: Mona от октября  3, 2019, 21:08
русские православные решили его праздновать астрономически в тот же день, что и раньше
Русские православные вообще не стали менять календарь.
Название: Распределение даты по дням недели
Отправлено: Mona от октября 3, 2019, 22:38
Русские православные действительно не стали менять календарь и празднуют Рождество все так же 25-го декабря по церковному календарю, как и раньше (7-го января по гражданскому), а вот европейцы свое рождество празднуют хоть и 25-го декабря номинально, но на 13 дней раньше, чем праздновали до реформы, и там многие другие вещи тоже "поехали", "поплыли".