Как создать PI последовательно в Ruby - PullRequest
5 голосов
/ 29 июня 2010

Из чистого интереса, мне любопытно, как создать PI последовательно, чтобы вместо числа, производимого после результата процесса, разрешалось отображать числа по мере генерирования самого процесса.Если это так, то число может появиться само, и я мог бы реализовать сборку мусора для ранее увиденных чисел, создавая таким образом бесконечный ряд.Результатом является просто число, генерируемое каждую секунду после серии Пи.

Вот что я обнаружил, просматривая интернет:

Это популярный компьютерный алгоритм, похожий на Machin-алгоритм:

def arccot(x, unity)
   xpow = unity / x
   n = 1
   sign = 1
   sum = 0
   loop do
       term = xpow / n
       break if term == 0
       sum += sign * (xpow/n)
       xpow /= x*x
       n += 2
       sign = -sign
   end
   sum
end

def calc_pi(digits = 10000)
   fudge = 10
   unity = 10**(digits+fudge)
   pi = 4*(4*arccot(5, unity) - arccot(239, unity))
   pi / (10**fudge)
end

digits = (ARGV[0] || 10000).to_i
p calc_pi(digits)

Ответы [ 2 ]

4 голосов
/ 29 июня 2010

В продолжение ответа «Морон»: что формула Бэйли-Боровейна-Плуффа делает для вас, так это то, что она позволяет вам вычислять двоичные (или эквивалентно шестнадцатеричные) цифры числа Пи, не вычисляя все цифры перед ним.Эта формула использовалась для вычисления квадриллионного бита числа пи десять лет назад.Это 0. (Я уверен, что вы были на краю своего места, чтобы узнать.)

Это не то же самое, что динамический алгоритм с малым объемом памяти для вычисления бит или цифрпи, что я думаю, что вы могли бы подразумевать под "последовательно".Я не думаю, что кто-то знает, как это сделать в базе 10 или в базе 2, хотя алгоритм BPP можно рассматривать как частичное решение.

Что ж, некоторые итерационные формулы для числа пи тоже-подобно последовательный алгоритм, в том смысле, что есть итерация, которая производит больше цифр с каждым раундом.Тем не менее, это также только частичное решение, потому что обычно число цифр удваивается или утраивается с каждым шагом.Так что вы будете ждать с большим количеством цифр некоторое время, и скоро будет гораздо больше цифр.

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

4 голосов
/ 29 июня 2010

Возможно, вы можете работать с шестнадцатеричным?Дэвид Бейли, Питер Борвейн и Саймон Плуфф открыли формулу для n-й цифры после десятичной дроби в шестнадцатеричном разложении числа pi.

Формула:

шестнадцатеричное разложение числа pi http://www.sciencenews.org/sn_arc98/2_28_98/math228.jpg

Подробнее об этом можно прочитать здесь: http://www.andrews.edu/~calkins/physics/Miracle.pdf

Вопрос о том, существует ли такая формула для базы 10. Все еще остается открытым.

Дополнительная информация: http://www.sciencenews.org/sn_arc98/2_28_98/mathland.htm

...