Inspirado por este vídeo da série Infinite .
Introdução
Pi é definido como a razão da circunferência para o diâmetro de um círculo. Mas como um círculo é definido? Normalmente, um círculo é definido como os pontos com distância constante ao ponto central (suponhamos que o centro esteja (0,0)
). A próxima pergunta seria: como definimos a distância ? A seguir, estamos considerando diferentes noções de distâncias (induzidas pelas Lp
-norms):
Dada uma norma (= algo que mede um comprimento ), podemos facilmente construir uma distância (= distância entre dois pontos) da seguinte maneira:
dist(A,B) := norm (A-B)
A norma euclidiana é dada por:
norm((x,y)) = (x^2 + y^2)^(1/2)
Isso também é chamado de norma L2 . As outras normas Lp são construídas substituindo 2
na fórmula acima por outros valores entre 1 e infinito:
norm_p((x,y)) = (|x|^p + |y|^p)^(1/p)
Os círculos unitários para essas diferentes normas têm formas bastante distintas:
Desafio
Dado a p >= 1
, calcule a razão da circunferência para o diâmetro de um círculo Lp em relação à Lp
-norm com uma precisão de quatro algarismos significativos.
Casos de teste
Podemos usar isso para p,q
com 1 = 1/p + 1/q
nós começamos a mesma relação para o Lp
bem como a Lq
norma. Além disso, para p = q = 2
a relação é mínima, e para p = 1, q = infinity
obtermos uma relação de 4, as relações estão sempre entre pi
e 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²
) não é válida parap ≠ 2
Respostas:
Python + scipy, 92 bytes
Fórmula é a partir desta questão math.SE .
fonte
x=1
, como é que a sua submissão é realizada?MATL , 31 bytes
Experimente online! Ou verifique todos os casos de teste .
Explicação
Isso gera as coordenadas x , y de um quarto do círculo unitário amostrado em 1001 pontos com a etapa 0,001 em x . O comprimento do quarto de círculo é aproximado pelo da linha poligonal que passa por esses pontos; isto é, a soma dos comprimentos dos 1000 segmentos. Naturalmente, o comprimento é calculado de acordo com
p
-norm. Multiplicar o resultado por 2 fornece o comprimento aproximado de meio círculo, ou seja, pi.fonte
Mathematica,
4946 bytes3 bytes salvos devido a alefalpha .
Função anônima. Pega um número como entrada e retorna um número como saída.
fonte
2NIntegrate[(1+(a^-#-1)^(1-#))^(1/#),{a,0,1}]&
PARI / GP,
4843 bytesÉ fácil depois que o @orlp encontra a fórmula e a versão do @ alephalpha salva 5 bytes:
Para adicionar algo um pouco útil, vamos calcular o
p
que obtemos3.2
:Modo de usar correto
Enquanto o código fornece resultados muito mais precisos do que o desafio exige, ele pode ser facilmente aprimorado muito: se substituirmos o limite superior de integração
1
por[1,1/p-1]
(fornecendo o que o manual chama de expoente de singularidade), todos os dígitos mostradosf(2)
concordamPi
. Isso ainda é verdade se aumentarmos a precisão para 100 (tipo\p100
).No entanto, após essa alteração, o
solve
cálculo não funcionou mais. Alterei o termo interno para lidar explicitamente com o casou=0
e também mudei para um computador diferente com uma versão mais nova do PARI e 64 bits (o que implica uma precisão padrão mais alta).Aqui está o cálculo aprimorado do
p
valor paraPi=3.2
, e também vamos dar uma olhada no Pi real:fonte
p->2*intnum(u=0,1,(1+(u^-p-1)^(1-p))^(1/p))
JavaScript (ES7), 80 bytes
Com base na resposta do orlp . Essa implementação de JS é bastante lenta. Você pode tentar
i=1e-7
(ou até mais) uma aproximação mais rápida.Nota : Isso se destina basicamente apenas ao Chrome e Edge. Uma versão equivalente do ES6 usada
Math.pow()
no Firefox 50.1 parece ser muito mais lenta.Edit : De acordo com Neil, isso também deve funcionar bem no Firefox 52.
fonte