Как быстрее всего вычислить е до 2 триллионов цифр?

Я хочу вычислить e как 2 триллиона (2 000 000 000 000) цифр. Это около 1,8 ТиБ чистой e. Я только что реализовал алгоритм расширения ряда Тейлора, используя GMP (код может можно найти здесь).

К сожалению, при суммировании более 4000 членов на моем компьютере происходит сбой, вероятно, из-за нехватки памяти.

Каковы современные достижения в области вычислений e? Какой алгоритм самый быстрый? Какие-нибудь реализации с открытым исходным кодом, на которые стоит обратить внимание? Пожалуйста, не упоминайте y-cruncher, это закрытый исходный код.


person iblue    schedule 09.11.2012    source источник
comment
Я не знаю ответа в любом случае, но ищете ли вы двоичное расширение e или его десятичное расширение?   -  person Pascal Cuoq    schedule 09.11.2012
comment
Упоминается создатель y-crunchers @Mysticial   -  person Stephan Dollberg    schedule 09.11.2012
comment
@PascalCuoq Я ищу 2 триллиона десятичных знаков.   -  person iblue    schedule 09.11.2012
comment
У вашего компьютера есть ограничение. Отметьте stackoverflow.com/questions/384502/   -  person fonZ    schedule 09.11.2012
comment
@fork Его не нужно хранить как собственный тип.   -  person woz    schedule 09.11.2012
comment
@woz нет, но если вы не знаете, это может вызвать проблемы, просто скажу.   -  person fonZ    schedule 09.11.2012
comment
@fork: я использую библиотеку bignum, чтобы обойти подобные проблемы. Это называется GMP (проверьте ссылку в моем вопросе) и позволяет вычислять произвольную точность, если числа помещаются в мою оперативную память. Когда у меня заканчивается ОЗУ, он просто вылетает. Я мог бы использовать 10 ТБ пространства подкачки, но это немного замедлило бы работу :)   -  person iblue    schedule 09.11.2012
comment
Википедия говорит, что текущий лучший результат при вычислении e - один триллион десятичных цифр (результат с 5 июля 2010 г.) - en.wikipedia.org/wiki/E_ (Mathemat_constant) #Known_digits, поэтому задача нетривиальная и, вероятно, потребует специальной настройки оборудования.   -  person PanJanek    schedule 09.11.2012
comment
Я не понимаю цели, что не так с 1,5 триллионами цифр? Зачем использовать чужой алгоритм? Если вам нужны цифры, почему бы просто не скачать их? numberworld.org/ftp   -  person Hans Passant    schedule 09.11.2012
comment
У меня есть доступ к машине с 2 ТиБ ОЗУ, но я сомневаюсь, что смогу легко вернуть вам результат :) Возможно, вам стоит использовать некоторые из алгоритмы потоковой передачи   -  person Hristo Iliev    schedule 09.11.2012
comment
@iblue Последний раз, когда я смотрел, GMP использовал int для подсчета конечностей, поэтому с обычным 32-битным дополнением до двух ints вы не могли получить больше, чем 2^37 - 64 бит точности. Это может быть меньше вашей оперативной памяти.   -  person Daniel Fischer    schedule 09.11.2012
comment
В Linux существует система виртуальной памяти, а это означает, что адреса, видимые пользовательскими программами, не соответствуют напрямую физическим адресам, используемым оборудованием. С помощью виртуальной памяти программы, запущенные в системе, могут выделять гораздо больше памяти, чем доступно физически.   -  person fonZ    schedule 09.11.2012
comment
+1 примерно за 1,8 ТиБ чистой e.   -  person 1''    schedule 09.11.2012
comment
Похоже, это может удвоить текущий рекорд, вычисление которого в 2010 году заняло 9,3 дня.   -  person Matthew Strawbridge    schedule 09.11.2012
comment
Я быстро посмотрел на источник и прочитал это. Поскольку вычисление дроби каждый раз занимает много времени, мы просто вычисляем знаменатель и числитель и складываем их. Когда мы закончили суммировать все термины, мы, наконец, сделаем деление. Если бы я понял, что вы имели в виду, вы не можете этого сделать. 1 + 1/2 + 1/6 + ... не то же самое, что (1 + 1 + 1 + ...) / (1 + 2 + 6 + ...)   -  person rpsml    schedule 09.11.2012
comment
@rpsml Я не могу утверждать, что понимаю код, просто читая его, но в коде в mpq_add я совершенно уверен, что q означает поле рациональных чисел (и, конечно, add означает добавить). Я бы не волновался.   -  person Pascal Cuoq    schedule 10.11.2012
comment
Эм ... вздох .....   -  person Mysticial    schedule 10.11.2012
comment
Я не могу сказать, что согласен с закрытым голосованием. Тот факт, что вопрос / задача чрезвычайно сложен, не означает, что он неконструктивен.   -  person Mysticial    schedule 10.11.2012


Ответы (2)


Поскольку я являюсь автором упомянутой вами программы y-cruncher, я добавлю мои 2 цента.

Для такой большой задачи необходимо преодолеть два самых больших препятствия:

  1. объем памяти
  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 уже использует большое умножение на основе БПФ. Но ему не хватает двух важных функций:

  1. Вычисление вне ядра (своп) для использования диска при нехватке памяти.
  2. Он не распараллеливается.

Второй момент не так важен, так как вы можете просто подождать дольше. Но для всех практических целей вам, вероятно, понадобится развернуть свою собственную. И это то, что я сделал, когда написал y-cruncher.


Тем не менее, есть много других недостатков, о которых также необходимо позаботиться:

  1. Последнее деление потребует быстрого алгоритма, такого как метод Ньютона.
  2. Если вы собираетесь вычислять в двоичном формате, вам нужно будет выполнить преобразование счисления.
  3. Если вычисления потребуют много времени и ресурсов, вам может потребоваться реализация отказоустойчивости для обработки сбоев оборудования.
person Mysticial    schedule 09.11.2012

Поскольку у вас есть цель, сколько цифр вы хотите (2 триллиона), вы можете оценить, сколько терминов вам нужно, чтобы вычислить e до этого количества цифр. Исходя из этого, вы можете оценить, сколько дополнительных цифр точности вам нужно будет отслеживать, чтобы избежать ошибок округления на 2-м триллионном разряде.

Если мой расчет на основе приближения Стирлинга верен, то величина, обратная 10 к 2 триллионам, примерно равна 100 миллиардам факториалов. Это примерно то, сколько терминов вам понадобится (100 миллиардов). Однако история немного лучше, потому что вы начнете отбрасывать многие числа при вычислении терминов задолго до этого.

Поскольку e вычисляется как сумма обратных факториалов, все ваши термины рациональны, и, следовательно, их можно выразить как повторяющиеся десятичные дроби. Таким образом, десятичное расширение ваших терминов будет (а) экспонентой, (б) неповторяющейся частью и (в) повторяющейся частью. Если вы посмотрите на термины таким образом, вы можете воспользоваться некоторыми преимуществами.

В любом случае удачи!

person John    schedule 09.11.2012