Як визначити, чи точний мій розрахунок пі?


772

Я намагався різними методами реалізувати програму, яка дає цифри pi послідовно. Я спробував метод серії Тейлора , але він виявився надзвичайно повільним (коли через деякий час я порівняв результат із значеннями в Інтернеті). У всякому разі, я намагаюся вдосконалити алгоритми.

Отже, під час написання програми я застряг у проблемі, як і у всіх алгоритмах: Як я можу знати, що nцифри, які я обчислив, є точними?


20
більше математичної задачі. хороші алгоритми також дають оцінку помилки.
приклад

35
Порівняйте проти пі?
Дейв Ньютон

55
@chris: "Буквально скрізь"?
Гонки легкості на орбіті

32
Я можу перевірити для вас до 3,141592653589793238462643383279502, крім того, навіщо вам така велика кількість цифр? (Це щось на зразок точності атомного рівня з колом розміром Всесвіту.)
AJ Henderson,

65
Чому ви просто не розділите на pi і не перевірте, чи результат 1? (просто жартує)
користувач541686

Відповіді:


1628

Оскільки я є поточним світовим рекордсменом з найбільшого числа пі, додамо свої два центи :

Якщо ви насправді не встановите новий світовий рекорд, загальною практикою є лише перевірка обчислених цифр проти відомих значень. Тож це досить просто.

Насправді у мене є веб-сторінка, в якій перераховані фрагменти цифр для перевірки обчислень проти них: http://www.numberworld.org/digits/Pi/


Але, потрапляючи на територію світових рекордів, з чим порівняти немає.

Історично склалося, що стандартним підходом до перевірки правильності обчислених цифр є перерахунок цифр за допомогою другого алгоритму. Тож якщо обчислення йдуть погано, цифри в кінці не збігаються.

Зазвичай це більше, ніж удвічі більше часу, необхідного (оскільки другий алгоритм зазвичай повільніше). Але це єдиний спосіб перевірити обчислені цифри після того, як ти прогулявся на незафіксовану територію ніколи не обчислених цифр і новий світовий рекорд.


Ще в часи, коли суперкомп'ютери встановлювали записи, зазвичай використовували два різні алгоритми AGM :

Це обидва O(N log(N)^2)алгоритми, які було досить легко здійснити.

Однак нині справи дещо інакше. В останніх трьох світових рекордах замість того, щоб виконати два обчислення, ми виконали лише одне обчислення, використовуючи найшвидшу відому формулу (формула Чудновського ):

Введіть тут опис зображення

Цей алгоритм реалізувати набагато складніше, але він набагато швидший, ніж алгоритми AGM.

Потім ми перевіряємо двійкові цифри, використовуючи формули BBP для вилучення цифр .

Введіть тут опис зображення

Ця формула дозволяє обчислити довільні двійкові цифри без обчислення всіх цифр перед нею. Тому він використовується для перевірки останніх кількох обчислених двійкових цифр. Тому це набагато швидше, ніж повне обчислення.

Перевага цього:

  1. Потрібно лише одне дороге обчислення.

Недоліком є:

  1. Потрібна реалізація формули Бейлі-Борвейна – Плоуффа (BBP).
  2. Необхідний додатковий крок для перевірки перетворення радіусу від двійкового до десяткового.

Я описав деякі деталі того, чому перевірка останніх цифр означає, що всі цифри є правильними. Але це легко переконатися, оскільки будь-яка помилка обчислення поширюється на останні цифри.


Тепер цей останній крок (перевірка конверсії) насправді досить важливий. Один з попередніх світових рекордсменів нас справді закликав до цього, оскільки, спочатку, я не дав достатньої характеристики того, як це працює.

Тому я витягнув цей фрагмент із свого блогу:

N = # of decimal digits desired
p = 64-bit prime number

Введіть тут опис зображення

Обчисліть A, використовуючи основу 10 арифметики та B, використовуючи двійкову арифметику.

Введіть тут опис зображення

Якщо A = Bтоді з "надзвичайно високою ймовірністю" перетворення правильне.


Для подальшого читання дивіться мій пост у блозі Pi - 5 трлн цифр .


15
І щоб відповісти на інше питання про те, як знати, коли конкретний алгоритм перейшов у N цифр: Це вимагає знати поведінку алгоритму конвергенції. Серія Тейлора ArcTan(1)логарифмічно збігається. Тож вам знадобиться експоненціально велика кількість термінів, щоб сходитись - коротше, не використовуйте.
Містичний

21
Так, формула Чудновського збігається зі стійкими 14,18 цифрами на термін. Таким чином, ви можете розділити загальну кількість цифр на це, щоб отримати скільки термінів вам потрібно. (Точне значення: Log(151931373056000)/Log(10) = 14.181647462725477655...)
Mysticial

7
@ erikb85 Вигляд. Формула BBP (певною мірою) вважається другим алгоритмом. Але само по собі цього недостатньо, оскільки він не підтверджує перетворення на базу 10. Ідея використання перевірки конверсії BBP + для усунення необхідності у другому обчисленні не була моєю. Вперше це зробив Фабріс Белард у своєму світовому рекорді 2009 року. Це була така гарна ідея, що ми зробили те саме і вдосконалилися на ній.
Містичний

83
@FunsukWangadu Я можу говорити лише за себе, але ось так: я ніколи насправді не піклувався про Пі. Для мене це просто інше число. Значення не в самому числі чи 10 терабайт непотрібних цифр, це методи , які використовуються для його досягнення. Століття математики та десятиліття досліджень у галузі комп’ютера / програмування, які сприяли цьому подвигу, застосовні до багатьох інших сфер, і тому набагато цінніші, ніж жорсткий диск цифр. Простіше кажучи: обчислення цифр Пі - це більше спорт.
Містичний

8
@Mystical, щойно натрапив на ваш веб-сайт з підрахунку Pi з іншого запитання про stackoverflow, і не міг не стрибати і хихикати з того, що ви робили. Полюблені невдачі / землетруси в колодах :) чисто дивовижні!
Джо

48

Безперечно, для ваших цілей (які я припускаю, що це лише вправа програмування), найкраще перевірити результати проти будь-якого з переліків цифр пі в Інтернеті.

І як ми можемо знати, що ці значення є правильними? Ну, я можу сказати, що існують інформатики, які дозволяють довести, що реалізація алгоритму є правильною.

Більш прагматично, якщо різні люди використовують різні алгоритми, і всі вони погоджуються (вибирають число) тисячу (мільйон, незалежно від) десяткових знаків, це повинно дати вам тепле нечітке відчуття, що вони правильно зрозуміли.

Історично Вільям Шенкс опублікував пі на 707 знаків після коми у 1873 році. Бідний хлопець, він допустив помилку, починаючи з 528-го десяткового знаку.

Дуже цікаво, що в 1995 році був опублікований алгоритм, який мав властивість безпосередньо обчислювати n-й розряд (база 16) пі, не обчислюючи всі попередні цифри !

Нарешті, я сподіваюся, що ваш початковий алгоритм не був. pi/4 = 1 - 1/3 + 1/5 - 1/7 + ...Це може бути найпростішим у програмі, але це також один із найповільніших способів зробити це. Перегляньте статтю pi у Вікіпедії для більш швидких підходів.


7
Остання остання формула (формула Лейбніца, iirc) насправді чергує додавання та віднімання.
Томас

21

Ви можете використати кілька підходів і побачити, чи вони сходяться на одну і ту ж відповідь. Або схопити трохи з 'мережі. Алгоритм Чудновського зазвичай використовується як дуже швидкий метод обчислення пі. http://www.craig-wood.com/nick/articles/pi-chudnovsky/


Знижує шанси, але я все ще не можу бути впевнений у вирішенні кількох підходів, що робити, якщо обидва помиляються. Перевірка в мережі не відповідає дійсності, то чому б не зняти самі значення з мережі. Я думаю про bbp, який з них більше підходить?
Ішан Шарма

7
@IshanSharma Якщо два алгоритми є незалежними, то шанси на те, що обидва обчислення не відповідають однаковим результатам, майже дорівнюють нулю. Якщо в будь-якому обчисленні щось піде не так, кінцеві результати не збігаються - тож ви знаєте, що принаймні один із них невірний.
Містичний

15

Серія Тейлора - це один із способів наближення пі. Як зазначалося, воно сходить повільно.

Часткові суми ряду Тейлора можуть бути показані в межах деякого множника наступного доданку від істинного значення pi.

Інші засоби наближення pi мають аналогічні способи обчислення максимальної помилки.

Ми це знаємо, тому що можемо це довести математично.


Відряджений. Я думаю, що більшість відповідей тут просто не приділяє майже достатньої ваги концепції математичного доказування . Яка б ваша програма не була для обчислення цифр пі, це ніколи не буде більш переконливим, ніж самий переконливий математичний доказ того, що метод вашої програми дійсно обчислює пі. Що говорить про інше обмеження для програм, які pi обчислюють pi: що вони повинні прагнути стільки ж до зрозумілості, скільки продуктивності та коректності.
Луїс Касільяс

5

Ви можете спробувати обчислити sin(pi/2)(або cos(pi/2)з цього приводу), використовуючи (досить) швидко зближуються силові ряди для sin та cos. (Ще краще: використовуйте різні формули подвоєння, щоб обчислити ближче x=0для швидшого зближення.)

BTW, краще, ніж використовувати серію для, tan(x)це, якщо обчислити скажімо, cos(x)як чорну скриньку (наприклад, ви можете використовувати серію Тейлора, як описано вище), - це зробити кореневу пошук через Ньютона. Там, звичайно, є кращі алгоритми, але якщо ви не хочете перевіряти багато цифр, цього має бути достатньо (і це не так складно для реалізації, і вам потрібно лише трохи обчислення, щоб зрозуміти, чому це працює.)


6
Я не зовсім розумію, як це допоможе визначити, що 1000-та цифра відключена на 1. Вам знадобляться дуже точні значення, sin(pi/2)чи не так?
Матьє М.

Я не впевнений, що сказати про попередню відповідь, якщо це не жарт чи щось таке. sin (pi / 2) = 1 cos (pi / 2) = 0 Отже, я б сказав, що ті впевнені швидко сходяться.
BentFranklin

15
Я думаю, не всім очевидно, що оцінювати sin(x)та cos(x)з високою точністю насправді набагато складніше, ніж обчислення самого Пі.
Містичний

2
Зі зрозумілих причин, ви не повинні використовувати для цього гріх (pi / 2). Краще замість цього використати гріх (pi / 6) і переконатися, що він виходить рівно 1/2.
Роберт Лозиняк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.