Она же проблема 3n+1 (Collatz conjecture). Это, наверное, самая сложная проблема с самой простой формулировкой — условие может понять и ребенок. А вот сложность самой проблемы такова, что великий математик Эрдош сказал, что «математика еще не готова к решению проблем такой сложности». Ее также сравнивают с сиреной — она манит своей простотой, и некоторые математики увязают в ней надолго без какого либо практического результата.
В этой статье я приведу доказательство хотя нет, доказательство простое, но слишком длинно, чтобы поместиться на полях... Ладно, ладно, нет у меня доказательства. Но мы рассмотрим более общую проблему, и как всегда, в конце будет видео с движущимися фракталами!
Итак, 3n+1. А почему, собственно, +1? А не +2? +3? С +2 не получится — 3n+2 при нечетных n будет снова нечетным, и мы получим runaway. А вот все нечетные числа можно попробовать. Но пробовать не просто так, а написав код, который тестирует вся начальные числа до миллиона и ищет получившиеcя циклы. Циклы мы обозначаем как кортежи (количество элементов (период), минимальный элемент, максимальный элемент). Для 3n+1 мы получим единственный цикл: (3, 1, 4) (хотя для однозначной идентификации цикла достаточно его знать его минимальный элемент)
Теперь мы готовы отправиться в путешествие, перебирая все нечетные a (adder) в формуле 3n+a.
Степени тройки
Для a=3 мы получим единственный цикл (3, 3, 12). А вот для a=5 мы получим аж шесть циклов: (4, 1, 8), (8, 19, 152), (3, 5, 20), (8, 23, 116), (44, 187, 8324), (44, 347, 10 196). Для a=7 два цикла: (6, 5, 40), (3, 7, 28), для a=9 один: (3, 9, 36)
Далее я использую свою гипотезу H1, что для любого нечетного a количество циклов конечно, то есть нет 'runaways'.
Лишь изредка цикл только один, и имеет период 3. Числа a, для которых это так:
a=1 (3, 1, 4)
a=3 (3, 3, 12)
a=9 (3, 9, 36)
a=27 (3, 27, 108)
a=81 (3, 81, 324)
a=243 (3, 243, 972)
a=729 (3, 729, 2916)
a=2187 (3, 2187, 8748)
a=6561 (3, 6561, 26244)
a=19683 (3, 19683, 78732)
Здесь напрашиваются сразу две гипотезы:
H2: все степени тройки <a> создают только один цикл вида (3,a,*). Возможно это не так и при больших значениях a возникают и другие циклы. Мы этого на знаем даже для a=1
H3: никакие другие значения a не дают циклов вида (3,*,*).
Рекорды
Если цикл (3, *, *) это пример компактности, то рассмотрим противоположные случаи.
Рекордсмены по периоду цикла из проверенных мной:
a=24917 len=8882 (8882, 13, 98850680), (52, 144043, 21257540), (104, 168379, 89205632), (104, 88267, 106267040), (52, 181931, 35733860), (52, 213163, 20599568)
a=22097 len=7784 (7784, 25, 169564136), (778, 247, 2749604), (16, 5815, 144212)
впрочем, для больших a это не очень интересно, интереснее, когда len>>a, что встречается только для небольших значений a:
a=5 len=44 (4, 1, 8), (8, 19, 152), (3, 5, 20), (8, 23, 116), (44, 187, 8324), (44, 347, 10196)
a=17 len=49 (9, 1, 32), (49, 23, 560), (3, 17, 68)
a=23 len=69 (69, 41, 4976), (7, 5, 80), (7, 7, 56), (3, 23, 92)
a=29 len=106 (6, 1, 32), (26, 11, 392), (3, 29, 116), (106, 3811, 6831320), (106, 7055, 3154208)
a=61 len=107 (7, 1, 64), (3, 61, 244), (107, 235, 99832)
n=85 len=156 (156, 7, 11332), (9, 5, 160), (4, 17, 136), (49, 115, 2800), (8, 323, 2584), (3, 85, 340), (8, 391, 1972), (44, 3179, 141508), (44, 5899, 173332)
n=107 len=159 (159, 1, 36416), (3, 107, 428)
Теперь поищем неудачные значения a с наибольшим числом циклов (все циклы перечислять не буду):
a=26207 loops=562
a=14197 len=294 loops=330
для небольших a
a=55 loops=11
a=499 loops=53
Фракталы
Я пытался на основе полученных данных построить графики, но ничего красивого не выходило. А вот фрактал получился потрясающий!
Строится он по следующей формуле:
![](https://habrastorage.org/getpro/habr/upload_files/aba/f31/842/abaf31842c7118c61de7abd485b7394a.png)
Обратите внимание, как хитро она составлена — при целых значениях z функция f(z) делает итерацию по известной формуле для простых чисел. Зато мы можем в качестве z использовать комплексное число, а adder (обведен красным) мы можем менять плавно и даже придавать ему некорректные значения (2, например).
Обычно фрактал «прижимается» к оси y=0 (вещественная ось, мнимые значения малы по модулю). Это происходит из‑за того, что для мнимых аргументов косинус превращается в гиперболический косинус (цепную линию), а тот убегает в бесконечность как экспонента.
![x [0, 20], y [-1.5. 1.5] x [0, 20], y [-1.5. 1.5]](https://habrastorage.org/getpro/habr/upload_files/807/7b8/44c/8077b844cfcb095af98bfd5688c97bd2.png)
Хочется увеличить нетривиальные зоны:
![x [0,2.5], y [-0.4, 0.4] x [0,2.5], y [-0.4, 0.4]](https://habrastorage.org/getpro/habr/upload_files/bcc/e7a/324/bcce7a3243ff991acc4cb219f7d5610e.png)
![x [1.8,2.09], y [0,0.2] x [1.8,2.09], y [0,0.2]](https://habrastorage.org/getpro/habr/upload_files/499/05c/96c/49905c96c33268f45ccad78926b32a5a.png)
Самое интересное происходит в этой области, когда adder начинает меняться и фрактал начинает 'течь':
![x [1.92,2.0], y [0.05,0.13] adder=1.01 x [1.92,2.0], y [0.05,0.13] adder=1.01](https://habrastorage.org/getpro/habr/upload_files/79e/6b8/59c/79e6b859c4c99a24710fefde19e84bf6.png)
Эту красоту в движении вы можете увидеть на видео. Напоследок замечу, что самое интересное происходит около adder=1, так что выбор единицы неслучаен.
Комментарии (36)
ksbes
00.00.0000 00:00+1Интересно проварьирвать не только слагаемое, но и множитель с делителем. Сдаётся мне там будет что-то красивое на простых числах…
smrl
00.00.0000 00:00+3Обожаю последовательность (не в математическом смысле, а в чужом глазу).
Дано: f(n,a,b). Для начала объясним, почему не будем брать "а" четным. Объяснили? А теперь погнали экспериментировать!
Вопрос с задних рядов: профессор, а почему мы берем именно b=3? Потому что другие значения в каком-то смысле эквивалентны такому выбору, и этому есть простое и красивое доказетльство? Или просто "потому что потому!"?
Или вот другая последовательность: "статья про игру жизнь", "статья про игру жизнь", "статья про игру жизнь", "статья, в которой затрагивается вопрос варьирования параметров в..."
Читатель уж ждет рифму "в алгоритме игры жизнь!" - но нет, сиракузы.
Ну это же издевательство! Так и не узнаю: почему в игре жинь выбран именно такой алгоритм, и что будет, если его менять? А еще интереснее, изменить число измерений, хотя бы рассмотреть случай трех осей? Или, совсем уж на десерт: а если в правила ввести элемент случайности (аналог квантовости в реальном мире), как будут выглядеть (псевдо?)вечные образования?
Но нет. Доктор сказал, что сиракузы интереснее - значит, сиракузы интереснее.Tzimie Автор
00.00.0000 00:00+1Вариантов варьирования столь много, что каждому открыта дорога попробовать свое. Вы же не ожидали что я смогу охватить все?
smrl
00.00.0000 00:00+1Так не в варьировании как таковом дело - а в интересности. С другими правилами игра жизнь лучше (интереснее, богаче), или хуже? Если хуже, то чем выбранные правила такие особенные? Если лучше, то почему продолжают считать по традиционным правилам?
У меня просто в голове не укладывается, как можно играть, потом немножко исследовать игру, программировать что-то для этого, писать несколько статей по теме - и не заинтересоваться этим вопросом.
DarthPadla
00.00.0000 00:00+2http://shcoding.ru/cryptozoe/
Я попробовал добавить элемент случайности и ещё немножко вещей.. Из полученного опыта могу сказать, что правила игры жизнь тем и хороши, что они максимально просты, но это не точно.
Refridgerator
00.00.0000 00:00Если вам интересны клеточные автоматы — сюда посмотрите, там их миллион, не только Жизнь.
starik-2005
00.00.0000 00:00-2Цикл заканчивается, когда значение попадает на число, являющееся степенью двойки. Но в приведенных примерах увидел, что оно всегда равно 16. Получается, что ежели 3н+1 будет степенью двойки, то это последний цикл. Дальше можно думать до бесконечности, но лениво.
dreesh
00.00.0000 00:00С любым делителем будет 100% вероятность найти его степень, так как их число бесконечно. Задача сама по себе не корректна.
ksbes
00.00.0000 00:00Не факт — может мы как-то хитро «ходом коня» будем все эти степени обскакивать?
dreesh
00.00.0000 00:00Вернемся к оригинальной задаче :) Любое не четное станет четным после применения формулы 3n+1, а значит следующий шаг будет деление на 2. В задаче изначально заложен дисбаланс между умножением и делением (делить мы будем каждый раз после умножения, а в некоторых случаях и по несколько раз), если записывать все шаги то делений всегда больше. Но все примеры показывают только не четные числа тем самым вводя в заблуждение легкостью решения.
ksbes
00.00.0000 00:00+2Но последовательным делением-умножением мы увеличиваем число каждый раз в 1,5 раза. Т.е. гипотетически мы можем выйти на «убегающую» последоветельность, где за каждым умножением идёт в среднем менее 1,5 делений.
dreesh
00.00.0000 00:00-1В реальности есть очень много чисел в разложение которых будет входить 2 в некоторой степени. Так как после 3n+1 число всегда четное, а значит может содержать 2^x, то и делений выходит больше чем умножений. Формула вводит в заблуждение тем, что намекает на выражение 3 > 2, но не показывает 3<4 или 3<8. Нужно помнить, что у нас есть каждое 4-е число, каждое 8-е, каждое 16-е в счетном множестве которые обязательно встретяться с некоторой большой вероятностью. Мне лениво точно считать, но от 0 до 100 из всех четных будет 50% кратных 4, 25% кратных 16, 12.5% кратных 32.
ksbes
00.00.0000 00:00Не совсем любая степень двойки — на восьмёрку, например, можно попасть только если её выбрать первой, либо в процессе «спуска» с по степеням двойки.
Потому что степени двойки чередуются: 3n+1, 3n-1 (если начинать с нулевой).
Я как-то пытался искать доказательство в четверичной системе исчисления (где 3 обладает свойствами «девятки»). Но как-то закопался, как обычно.
TimsTims
00.00.0000 00:00Интересно было бы увидеть графики для других значений тройки, например 7n+1.
belch84
00.00.0000 00:00+2Никак не мог уловить связь между функцией, приведенной в статье и гипотезой Коллатца, пока не построил графики
ГрафикиОранжевый — график функции,
многократное последовательное применение которой (согласно гипотезе Коллатца) должно приводить к единице, зеленый — график функции из публикации
little-brother
В статье есть формулировка этой проблемы?
Tzimie Автор
https://en.wikipedia.org/wiki/Collatz_conjecture
Я думал она общеизвестна
kay_kay
Ваша гипотеза ошибочна.
GospodinKolhoznik
хабр еще не готов к формулировке проблем такой сложности
MountainGoat
Не, нету. Объясняю: есть функция
Доказать, что цикл
while (n != 1) step(n)
при любом исходном n > 0 всегда выйдет.Tzimie Автор
Да, всего то проблема останова)
leok
Для конкретного алгоритма.
little-brother
Ну как вариант можно дать ссылку на другую статью на Хабре про эту гипотезу https://habr.com/ru/post/675594/ (свеженькая, но без красивых картинок).
Nikita22007
Что-то так себе статейка. С ходу коротко "доказали" гипотезу, которая пока не поддалась никому. В комментариях много кто выразил сомнения.
alex-khv
n = step(n)
MasterMentor
Употреблять иностранное слово, когда есть равносильное ему русское слово, - значит оскорблять и здравый смысл, и здравый вкус.
Что русский язык — один из богатейших языков в мире, в этом нет никакого сомнения.
(с) Белинский В.Г.
Гипотеза на русском:
https://ru.wikipedia.org/wiki/Гипотеза_Коллатца
Tzimie Автор
русская статья в 5 раз короче и про фракталы там ни слова.