Как я пытался 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
;
}
Для меня это своего рода прохладное.