Аккуратное длинное целочисленное представление в python
Я программирую простую процедуру расшифровки RSA на Python (я немного новичок в Python) и не могу найти способ аккуратно отформатировать длинные целые числа в моем коде. Целое число имеет длину 2048 бит и, если записано в одну строку, простирается далеко вправо. В C такое целое число будет представлено массивом слов, который можно аккуратно записать на одной странице. Как бы я сделал это в Python? Я попробовал очевидное решение:
modulus = 0xaaaaa\
bbbbb\
ccccc
Это не работает вообще. Единственное, что я нашел для работы, это:
smodulus = "\
aaaaa\
bbbbb\
ccccc"
modulus = long(smodulus,16)
Не могли бы вы предложить метод форматирования для длинного целого числа?
Благодарю.
3 ответа
Python объединяет смежные строковые литералы, так что вы можете написать:
long('01234567'
'89abcdef'
'01234567'
'89abcdef',
16)
Как насчет:
modulus =( 0xaaaaaaaa << 64
| 0xbbbbbbbb << 32
| 0xcccccccc << 0 )
или, если отслеживание этих смещений нежелательно, простой помощник:
def longmodulus(size, seq):
return sum(leg << offset for leg, offset in zip(seq, xrange(size*len(seq)-size, -size, -size)))
modulus = longmodulus(32,
(0xaaaaaaaa,
0xbbbbbbbb,
0xcccccccc))
Создайте свою собственную функцию, которая анализирует строку, и используйте ее для определения глобальной.
SMODULUS = parse("""
aaaab
bbbbb
ccccc
""")
def myFunc(...):
crypomath_and_stuff = SMODULUS | abc & etc
...
Возможно, вам удастся обойти это, сделав его встроенным, и не сделайте его глобальным, но это зависит от того, насколько интерпретатор Python достаточно умен, чтобы компилировать функции констант в предварительно обработанные данные в стиле JIT (и это также зависит от того, является ли Python семантика языка даже допускала такие оптимизации). Чтобы поэкспериментировать с этим самостоятельно, вы можете использовать dis.dis
(дизассемблер Python), чтобы увидеть, действительно ли выполняются оптимизации (или, скорее, не сделаны). Вы также можете сделать его встроенным, если вам не нужна производительность, или это разовые вызовы функций, которые используют parse
d переменных.