Вдохновлен этим видео из серии Infinite .
Введение
Пи определяется как отношение длины окружности к диаметру круга. Но как определяется круг? Обычно круг определяется как точки с постоянным расстоянием до центральной точки (предположим, что центр находится в (0,0)
). Следующий вопрос будет таким: как мы определим расстояние ? Далее мы рассматриваем различные понятия расстояний (индуцированные Lp
-нормами):
Учитывая норму (= то, что измеряет длину ), мы можем легко построить расстояние (= расстояние между двумя точками) следующим образом:
dist(A,B) := norm (A-B)
Евклидова норма определяется как:
norm((x,y)) = (x^2 + y^2)^(1/2)
Это также называется L2-нормой . Другие Lp-нормы строятся путем замены 2
в приведенной выше формуле другими значениями от 1 до бесконечности:
norm_p((x,y)) = (|x|^p + |y|^p)^(1/p)
Единичные круги для этих разных норм имеют совершенно разные формы:
Вызов
Учитывая a p >= 1
, вычислите отношение длины окружности к диаметру Lp-окружности относительно Lp
-нормы с точностью до четырех значащих цифр.
Testcases
Мы можем использовать это для p,q
с 1 = 1/p + 1/q
мы получаем то же самое соотношение Lp
как для Lq
нормы, так и для нормы. Кроме того, для p = q = 2
отношения является минимальным, и для p = 1, q = infinity
мы получаем соотношение 4, поэтому отношения всегда между pi
и 4
.
p or q ratio
1 infinity 4
2 2 3.141592
1.623 2.60513 3.200
1.5 3 3.25976
4 1.33333 3.39693
A = πr²
) не подходит дляp ≠ 2
Ответы:
Python + scipy, 92 байта
Формула из этого математического вопроса .
источник
x=1
том, как ваша заявка делает?MATL , 31 байт
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
Это создает координаты x , y одной четверти единичного круга, отобранного в 1001 точке с шагом 0,001 в x . Длина четверти круга аппроксимируется длиной многоугольной линии, проходящей через эти точки; то есть сумма длин 1000 сегментов. Длина, конечно, рассчитывается в соответствии с
p
-norm. Умножение результата на 2 дает приблизительную длину полукруга, то есть пи.источник
Mathematica,
4946 байтов3 байта сохранены благодаря алефалии .
Анонимная функция. Принимает число в качестве ввода и возвращает число в качестве вывода.
источник
2NIntegrate[(1+(a^-#-1)^(1-#))^(1/#),{a,0,1}]&
PARI / GP,
4843 байтаЭто легко после того, как @orlp нашел формулу, а версия @ alephalpha экономит 5 байтов:
Чтобы добавить что-то немного полезное, давайте посчитаем,
p
для чего мы получаем3.2
:Правильное использование
Хотя код дает результаты, которые намного точнее, чем требует задача, его легко можно значительно улучшить: если мы заменим верхний предел интеграции
1
на[1,1/p-1]
(давая то, что в руководстве называется показателем сингулярности), то все показанные цифры будутf(2)
совпадатьPi
. Это все еще верно, если мы увеличим точность до 100 (тип\p100
).Однако после этого изменения
solve
вычисления перестали работать. Я изменил внутренний термин, чтобы явно обрабатывать случай,u=0
а также изменил на другой компьютер с более новой версией PARI и 64-битной (что подразумевает более высокую точность по умолчанию).Вот улучшенный расчет
p
значения дляPi=3.2
, и давайте также посмотрим на реальный Pi:источник
p->2*intnum(u=0,1,(1+(u^-p-1)^(1-p))^(1/p))
JavaScript (ES7), 80 байт
Основано на ответе orlp . Эта реализация JS довольно медленная. Вы можете попробовать
i=1e-7
(или даже выше) для более быстрого приближения.Примечание : это в основном предназначено только для Chrome и Edge. Эквивалентная версия ES6, используемая
Math.pow()
в Firefox 50.1, кажется намного медленнее.Изменить : По словам Нила, это также должно работать на Firefox 52.
источник