Вы знакомы с броуновским движением: в упрощенном виде его можно рассчитывать так: мы перемещаемся на одну клеточку, а вот направление выбираем случайным образом. Броуновское движение возможно в пространстве произвольных размерностей, для числа размерностей 1 и 2 блуждания почти всегда рано или поздно возвращаются в исходную точку, а для более высоких размерностей это уже не выполняется.
Но что, если мы будем прыгать не на одну клетку, а на очередную разницу между простыми числами - вначале 1 (3-2), потом 2 (5-3), снова 2 (7-5), потом 4 (11-7) итд. А вот направление мы будем 'вращать', например, для плоскости это будет вверх-вправо-вниз-влево? Сразу скажу, будет очень красиво.
Сразу скажу, я хотел сотворить что-то красивое с простыми числами с 24 февраля. Это помогало мне не сойти с ума и не выпилиться. Эти эксперименты отвлекали меня, и хорошо, что вначале ничего красивого не получалось - я пробовал и нечто, похожее на игру Жизнь, и треугольник Паскаля, и связь простых чисел и похожих на них lucky numbers... Так что только недавно я получил результат, который меня устроил.
![1302 шага, достигнуто простое число 10687 1302 шага, достигнуто простое число 10687](https://webcf.waybackmachine.org/web/20220421093404/https://habrastorage.org/getpro/habr/upload_files/6f0/e6d/43e/6f0e6d43e2fdfba4f2cdcd7b7f131231.png)
Здесь мы поблуждали совсем недолго, и начали выскакивать за размер небольшого png. Поэтому я решил работать с большими матрицами, а потом 'компессировать' их в картинки приемлемого размера, суммируя число посещений клетки и обозначая это разными цветами.
![шагов: 56873, достигнуто простое: 704357 шагов: 56873, достигнуто простое: 704357](https://webcf.waybackmachine.org/web/20220421093404/https://habrastorage.org/getpro/habr/upload_files/f9e/b5a/257/f9eb5a257ad7f2fde33534c2670f1792.png)
Давайте еще дальше:
![шаг: 794673 достигнуто 12108319 шаг: 794673 достигнуто 12108319](https://webcf.waybackmachine.org/web/20220421093404/https://habrastorage.org/getpro/habr/upload_files/45c/e43/ee3/45ce43ee30837bcdc75ecf55dc5a48de.png)
Здесь видно, как ведет себя граф: топтание на месте, резкий скачок из-за большого prime number gap. Поехали дальше:
![шаг 5'012'197 достигнуто 86'251'189 шаг 5'012'197 достигнуто 86'251'189](https://webcf.waybackmachine.org/web/20220421093404/https://habrastorage.org/getpro/habr/upload_files/cc7/bd4/704/cc7bd4704f35d9623771064ae6e9ebe3.png)
А что будет, если мы сделаем то же самое для 3d?
![3D: шагов 35'778'763 достигнуто 690'345'077 3D: шагов 35'778'763 достигнуто 690'345'077](https://webcf.waybackmachine.org/web/20220421093404/https://habrastorage.org/getpro/habr/upload_files/414/a94/5b0/414a945b0c470150ef87ae272f408520.png)
(вид со стороны XY). Внешне все выглядит примерно также. И это не удивительно, если мы не показываем ось Z, то все сводится к плоскому варианту, в котором мы просто пропускаем некоторые шаги. Конечно, если бы размер gap как!то коррелировал бы с номером шага mod 6, то изменения были бы, но гипотеза Римана говорит, что простые числа ведут себя наиболее 'случайным' образом, и такой корреляции не должно быть.
Секундочку, для броуновского движения 2D и 3D случаю различаются принципиально (по вероятности возвращения в данную точку), а с простыми получаются нет разницы от числа измерений? А как с возвращением в точку (0,0)?
Это невозможно по простой причине: первый шаг равен 1, а все остальные шаги четные. Однако не будем занудствовать, какая вероятность того, что блуждание придет достаточно близко к точке 0,0? Давайте построим график расстояния от начальной точки для разного числа измерений:
![Миллиард шагов (X), достигнуто простое 22'777'909'477 Миллиард шагов (X), достигнуто простое 22'777'909'477](https://webcf.waybackmachine.org/web/20220421093404/https://habrastorage.org/getpro/habr/upload_files/2be/51a/44b/2be51a44b46df631a3ad1d8cf59cd7e8.png)
За исключением 1D, где имеет тенденция касания нуля, остальные графики ведут себя схожим образом, что неудивительно, учитывая что gap все время растет, не говоря о больших выбросах, так что хорошей 'компенсации' плюсов и минусов, как это происходит при броуновском движении, нет (хотя выделенного направления роста, если справедлива гипотеза Римана, тоже быть не может). Сравним с подобным графиками для броуновского движения (конечно, в отличие от детерминированных графиков 'простых блужданий' здесь могут быть разные картины в зависимости от random seed):
![Броуновское движение в пространсве разных размерностей Броуновское движение в пространсве разных размерностей](https://webcf.waybackmachine.org/web/20220421093404/https://habrastorage.org/getpro/habr/upload_files/dca/80e/914/dca80e9145899c3e121e12b4ca49c86d.png)
Обратите внимание, что за миллиард шагов мы находимся в пределе 40 тысяч клеток, тогда как для 'простых блужданий' мы ушли в десятки раз дальше.
Ну и в заключение, насколько далеко я могу продолжить расчет? Я достиг на ноутбуке 383'470'718 шагов с матрицей 600'000x600'000 клеток, упакованных в биты, прежде чем блуждание 'вывалилось' за пределы матрицы.
![](https://webcf.waybackmachine.org/web/20220421093404/https://habrastorage.org/getpro/habr/upload_files/b1d/90d/e73/b1d90de738650e5bda679999032ae9bb.png)