Поскольку я являюсь автором упомянутой вами программы y-cruncher, я добавлю мои 2 цента.
Для такой большой задачи необходимо преодолеть два самых больших препятствия:
- объем памяти
- Сложность во время выполнения
Память
2 триллиона цифр - это экстремум, мягко говоря. Это вдвое больше, чем текущий рекорд, установленный мной и Сигеру Кондо в 2010 году. (Нам потребовалось более 9 дней, чтобы вычислить 1 триллион цифр с помощью y-cruncher.)
В обычном тексте это около 1,8 ТиБ в десятичной системе. В упакованном двоичном представлении это 773 ГиБ.
Если вы собираетесь выполнять арифметические операции с числами такого размера, вам понадобится 773 ГиБ для каждого операнда, не считая оперативной памяти.
Возможно, y-cruncher действительно требует 8,76 ТиБ памяти, чтобы выполнять все эти вычисления в оперативной памяти. Таким образом, вы можете ожидать, что для других реализаций потребуется такая же уступка или принятие, самое большее в 2 раза.
Тем не менее, я сомневаюсь, что у тебя будет достаточно барана. И даже если бы вы это сделали, это было бы сильно NUMA. Таким образом, альтернативой является использование диска. Но это нетривиально, так как для повышения эффективности вам нужно рассматривать память как кеш и контролировать все данные, которые передаются между памятью и диском.
Сложность во время выполнения
Здесь у нас другая проблема. Для 2 триллионов цифр вам понадобится очень быстрый алгоритм. Не просто быстрый алгоритм, а квазилинейный алгоритм времени выполнения.
Ваша текущая попытка выполняется примерно через O(N^2)
. Так что, даже если у вас было достаточно памяти, это не закончится за всю вашу жизнь.
Стандартный подход к вычислениям e
с высокой точностью выполняется в O(N log(N)^2)
и сочетает в себе следующие алгоритмы:
К счастью, GMP уже использует большое умножение на основе БПФ. Но ему не хватает двух важных функций:
- Вычисление вне ядра (своп) для использования диска при нехватке памяти.
- Он не распараллеливается.
Второй момент не так важен, так как вы можете просто подождать дольше. Но для всех практических целей вам, вероятно, понадобится развернуть свою собственную. И это то, что я сделал, когда написал y-cruncher.
Тем не менее, есть много других недостатков, о которых также необходимо позаботиться:
- Последнее деление потребует быстрого алгоритма, такого как метод Ньютона.
- Если вы собираетесь вычислять в двоичном формате, вам нужно будет выполнить преобразование счисления.
- Если вычисления потребуют много времени и ресурсов, вам может потребоваться реализация отказоустойчивости для обработки сбоев оборудования.
person
Mysticial
schedule
09.11.2012
int
для подсчета конечностей, поэтому с обычным 32-битным дополнением до двухint
s вы не могли получить больше, чем2^37 - 64
бит точности. Это может быть меньше вашей оперативной памяти. - person Daniel Fischer   schedule 09.11.20121 + 1/2 + 1/6 + ...
не то же самое, что(1 + 1 + 1 + ...) / (1 + 2 + 6 + ...)
- person rpsml   schedule 09.11.2012mpq_add
я совершенно уверен, чтоq
означает поле рациональных чисел (и, конечно,add
означает добавить). Я бы не волновался. - person Pascal Cuoq   schedule 10.11.2012