Перечитал давний доклад академика Арнольда В.И. о сложности последовательностей нулей и единиц, в которй он использует монады для определения сложности.
Доклад в двух вариантах, с красивыми картинками и академик тут очень красиво и подробно рассказывает, почему одна последовательность сложнее другой и как это видно и строгий вариант "Доклад в Московском математическом обществе"

Вот тут можно прочитать и посмотреть, советую
https://elementy.ru/nauchno-populyarnaya_biblioteka/430178/430281

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

Это монады, что получились у академика. Чем дальше от корня, тем сложнее, так он в этом случае определил.

Вот и захотелось глянуть на монады точек эллиптической кривой над конечным полем.

Для исследований взял Python с его Jupyter и хорошую библиотеку SageMath, которая позволяет лихо оперировать эллитическими кривыми. Меня интересовали как раз кривые из которых в нынешнее время строится всё шифрование и прочие биткойны и весь мир сейчас вокруг этих кривых.

Поскольку там в реальности громадные числа, и считать там ооооочень долго, взял для примера простое число поменьше и кривую, всем известную.

Итак начнем.

Берем простое 103 или 0х67 для группы, уравнение кривой y² = x³ + 7 начальной точкой взял точку х = 1.
Получилась эллиптическая кривая с фактором 111 или 0х6F.

Так как у нас точек мало, сотня всего, можно перечислением все вычислить и построить словарь логарифмирования, т.е. ключ это координаты точки, а значение это множитель на точку G.
Точку (00, 01), которая бесконечность, назначим как -1 для полноты.

А теперь просто воспользуемся graphviz для построения графика отоборажения точек на точки, т.е. тех самых монад. Само отображение точек на точки видно в тексте python.

from sage.all import *
import numpy as np

n_primes = 103
E = EllipticCurve(GF(n_primes), [0, 7])
h = E.cardinality()  
G = E.lift_x(Integer(0x1))
o = factor(h-1)

points = {}
for k in range(1,h):
    path = []
    P = k*G
    _sx = Integer(P[0]).hex() #.binary()
    _sy = Integer(P[1]).hex() #.binary()
    points['0'*(2-len(_sx))+_sx+'.'+'0'*(2-len(_sy))+_sy] = k
points['00.01'] = -1

import graphviz

dot = graphviz.Digraph(strict=True)
for l in range(1,h):
    P = l*G
    for k in range(1,h):
        Pn =63*P
        _sx = Integer(P[0]).hex()
        _sy = Integer(P[1]).hex()
        _p_key = '0'*(2-len(_sx))+_sx+'.'+'0'*(2-len(_sy))+_sy
        _p_num = hex(points[_p_key]).replace('0x','')
        dot.node(f'{_p_key}', f'{_p_key} {_p_num}') # {Integer(k).hex()}')
        _sx = Integer(Pn[0]).hex()
        _sy = Integer(Pn[1]).hex()
        _pn_key = '0'*(2-len(_sx))+_sx+'.'+'0'*(2-len(_sy))+_sy
        _pn_num = hex(points[_pn_key]).replace('0x','')
        dot.node(f'{_pn_key}', f'{_pn_key} {_pn_num}') # {Integer(k).hex()}')
        dot.edge(f'{_p_key}', f'{_pn_key}')
        P = Pn
dot #.render('111_63', format='png', cleanup=True)

Картинка оказалась очень интересной и точки оказались сгруппированы в простые кучки.

Это одна картинка, которую порезал на 6 частей для того, что бы вставить в статью


Каждая кучка точек представляет из себя цикл в каждой точке которого есть еще два листа. И таких кучек ровно 12.
Обратите внимание, что во всех точках каждого цикла значения y координаты Y одинаковые. Если взять это число за номер кучки, то и тут симметрия очевидна

[2, 12, 17, 39, 47, 48, 55, 56, 64, 86, 91, 101]

если не очевидна, то возьмите расстояния между кучками

[10, 5, 22, 8, 1, 7, 1, 8, 22, 5, 10]

тут симметрия видна явно и красиво.
Все листья в кучках тоже не случайны, они все с одинаковыми координатами y. Т.е. у кучки номер 38 все листья или 2d или 04, а у кучки номер 27 все листья или 1f или 4c.

Сумма номеров точек тоже совсем не случайна. Вот в кучке номер 27 сумма номеров листьев 1+26+1a+64+a+2f равна DE, а это 6F*2. 6F это кардинал группы. И сумма номеров цикла тоже 4b+3f+54=DE. В кучке 5b сумма номеров листьев 2+4c+34+59+14+5e равна 14D, а это 6F*3, а сумма номеров цикла 39+27+f равна 6F.
в кучке 65 тоже сумма номеров листьев 10+35+2e+53+31+56 равна 14D, а это 6F*3, а сумма номеров цикла 5a+c+9, те же самые 6F.

Это удивительные закономерности, точки эллиптической кривой оказались очень хорошо структурированы.
Есть и другие удивительные совпадения в этих картинках.

Практической пользы от этой статьи нет, это забава, игра ума,
просто "лето выдалось дождливое"

Комментарии (1)


  1. mishkin79
    26.07.2025 21:25

    Для генерации используются не "случайные" точки с эллипсов, а те, которые удовлетворяют требования по "разряжённости", отсутствию повторов и прочее. Для этого берутся точки "перегиба". Если "случайное" число пропустить через sin(допустим генерация круга) меняя любой его разряд, то видно что при приближении к сгенерированному числу функция выдаёт "коленца" - вот в этих точках примерно они и берутся(и этих точек не так и много). Через вольфрам это тоже видно. Числа брал с биткоина. Было любопытно) Не такой уж и рандомный ваш randomize.