Вернуться   Биткоин Форум > Разработка и Техническое Обсуждение
6 июня 2012, 8:49:29 AM   # 1
 
 
Сообщения: 1134
Цитировать по имени
цитировать ответ
по умолчанию Re: Рекурсивный вариант алгоритма умножения эллиптической кривой

Взлом Биткоин адресов.
500 Биткоинов взломаны в "мозговом кошельке" с паролем "bitcoin is awesome"
Адрес кошелька: 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE
Приватный ключ: 5J64pq77XjeacCezwmAr2V1s7snvvJkuAz8sENxw7xCkikceV6e
подробнее...


Всем кто хочет заработать Биткоины без вложений - рекомендую сайт http://bitcoin-zarabotat.ru

Как я пытался speeden мой библиотека Bitcoin Perl6, Я понял то, что стоит mentionning, имхо.

В эллиптической кривой библиотеке арифметики, реализация "мульт" немного странно и трудно понять. Вот соответствующая часть в Python:

Код:
Защиту __mul __ (я, другое):
    """Умножить точку на целое число."""

    Защиту leftmost_bit (х):
      утверждать х > 0
      Результат = 1L
      в то время как результат <= Х: результат = 2 * результат
      возвращаемый результат // 2

    е = другие
    если само .__ порядок: е = е% собственной .__ заказа
    если е == 0: возвращение INFINITY
    если само == INFINITY: возвращение INFINITY
    утверждать е > 0

    # От X9.62 D.3.2:

    e3 = 3 * е
    negative_self = Точка (само .__ кривой, само .__ х, у -self .__, само .__ заказа)
    я = leftmost_bit (е3) // 2
    результат = сам
    # Распечатать "Умножив% S% от D (е3 =% D):" % (Сам, другой, е3)
    в то время как я > 1:
      Результат = result.double ()
      если (e3 & я)! = 0 и (е & я) == 0: результат = результат + самостоятельно
      если (e3 & я) == 0 и (е & я) = 0: результат = результат + negative_self
      # Распечатать ", , , я =% d, результат =% s" % (Я, результат)
      я = я // 2
   
    возвращаемый результат

Ну, я не знаю о вас, но для меня, это некрасиво.

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

Мне казалось, что это один хороший кандидат. Вот что я хотел бы сделать:

Код:

Защиту __mul __ (я, другое):
    """Умножить точку на целое число."""

    е = другие
    если само .__ порядок: е = е% собственной .__ заказа
    если е == 0: возвращение INFINITY
    если само == INFINITY: возвращение INFINITY
    утверждать е > 0

    если е == 1: Самовозврат
    если е == 2: возвращение self.double
    утверждать е > 2
    если е% 2 == 0: возвращение (е / 2 * Я) .double
    Самовозврат + (е / 2 * Я) .double

Ну, я не пробовал этот конкретный один, потому что я не люблю питон, но та же идея работала хорошо с моей реализации PERL, например:

Код:
к югу мульт {
    нет предупреждений КЯ (рекурсии);
    мой $ к = сдвиг;
    мой $ и = сдвиг;
    вернуть
    $ К == 1? $ И:
    $ К == 2? двойной $ и:
    $ К% 2 == 0? двойной мульт $ к / 2, $ и:
    добавить $ и, двойной мульт $ к / 2, $ U
    ;
}

Для меня это своего рода прохладное.
grondilu сейчас офлайн Пожаловаться на grondilu   Ответить с цитированием Мультицитирование сообщения от grondilu Быстрый ответ на сообщение grondilu


Как заработать Биткоины?
Без вложений. Не майнинг.


6 июня 2012, 9:20:43 AM   # 2
 
 
Сообщения: 1134
Цитировать по имени
цитировать ответ
по умолчанию Re: Рекурсивный вариант алгоритма умножения эллиптической кривой

Получил 1806 Биткоинов
Реальная история.






Для меня это своего рода прохладное.


Рекурсия крут на бумаге.

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

Но опять же, это Perl и Python, так что, кто заботится о
скорость в первое место.

В developpers Perl6 работает над делом с хвостом рекурсией (я думаю, что это уже сделано в Rakudo). Я предполагаю, что команда Python обеспокоена, что тоже.

Кроме того, максимальное количество рекурсивных вызовов здесь 256. Это конечно много, но он ограничен, так что должно быть хорошо, я думаю.
grondilu сейчас офлайн Пожаловаться на grondilu   Ответить с цитированием Мультицитирование сообщения от grondilu Быстрый ответ на сообщение grondilu

6 июня 2012, 9:25:40 AM   # 3
 
 
Сообщения: 504
Цитировать по имени
цитировать ответ
по умолчанию Re: Рекурсивный вариант алгоритма умножения эллиптической кривой

Это интересное упражнение, но так как все рекурсии можно преобразовать к итерации (и наоборот), и итерации, как правило, не имеют каких-либо проблем стека, вы почти всегда лучше конвертирования рекурсивный алгоритм итеративного (плюс компиляторы гораздо лучше разворачивая итерационные циклы для целей оптимизации).

(Примечание: Я не изучал код достаточно хорошо, чтобы знать, является ли это один из случаев за пределами "почти всегда", Но я был бы удивлен, если бы не было)
realnowhereman сейчас офлайн Пожаловаться на realnowhereman   Ответить с цитированием Мультицитирование сообщения от realnowhereman Быстрый ответ на сообщение realnowhereman

8 июня 2012, 1:59:42 PM   # 4
 
 
Сообщения: 1134
Цитировать по имени
цитировать ответ
по умолчанию Re: Рекурсивный вариант алгоритма умножения эллиптической кривой

Я, наконец, написал нерекурсивный, еще много простого кода:

Код:
к югу мульт {
    мой $ к = сдвиг;
    мой $ точка = Shift->клонировать;
    мой $ результат = EC :: точечно>горизонт;
    для (; $ K > 0; $ Точка = двойной ($ точка), $ к / = 2) {
        $ Результат + $ = точка, если $ K% 2 == 1;
    }
    вернуть $ результат;
}

Для меня это гораздо лучше, чем баловаться aroung с бинарными операторами сдвига.
grondilu сейчас офлайн Пожаловаться на grondilu   Ответить с цитированием Мультицитирование сообщения от grondilu Быстрый ответ на сообщение grondilu



Как заработать Биткоины?

Bitcoin Wallet * Portefeuille Bitcoin * Monedero Bitcoin * Carteira Bitcoin * Portafoglio Bitcoin * Bitcoin Cüzdan * 比特币钱包

bitcoin-zarabotat.ru
Почта для связи: bitcoin-zarabotat.ru@yandex.ru

3HmAQ9FkRFk6HZGuwExYxL62y7C1B9MwPW