Литвек - электронная библиотека >> Елисеев Д >> Математика и др. >> Рассказы о математике с примерами на языках Python и C >> страница 3
потратив 20 лет, вычислил Пи до 707 знака, однако он так и не узнал, что в 520-м знаке допустил ошибку и все последние годы вычислений оказались напрасны (в итерационных алгоритмах хоть одна ошибка делает все дальнейшие шаги бесполезными).


Что мы знаем о числе Пи сегодня? Действительно, это число весьма интересно:

Число Пи является иррациональным: оно не может быть выражено с помощью дроби вида m/n. Это было доказано только в 1761 году.

Число Пи является трансцендентным: оно не является корнем какого-либо уравнения с целочисленными коэффициентами. Это было доказано в 1882 году.

Число Пи является бесконечным.

Интересное следствие предыдущего пункта: в числе Пи можно найти практически любое число, например свой собственный номер телефона, вопрос лишь в длине последовательности которую придется просмотреть. Можно подтвердить, что так и есть: скачав архив с 10 миллионами знаков числа Пи, я нашел в нем свой номер телефона, номер телефона квартиры где я родился, и номер телефона своей супруги. Но разумеется, никакой “магии” тут нет, лишь теория вероятности. Можно взять любую другую случайную последовательность чисел такой же длины, в ней также найдутся любые заданные числа.


И наконец, перейдем к формулам вычисления Пи, т.к. именно в них можно увидеть красоту числовых взаимосвязей - то, чем интересна математика.


Формула Лю-Хуэя (3й век):

Рассказы о математике с примерами на языках Python и C. Иллюстрация № 1


Формула Мадхавы-Лейбница (15 век):

Рассказы о математике с примерами на языках Python и C. Иллюстрация № 2


Формула Валлиса (17 век):

Рассказы о математике с примерами на языках Python и C. Иллюстрация № 3


Формула Мэчина (18 век):

Рассказы о математике с примерами на языках Python и C. Иллюстрация № 4


Попробуем вычислить число Пи по второй формуле. Для этого напишем простую программу на языке Python:

sum = 0.0

sign = 1

for p in range(0,33):

sum += 4.0*sign/(1+2*p)

print (p,sum)

      sign = -sign


Запустим программу в любом онлайн-компиляторе языка Питон (например https://repl.it/languages/python3). Получаем результат:

Шаг      Значение

0       4.0


1       2.666666666666667


2       3.466666666666667


3       2.8952380952380956


4       3.3396825396825403


5       2.9760461760461765


6       3.2837384837384844


7       3.017071817071818


8       3.2523659347188767


9       3.0418396189294032


10       3.232315809405594


11       3.058402765927333


12       3.2184027659273333


13       3.0702546177791854


14       3.208185652261944


15       3.079153394197428


16       3.200365515409549


17       3.0860798011238346


18       3.1941879092319425


19       3.09162380666784


20       3.189184782277596


21       3.0961615264636424


22       3.1850504153525314


23       3.099944032373808


24       3.1815766854350325


25       3.1031453128860127


26       3.1786170109992202


27       3.1058897382719475


28       3.1760651768684385


29       3.108268566698947


30       3.1738423371907505


31       3.110350273698687

32       3.1718887352371485


Как можно видеть, сделав 32 шага алгоритма, мы получили лишь 2 точных знака. Видно что алгоритм работает, но количество вычислений весьма велико. Как известно, в 15м веке индийский астроном и математик Мадхава использовал более точную формулу, получив точность числа Пи в 11 знаков:

Рассказы о математике с примерами на языках Python и C. Иллюстрация № 5

Попробуем воспроизвести ее в виде программы, чтобы примерно оценить объем вычислений.


Первым шагом необходимо вычислить √12. Возникает резонный вопрос - как это сделать? Оказывается, уже в Вавилоне был известен метод вычисления квадратного корня, который сейчас так и называется “вавилонским”. Суть его в вычислении √S по простой формуле:

Рассказы о математике с примерами на языках Python и C. Иллюстрация № 6

Здесь x0 - любое приближенное значение, например для √12 можно взять 3.


Запишем формулу в виде программы:

from decimal import Decimal


print ("Квадратный корень:")

number = Decimal(12)

result = Decimal(3)

for p in range(1,9):

result = (result + number/result)/Decimal(2)

difference = result**2 - number

print (p, result, difference)

sqrt12 = result


Результаты весьма интересны:

Шаг      Значение             Погрешность

1       3.5                   0.25


2       3.464285714285714      0.00127


3       3.464101620029455      3.3890E-8


4       3.464101615137754      2.392873369E-17


Результат: √12 = 3.464101615137754


Как можно видеть, сделав всего 4 шага, можно получить √12 с достаточной точностью, задача вполне посильная даже для ручных расчетов 15 века.


Наконец, запрограммируем вторую часть алгоритма - собственно вычисление Пи.

sum = Decimal(1)

sign = -1

for p in range(1,32):

sum += Decimal(sign)/Decimal((2*p+1)*(3**p))

sign = -sign

print(p, sqrt12*sum)

print("Result:", sqrt12*sum)


Результаты работы программы:

Шаг       Значение

1       3.079201435678004077382126829


2       3.156181471569954179316680000


3       3.137852891595680345522738769


4       3.142604745663084672802649458


5       3.141308785462883492635401088


6       3.141674312698837671656932680


7       3.141568715941784242161823554


8       3.141599773811505839072149767


9       3.141590510938080099642754230


10       3.141593304503081513121460820


11       3.141592454287646300323593597


12       3.141592715020379765581606212


13       3.141592634547313881242713430


14       3.141592659521713638451335328


15       3.141592651733997585128216671


16       3.141592654172575339199092210


17       3.141592653406165187919674184


18       3.141592653647826046431202391


19       3.141592653571403381773710565


20       3.141592653595634958372427485


21       3.141592653587933449530974820


22       3.141592653590386522717511595


23       3.141592653589603627019680710


24       3.141592653589853940610143646


Уже на 24м шаге мы получаем искомые 11 знаков числа Пи. Задача явно требовала больше времени чем сейчас, но вполне могла быть решена в средние века.


Современные формулы не столь просты внешне, зато работают еще