Calcule 500 dígitos de pi

Escriba un programa para calcular los primeros 500 dígitos de pi, cumpliendo las siguientes reglas:

  • Debe tener menos de 500 caracteres de longitud.
  • No puede incluir «pi», «math.pi» o constantes pi similares, ni puede llamar a una función de biblioteca para calcular pi.
  • No puede usar los dígitos «3», «1» y «4» consecutivamente.
  • Debe ejecutarse en un tiempo razonable (menos de 1 minuto) en una computadora moderna.

El programa más corto gana.

Comentarios

  • Para verificar si sus dígitos son correctos: eveandersson.com/pi/digits
  • ¿Se nos permite imprimir más de 500 dígitos con pérdida de precisión después de los primeros 500?
  • @Alexandru, I supongo que sí, pero preferiría verlo truncado.
  • ¿Podemos usar una biblioteca HTTP para descargar un » dígitos de pi » sitio web? 😉
  • Vine aquí con la esperanza de obtener algo agradable y conciso para generar aproximaciones de longitud arbitraria de pi en python … desafortunadamente, la solución de Python de @Soulman ‘ es aparentemente sintonizado para 500 dígitos; reemplazar 500 con 1000 da una respuesta incorrecta. Me pregunto si hay una buena manera de formular un desafío alternativo que produzca una función corta agradable que sea generalmente útil para generar un número arbitrario de dígitos.

Respuesta

Golfscript – 29 caracteres

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

Publicaré el análisis más tarde

Comentarios

  • ¿Podrías explicar cómo funciona esto?
  • » Publicaré el análisis más tarde «. (espera 3 años) ….
  • » Publicaré el análisis más tarde » * espera más de 6 años *
  • » Publicaré el análisis más tarde » (espera 8 años)
  • Todavía esperando …

Responder

Mathematica (34 caracteres): (sin «hacer trampa» con trig)

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

Entonces, para explicar la magia aquí:
Integrate[function, lower, upper] le da el área bajo la curva «función» de «inferior» a «superior». En este caso, esa función es [1-x^2]^.5, que es una fórmula que describe la mitad superior de un círculo con radio 1. Debido a que el círculo tiene un radio de 1, no existe para valores de x menores que -1 o mayores que 1. Por lo tanto, estamos encontrando el área de la mitad de un círculo. Cuando multiplicamos por 2, obtenemos el área dentro de un círculo de radio 1, que es igual a pi.

Comentarios

  • Quizás debe insertar, en su respuesta, una explicación de por qué esto funciona (para ellos, gente que no es matemática).
  • maravillosa idea. Me ocuparé de ello ahora mismo. ‘ daré una explicación básica de las matemáticas involucradas.
  • Tal vez puedas acortarlo: cambia sqrt[1-x^2] a (1-x^2)^.5)
  • y puedo eliminar el * después del 2. Mathematica es maravilloso.

Respuesta

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 

Respuesta

Husk , 28 25 24 bytes

i*!500İ⁰ΣG*2mṠ/o!İ1→ḣ□70 

¡Pruébelo en línea!

Calcula el valor de pi como un número racional usando los primeros 5000 términos de la serie infinita 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))), y luego extrae los primeros 500 dígitos.

El código para calcular el valor de pi a partir de un número específico de términos tiene solo 13 bytes (ΣG*2mṠ/o!İ1→ḣ):

ΣG*2mṠ/o!İ1→ḣ Σ # the sum of G*2 # the cumulative product, starting at 2, of m # mapping the following function to all terms of ḣ # series from 1 to ... (whatever number is specified) Ṡ/ # divide by x o! → # element at index -1 İ1 # of series of odd numbers 

Desafortunadamente, necesitamos desperdiciar 3 bytes especificando el número de términos a utilizar:

□70 # 70^2 = 4900 

Y luego 8 bytes más convirtiendo el número racional (expresado como una fracción) en sus dígitos en forma decimal:

i*!500İ⁰ i # integer value of * # multiplying by !500 # 500th element of İ⁰ # series of powers of 10 

Respuesta

PARI / GP, 14

\p500 acos(-1) 

Puede evitar trigonométricas reemplazando la segunda línea con

gamma(.5)^2 

o

(6*zeta(2))^.5 

o

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

o

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

o

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

Respuesta

Python3 136

Utiliza Madhava «s fórmula.

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

Utiliza esto 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]) 

Respuesta

Mathematica (17 bytes)

N[ArcCos[-1],500] 

Prueba de validez .

Respuesta

Pyth , 21

u+/*GHhyHy^T500r^3T1Z 

Utiliza este algoritmo: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) que se encuentra en los comentarios de la respuesta de Golfscript.

Comentarios

  • Esto no ‘ no merece un voto negativo …
  • Esta respuesta es incorrecta, genera 34247779. .. que, que yo sepa, no es pi.
  • @orlp La operación r se cambió recientemente de una manera que rompió esta respuesta. Cambie 1 a 0 y funcionará en Pyth actual.

Respuesta

JavaScript, 60 bytes

i=1n;p=x=3n*(10n**520n);while(x=x*i/(i*4n+4n)){i+=2n;p+=x/i} 

¡Pruébelo en línea!

Comentarios

  • 62 bytes: for(i=1n,p=x=3n*(10n**520n);x>0;x=x*i/(i*4n+4n),p+=x/(i+=2n));

Respuesta

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

scale=500 4*a(1) 

Comentarios

  • Las reglas dicen » ni pueden llamar a una función de biblioteca para calcular pi. »
  • @Peter El problema, supongo, es que » función de biblioteca » no siempre es un término bien definido, y solo empeora cuando dices » para calcular Pi «, ya que puede usarlo para calcular resultados intermedios, por ejemplo Sqrt () en Alexandru

    s respuesta.

  • Creo que esto es una trampa porque atan calcula 1/4 pi, pero de todos modos es una solución interesante.
  • @Thomas O : si esto es trampa, ¿dónde ‘ es el límite?
  • Las funciones trigonométricas deberían haberse prohibido debido a respuestas como esta. la idea es calcular pi con un algoritmo, no con una función incorporada. sqrt es un poco diferente ya que ‘ no es una función trigonométrica.

Responder

Mathematica – 50

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

Respuesta

Java 10 , 208 207 206 193 bytes

 n->{var t=java.math.BigInteger.TEN.pow(503).shiftLeft(1);var p=t;for(int i=1;t.compareTo(t.ZERO)>0;p=p.add(t=t.multiply(t.valueOf(i)).divide(t.valueOf(i-~i++))));return(p+"").substring(0,500);}  

-14 bytes gracias a @ceilingcat .

Pruébelo en línea .

O como programa completo (245 bytes):

 interface M{static void main(String[]a){var t=java.math.BigInteger.TEN;var p=t=t.pow(503).shiftLeft(1);for(int i=1;t.compareTo(t.ZERO)>0;p=p.add(t))t=t.multiply(t.valueOf(i)).divide(t.valueOf(i-~i++));System.out.print((p+"").substring(0,500));}}  

Pruébelo en línea.

Respuesta

Axiom, 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 referencia https://tuts4you.com/download.php?view.452 ; sería una aproximación a 6 * arctg (1 / sqrt (3)) =% pi y usaría expansión de serie 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 

Respuesta

05AB1E , 20 bytes

₄°·D.ΓN>*N·3+÷}O+₄;£ 

Puerto de mi respuesta de Java (con 503 reemplazado con 1000 – cualquier cosa \ $ \ geq503 \ $ está bien para generar la primera 500 dígitos con precisión con este enfoque).

Pruébelo en línea o verifíquelo » s igual a los primeros 500 dígitos de PI usando la žs incorporada.

Explicación:

 ₄° # Push 10**1000 · # Double it to 2e1000 D # Duplicate it .Γ # Loop until the result no longer changes, # collecting all intermediate results # (excluding the initial value unfortunately) N> # Push the 0-based loop-index, and increase it by 1 to make it 1-based * # Multiply this 1-based index to the current value N· # Push the 0-based index again, and double it 3+ # Add 3 to it ÷ # Integer-divide the (index+1)*value by this (2*index+3) }O # After the cumulative fixed-point loop: sum all values in the list + # Add the 2e1000 we"ve duplicated, which wasn"t included in the list ₄; # Push 1000, and halve it to 500 £ # Leave the first 500 digits of what we"ve calculated # (after which it is output implicitly as result)  

Respuesta

Fortran, 154 bytes

Destrozado solución de código Rosetta . Se guardaron muchos bytes usando enteros implícitos i j k l m n, print en lugar de write, y mezclando cosas alrededor

Pruébelo en línea …

 integer,dimension(3350)::v=2;x=1E5;j=0 do n=1,101;do l=3350,1,-1 m=x*v(l)+i*l;i=m/(2*l-1);v(l)=m-i*(2*l-1);enddo k=i/x;print"(I5.5)",j+k;j=i-k*x;enddo end  

Respuesta

APL (NARS2000), 20 bytes

{2+⍵×⍺÷1+⍨2×⍺}/⍳7e3x 

No he podido probar esto, pero aquí una versión en Dyalog APL. La única diferencia entre ellos es el sufijo » x «, que se usa para números racionales en NARS2000 pero no está disponible en Dyalog (o otras variantes disponibles en línea, hasta donde yo sé).

Se basa en la fórmula pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) en los comentarios debajo de la respuesta aceptada de Golfscript.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *