Я пробовал различные методы для реализации программы, которая дает цифры числа Пи последовательно. Я попробовал метод рядов Тейлора , но он оказался очень медленным (когда я сравнил свой результат с онлайн-значениями через некоторое время). Во всяком случае, я пытаюсь лучшие алгоритмы.
Итак, при написании программы я застрял в проблеме, как и во всех алгоритмах: как мне узнать, n
что вычисленные мной цифры точны?
algorithm
math
language-agnostic
pi
Ишан Шарма
источник
источник
Ответы:
Поскольку я являюсь держателем мирового рекорда по большинству цифр числа пи, я добавлю два моих цента :
Если вы на самом деле не устанавливаете новый мировой рекорд, обычная практика - просто проверять вычисленные цифры по известным значениям. Это достаточно просто.
На самом деле, у меня есть веб-страница, на которой перечислены фрагменты цифр с целью проверки вычислений против них: http://www.numberworld.org/digits/Pi/
Но когда вы попадаете на территорию с мировым рекордом, не с чем сравнивать.
Исторически стандартным подходом для проверки правильности вычисленных цифр является пересчет цифр с использованием второго алгоритма. Так что, если любое из вычислений пойдет не так, цифры в конце не будут совпадать.
Это обычно вдвое больше необходимого времени (поскольку второй алгоритм обычно медленнее). Но это единственный способ проверить вычисленные цифры после того, как вы попали на неизведанную территорию с ранее не вычисленными цифрами и новым мировым рекордом.
В те дни, когда суперкомпьютеры устанавливали рекорды, обычно использовались два разных алгоритма AGM :
Это оба
O(N log(N)^2)
алгоритма, которые довольно легко реализовать.Однако в настоящее время все немного по-другому. В последних трех мировых рекордах вместо двух вычислений мы выполнили только одно вычисление, используя самую быструю известную формулу (формула Чудновского ):
Этот алгоритм намного сложнее реализовать, но он намного быстрее, чем алгоритмы AGM.
Затем мы проверяем двоичные цифры, используя формулы BBP для извлечения цифр .
Эта формула позволяет вам вычислять произвольные двоичные цифры, не вычисляя перед этим все цифры. Таким образом, он используется для проверки последних нескольких вычисленных двоичных цифр. Поэтому это намного быстрее, чем полный расчет.
Преимущество этого заключается в следующем:
Недостатком является:
Я замутил некоторые детали того, почему проверка последних нескольких цифр означает, что все цифры верны. Но это легко увидеть, поскольку любая ошибка вычислений будет распространяться до последних цифр.
Теперь этот последний шаг (проверка конверсии) на самом деле довольно важен. Один из предыдущих мировых рекордсменов фактически нас об этом звал, потому что изначально я не дал достаточного описания того, как это работает.
Итак, я вытащил этот фрагмент из своего блога:
Вычислить A, используя арифметику по основанию 10, а B - двоичную арифметику.
Если
A = B
, то с «чрезвычайно высокой вероятностью», преобразование является правильным.Для дальнейшего чтения, см. Мой пост в блоге Pi - 5 триллионов цифр .
источник
ArcTan(1)
логарифмически сходится. Так что вам нужно экспоненциально большое количество терминов, чтобы сходиться - короче, не используйте его.Log(151931373056000)/Log(10) = 14.181647462725477655...
)Несомненно, для ваших целей (что, я полагаю, является всего лишь упражнением в программировании), лучше всего сравнить ваши результаты с любым из списков цифр числа пи в сети.
И как мы узнаем, что эти значения верны? Ну, я мог бы сказать, что есть компьютерные способы доказать, что реализация алгоритма верна.
Более прагматично: если разные люди используют разные алгоритмы и все они соглашаются (выбрать число) на тысячу (миллион, что угодно) десятичных разрядов, это должно создать у вас теплое нечеткое ощущение, что они правильно поняли.
Исторически в 1873 году Уильям Шенкс опубликовал число до 707 десятичных знаков. Бедный парень, он допустил ошибку, начав с 528-го знака после запятой.
Очень интересно, что в 1995 году был опубликован алгоритм, который имел свойство, которое напрямую вычисляло бы n-ю цифру (основание 16) числа pi без необходимости вычисления всех предыдущих цифр !
Наконец, я надеюсь, что ваш первоначальный алгоритм не был таким,
pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...
который может быть самым простым в программировании, но это также один из самых медленных способов сделать это. Проверьте пи-статью в Википедии для более быстрых подходов.источник
Вы можете использовать несколько подходов и посмотреть, сходятся ли они к одному и тому же ответу. Или возьмите немного из сети. Алгоритм Чудновского обычно используется как очень быстрый метод вычисления числа Пи. http://www.craig-wood.com/nick/articles/pi-chudnovsky/
источник
Ряд Тейлора - один из способов приблизиться к пи. Как уже отмечалось, он сходится медленно.
Можно показать, что частичные суммы ряда Тейлора находятся в некотором множителе следующего члена от истинного значения числа пи.
Другие способы аппроксимации пи имеют аналогичные способы вычисления максимальной ошибки.
Мы знаем это, потому что мы можем доказать это математически.
источник
Вы можете попробовать вычислить
sin(pi/2)
(илиcos(pi/2)
в этом отношении), используя (довольно) быстро сходящиеся степенные ряды для sin и cos. (Еще лучше: используйте различные формулы удвоения для вычисления ближеx=0
для более быстрой сходимости.)Кстати, лучше, чем использовать ряды для
tan(x)
, с вычислением, скажем,cos(x)
как черный ящик (например, вы можете использовать ряды Тейлора, как указано выше), чтобы делать поиск корней через Ньютон. Конечно, есть лучшие алгоритмы, но если вы не хотите проверять тонны цифр, этого должно быть достаточно (и это не так сложно реализовать, и вам нужно только немного исчисления, чтобы понять, почему это работает.)источник
sin(pi/2)
, не так ли?sin(x)
иcos(x)
с высокой точностью на самом деле гораздо сложнее, чем вычислить сам Пи.