Аккуратное длинное целочисленное представление в python - PullRequest
0 голосов
/ 19 марта 2012

Я программирую простую процедуру расшифровки RSA на Python (я немного новичок в Python) и не могу найти способ аккуратно отформатировать длинное целое число в моем коде.Целое число имеет длину 2048 бит и, если записано в одну строку, простирается далеко вправо.В C такое целое число будет представлено массивом слов, который можно аккуратно записать на одной странице.Как бы я сделал это в Python?Я попробовал очевидное решение:

modulus = 0xaaaaa\
bbbbb\
ccccc

Это не работает вообще.Единственное, что я нашел для работы, это:

smodulus = "\
aaaaa\
bbbbb\
ccccc"
modulus = long(smodulus,16)

Не могли бы вы предложить метод форматирования для длинного целого числа?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 19 марта 2012

Python объединяет смежные строковые литералы , поэтому вы можете написать:

long('01234567'
     '89abcdef'
     '01234567'
     '89abcdef',
     16)
0 голосов
/ 19 марта 2012

howbout:

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))
0 голосов
/ 19 марта 2012

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

SMODULUS = parse("""
    aaaab
    bbbbb
    ccccc
    """)

def myFunc(...):
    crypomath_and_stuff = SMODULUS | abc & etc
    ...

Вы можете обойтись, сделав ее встроенной, и избежать превращения ее в глобальную, но это зависитесли интерпретатор python достаточно умен, чтобы компилировать функции констант в предварительно обработанные данные, стиль JIT (и также зависел бы, если бы семантика языка python даже допускала такую ​​оптимизацию).Чтобы поэкспериментировать с этим самостоятельно, вы можете использовать dis.dis (дизассемблер Python), чтобы увидеть, действительно ли выполняются оптимизации (или, скорее, не сделаны).Вы также можете сделать его встроенным, если вам не нужна производительность, или это одноразовые вызовы функций, использующих переменные parse d.

...