Как вы обрабатываете чрезвычайно большие значения в python?

Как мне заставить python работать со значениями порядка 1099511627776 бит (да, 137 ГБ)? Мне кое-что нужно реализовать (или, если вы можете предложить лучший способ сделать это, изменим методы). по-видимому, новые типы длины pgp имеют 3 раздела вместо 2. Теперь это: тип длины, тип значения длины и длина. Тип длины — 2 бита, что соответствует 191 байту, 8383 байтам, 4294967296 байтам или частичной длине. длина затем кодируется в байтах. как мне проверить, меньше ли значение 4294967296 байт, если я даже не могу сделать 1 << (4294967296 << 8)? он слишком большой, чтобы вместить даже длинный.


person calccrypto    schedule 03.01.2011    source источник
comment
... ура! Неразумно, практично или нецелесообразно иметь дело с числом такого размера. Его нужно разбить на части, т.е. база данных размером 50 ГБ обычно не загружается сразу.   -  person    schedule 03.01.2011
comment
Вы случайно не знаете, как это делает pgp?   -  person calccrypto    schedule 03.01.2011
comment
@calcrypto Если он имеет дело с такими огромными числами, я думаю, он хранит их в сжатой форме - как на primes.utm.edu/largest.html :-) Доступен ли исходный код? Хотя, глядя на простые числа ... самое большое из них имеет длину всего 12 миллионов цифр.   -  person    schedule 03.01.2011
comment
ну, я не думаю, что какой-либо блок pgp когда-либо становился таким большим ... и да, исходный код доступен, но я ужасно читаю коды других людей, поэтому я не могу найти часть, не говоря уже о том, чтобы понять, что они сделали   -  person calccrypto    schedule 03.01.2011
comment
Я пытаюсь представить себе практическое применение числа с точностью до ста миллиардов значащих цифр и терплю неудачу.   -  person Robert Rossney    schedule 04.01.2011
comment
256-битной точности IIRC достаточно, чтобы сосчитать все атомы во Вселенной. количество атомов в наблюдаемой Вселенной близко к 10**80. Кажется, это самое большое число, имеющее какое-либо практическое значение.   -  person S.Lott    schedule 05.01.2011


Ответы (4)


Он не только слишком велик, чтобы поместиться в длинном, но и слишком велик, чтобы поместиться в памяти любого компьютера. Я думаю, вы что-то неправильно поняли.

Насколько я понимаю, наибольшее значение ключа составляет 4 294 967 295 байт. Это 4 Гб, а не 137 Гб. Вы держите этот ключ в памяти не как одно число, а как строку байтов. Поэтому я не знаю, откуда вы взяли число размером 137 ГБ.

Если бы этого требовал PGP, это было бы невозможно реализовать. Поскольку есть реализации, я уверен, что это не так.

(Кроме того, я уверен, что есть модули PGP для Python, но если вы делаете это не потому, что вам это нужно, а для практики и потому, что вы хотите учиться, то продолжайте в том же духе!)

person Lennart Regebro    schedule 03.01.2011
comment
4ГБ. ой. Я, вероятно, сделал что-то странное в wolfram alpha. да, я читаю rfc4880 по одному случайному разделу за раз. Я из тех людей, которые хотят знать, что происходит за кулисами, а не просто использовать заданные команды. - person calccrypto; 04.01.2011

С трехаргументной формой pow().

person Ignacio Vazquez-Abrams    schedule 03.01.2011
comment
какие? pow(2, 4294967296 << 8)? проблема не в вычислении значения. проблема заключается в сохранении значения. и у меня нет номера для мода - person calccrypto; 03.01.2011
comment
@calccrypto: я думаю, что Игнасио имел в виду здесь то, что в математике вы не пишете 10.....0, 1000 ноль, вы только что написали 10^1000, так что ваши числа могут быть сохранены в этой форме :), и я думаю шаблон, который дал вам Игнасио, может быть очень полезен также для выполнения вычислений, посмотрите на алгоритм RSA, чтобы понять, что я имею в виду, все это основано на арифметике, особенно на операторе по модулю, подумайте об этом; +1 для Игнасио. - person mouad; 03.01.2011

Используйте библиотеку больших чисел, например GMPY.

person highBandWidth    schedule 03.01.2011
comment
Хорошая ссылка. Однако это не решает проблему работы с номером, для хранения которого требуется 137 ГБ данных ;-) - person ; 03.01.2011

Я интерпретирую RFC4880 (ноябрь 2007 г.) по-разному. Раздел 3.2 описывает целые числа с множественной точностью как имеющие длину 2 октета, поэтому наибольший размер будет 64 КБ. Раздел 4.2.2 описывает новый формат пакета и документирует номера весов, которые вы описываете. Но формат пакета отличается от целочисленного формата множественной точности. Если вы интерпретируете это по-другому, обновите свой вопрос, указав точные разделы RFC, которые вы читаете.

person casevh    schedule 04.01.2011