целочисленное хранение неограниченной (или очень большой) длины - PullRequest
3 голосов
/ 23 июня 2010

как побочный проект. Я работаю над некоторыми домашними задачами простого поколения, пытаясь написать несколько разных реализаций как средство обучения себя на C и C ++. Конечно, самый быстрый способ генерировать младшие простые числа - это уже иметь их, поэтому я хочу приступить к настройке файла данных простого списка на жестком диске. Я хочу написать весь код, который генерирует простые числа, но у меня нет никаких сомнений относительно использования уже созданных методов хранения. У меня очень мало опыта, когда дело доходит до реального кодирования, но я понимаю большую часть теории. (обратите внимание, что для большей части этого я буду говорить о математических целых числах, а не о переменных типа int)

Итак, у меня есть несколько вопросов к вам, эксперты:

1) Наивным подходом было бы просто записать двоичные числа по мере их генерирования. Тем не менее, в моей голове я представляю список с элементами, разделенными каким-то флагом, так что целые числа больше 32 бит могут быть сохранены (если я доберусь до этой точки). Это, очевидно, неэффективно, но то, что необработанные данные для массива [4723, 12782, 8357] будут выглядеть как 4723F12782F8357, то есть числа хранятся в базовой десятке с 16 битами на цифру и разделяются символами F. Очевидно, что данные о возможностях цифр ABCDE не использовались бы, так что это не очень эффективная система, но вы понимаете, что я имею в виду. Это также имело бы все больший смысл по мере того, как числа становятся длиннее, поскольку любая в любой системе фиксированной длины самая маленькая запись должна быть такой же большой, как самая большая. Я уверен, что должно быть что-то уже написанное на C или C ++, которое делает это эффективно.

2) Другая возможность - это система объявления длины, где перед сохранением каждого целого числа фрагмент данных фиксированной длины (скажем, 1 байт) объявляет, как долго будет целое число (в битах). Это, очевидно, придает аналогичные преимущества предыдущему варианту с дополнительным бонусом не теряя возможности цифр.

Кто-нибудь знает, как можно хранить данные такого рода? Существует ли тип переменной, в котором я могу хранить простые числа, чтобы не ограничивать размер? Более того, каков наиболее эффективный способ сохранения простого списка целых чисел на жестком диске в легко извлекаемом формате?

Ответы [ 2 ]

5 голосов
/ 23 июня 2010

Не изобретай велосипед. Если вы имеете дело с большими простыми числами, вам почти наверняка понадобится библиотека BigNum, такая как GMP (http://gmplib.org/). GMP BigNums имеют методы сериализации, так что вы можете использовать их для простой записи их на диск и чтения с диска, оставляя вас свободными думать об алгоритме.

0 голосов
/ 23 июня 2010

Используя компилятор g ++ в Ubuntu, я обнаружил, что long int равен 32 битам, а long long int 64.

Я вычислял идеальное число из известных простых чисел Мерсенна, держа числа в массивах различной длины long int; это означает, что вы можете использовать long long int для чистых переменных при длинном умножении, длинном делении и т. д. Я также ограничил значения в каждом длинном не более чем 999 999 999, что облегчает печать ответа.

...