Calcular 500 dígitos de pi


25

Escreva um programa para calcular os primeiros 500 dígitos do pi, atendendo às regras abaixo:

  • Ele deve ter menos de 500 caracteres.
  • Ele não pode incluir constantes "pi", "math.pi" ou pi semelhantes, nem pode chamar uma função de biblioteca para calcular pi.
  • Não pode usar os dígitos "3", "1" e "4" consecutivamente.
  • Ele deve ser executado em um tempo razoável (menos de 1 minuto) em um computador moderno.

O programa mais curto vence.


Para verificar se seus dígitos estão corretos: eveandersson.com/pi/digits
Nellius

É permitido imprimir mais de 500 dígitos com perda de precisão após os primeiros 500?
Alexandru

@ Alexandru, suponho que sim, mas eu preferiria vê-lo truncado.
Thomas O

@ Joey nenhuma função de biblioteca PARA CALCULAR O PI - Eu diria que você pode usar qualquer coisa das bibliotecas, exceto a constante / função do PI.
Aurel Bílý

1
Podemos usar uma biblioteca HTTP para baixar um site "digits of pi"? ;-)
dan04 17/02

Respostas:


11

Golfscript - 29 caracteres

6666,-2%{2+.2/@*\/9)499?2*+}*

Postarei a análise mais tarde


5
Você poderia explicar como isso funciona?
Thomas O

65
"Vou postar a análise mais tarde". (aguarda 3 anos) .... #
2626 Justin Justin

14
"Vou publicar a análise mais tarde" * aguarda mais de 6 anos *
Erik the Outgolfer

1
@EriktheOutgolfer eu ia postar isso. : P
Christopher

1
"Postarei a análise mais tarde" (aguarda 8 anos)
Jono 2906

8

Mathematica (34 caracteres): (sem "trapaça" com trig)

N[2Integrate[[1-x^2]^.5,-1,1],500]

Então, para explicar a mágica aqui:
Integrate[function, lower, upper]fornece a área sob a curva "função" de "inferior" a "superior". Nesse caso, essa função é [1-x^2]^.5, que é uma fórmula que descreve a metade superior de um círculo com raio 1. Como o círculo possui um raio de 1, ele não existe para valores de x menores que -1 ou maiores que 1. Portanto, estamos encontrando a área de metade de um círculo. Quando multiplicamos por 2, obtemos a área dentro de um círculo de raio 1, que é igual a pi.


Talvez você deva inserir, em sua resposta, uma explicação de por que isso funciona (para pessoas que não são de matemática).
26714 Justin

ideia maravilhosa. Vou cuidar disso agora. Vou dar uma explicação básica da matemática envolvida.
Stack Tracer

Talvez você possa abreviá-lo: mude sqrt[1-x^2]para(1-x^2)^.5)
Justin

e posso remover o * após o 2. Mathematica é maravilhoso.
Pilha Tracer

4

Python (83 caracteres)

P=0
B=10**500
i=1666
while i:d=2*i+1;P=(P*i%B+(P*i/B+3*i)%d*B)/d;i-=1
print'3.%d'%P

3

PARI / GP, 14

\p500
acos(-1)

Você pode evitar triggers, substituindo a segunda linha por

gamma(.5)^2

ou

(6*zeta(2))^.5

ou

psi(3/4)-psi(1/4)

ou

4*intnum(x=0,1,(1-x^2)^.5)

ou

sumalt(k=2,(-1)^k/(2*k-3))*4

2

bc -l (22 = 5 linha de comando + 17 programa)

scale=500
4*a(1)

5
As regras dizem "nem pode chamar uma função de biblioteca para calcular pi".
Peter Taylor

@ Peter O problema, eu acho, é que "função de biblioteca" nem sempre é um termo bem definido, e só piora quando você diz "calcular Pi", pois você pode usá-lo para calcular resultados intermediários, por exemplo, Sqrt () na resposta de Alexandru.
Dr. belisarius

Eu acho que isso é trapaça, porque o atan calcula 1/4 pi, mas é uma solução interessante.
Thomas O

1
@ Thomas O: se isso é trapaça, onde está o limite?
JB


1

Python3 136

Usa a fórmula de Madhava .

from decimal import *
D=Decimal
getcontext().prec=600
p=D(3).sqrt()*sum(D(2-k%2*4)/3**k/(2*k+1)for k in range(1100))
print(str(p)[:502])

Python3 164

Usa esta fórmula.

from decimal import *
D=Decimal
getcontext().prec=600
p=sum(D(1)/16**k*(D(4)/(8*k+1)-D(2)/(8*k+4)-D(1)/(8*k+5)-D(1)/(8*k+6))for k in range(411))
print(str(p)[:502])

1

Mathematica - 50

½ = 1/2; 2/Times @@ FixedPointList[(½ + ½ #)^½~N~500 &, ½^½]

1

Pyth , 21

u+/*GHhyHy^T500r^3T1Z

Usa este algoritmo: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...))))encontrado nos comentários da resposta Golfscript.


Isso não merece um voto negativo ...
Decay Beta 26/10

Esta resposta está incorreta, gera 34247779 ... que, pelo que sei, não é pi.
orlp

@orlp A roperação foi alterada recentemente de uma maneira que quebrou esta resposta. Altere 1para a 0e funcionará no Pyth atual.
Isaacg

0

Axioma, 80 bytes

digits(503);v:=1./sqrt(3);6*reduce(+,[(-1)^k*v^(2*k+1)/(2*k+1)for k in 0..2000])

para referência https://tuts4you.com/download.php?view.452 ; seria uma estimativa para 6 * arctg (1 / sqrt (3)) =% pi e usaria a expansão da série para arctg

  3.1415926535 8979323846 2643383279 5028841971 6939937510 5820974944 592307816
  4 0628620899 8628034825 3421170679 8214808651 3282306647 0938446095 505822317
  2 5359408128 4811174502 8410270193 8521105559 6446229489 5493038196 442881097
  5 6659334461 2847564823 3786783165 2712019091 4564856692 3460348610 454326648
  2 1339360726 0249141273 7245870066 0631558817 4881520920 9628292540 917153643
  6 7892590360 0113305305 4882046652 1384146951 9415116094 3305727036 575959195
  3 0921861173 8193261179 3105118548 0744623799 6274956735 1885752724 891227938
  1 8301194913 01

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.