суббота, 5 мая 2012 г.

Оптимизация эллиптических кривых по быстродействию

В блог я пишу когда не пишу программу. А программы я пишу запоями. Называется - творческий запой. Запой может продолжаться долго. Месяц два три, потом накапливается усталость, хочется поразмять язык и расслабить мозг, чтобы не домогался до оптимизации ассемблерных вставок.



Я немного увлекся и сделал. Цифровую подпись NIST ECDSA, потом Гост,  потом разогнал ее в два раза, потом разогнал ее в два раза, потом разогнал ее на 10%, потом еще на 20 потом еще в чертыре раза получил 7 тыс подписей гост, наверное успокоился бы если бы не устал от оптимизации. Оптимизация - это дело страшное, особенно если речь идет о выборе оптимального алгоритма. Сколько вы знаете способов вычисления обратного числа к умножению (1/х)? А сколько разных алгоритмов умножения вы знаете? У меня в коде было около пяти разных алгоритмов умножения скаляра на точку расположенную на эллиптической кривой завернутую в пространство типа тор, {y, х} mod p. Оставил один а написал и отладил все. Тот что оставил достоин патента, хотя идея является логическим продолжением ряда существующих. А какая бывает сложность алгоритмов умножения. Вы не представляете сколько бывает на свете математической ерунды, которая требуется для написания алгоритма и которую хочется тут же забыть, потому что она перегружает мозг. Такие вещи как криптография эллиптическими кривыми нужна разве что для того, чтобы детей в институте напугать до усрачки. В реальном мире такие вещи совсем не применимы, нужно всего два три программиста, которые напишут код, а остальные могут его использовать в своих проектах на общественных началах. Т.е это такое знание, которое не нужно  преподавать в институте, чтобы оно было. Оно одноразовое. Кому какое дело сколько точек всего на эллиптической кривой в дискретном пространстве завернутом в тор?

Потом смог оторваться, выйти из запоя, продержался день и написал еще кучу оптимизаций поверх быстрых алгоритмов редуцирования. Знаете как посчитать модуль простого числа (не делится ни на что) с разрядностью скажем 256 бит? А я знаю, как это делать самым быстрым образом. Потому что я использовал самый быстрый алгоритм и смог его ускорить за счет преобразований. Странных. А чего такое тождественные преобразования алгоритмов? Наверное математики скажут: ты что опух, это не должно работать. Нельзя через дцать операций продеть модуль одного числа и один раз применить модуль другого числа. А мне уже по-фигу, оно работает, хоть я и не могу строго математически доказать трансформацию алгоритма. Я его так увидел, алгоритмы нельзя писать сверху вниз, их можно только видеть целиком и сразу. Потом снизил разрядность? потом переписал на ассемблер, потом выкинул ассемблер, потом повысил разрядность, потом заменил + на  минус. Тернарные заменил на бинарные, учел конвейерность исполнения команд и латентность загрузки из кеша, учел выравнивание на линю кеш, написал идентификацию архитектуры и всех этих параметров. Упростил операцию, потом ввел новую операцию: совмещенное редуцирование и вычитание потом ввел операцию ополовинившие по модулю, потом придумал как делать ополовинившие без циклов по модулю. Потом плюнул на все это и решил, что это игра в бисер без ценителей. Знаю как разогнать еще в два раза при переходе на 64 битную архитектуру. Придумал как разогнать еще в четыре раза проверку цифровой подписи за счет кеширования. Нахамил начальнику. Снял деньги со счета. Теперь думаю нафига мне софт, который может перелопатить 7 тыс цифровых подписей в Электронных таможенных декларациях c XML цифровой подписью на одном ядре процессора, на каждом ядре по 7 тыс в секунду? если в стране всего не более 6 тыс декларантов. Ну нахера такой софт нужен? И главное где тот ценитель стильного шаманства мастера, который способен оценить качество проекта в 32 тыс строки кода, самый быстрый код в каждом из использованных и придуманных алгоритмах.

Я видел вполне успешных фри-лансеров, которые умеют делать веб странички для фирм-однодневок. Кому нужен фрилансер способный в одиночку сделать криптомодуль для российских алгоритмов в четыре раза быстрее чем самые быстрые библиотеки. Код умрет?

Я знаю страшную тайну, как рождается такой код и знаю почему родившись умирает - это всего лишь моя способность видеть мир. Я изучаю мир при помощи программирования, я учусь так с ним взаимодействовать, я музыку изучал через математическую обработку записей. Я такой урод. А мои программы - это побочный продукт от созерцания мира, от моей способности думать. Потому что творить не отделимо от видеть.

Комментариев нет:

Отправить комментарий