Beregn 500 sifre pi

Skriv et program for å beregne de første 500 sifrene i pi, og oppfyll reglene nedenfor:

  • Det må være mindre enn 500 tegn.
  • Det kan ikke inneholde «pi», «math.pi» eller lignende pi-konstanter, og det kan heller ikke ringe en biblioteksfunksjon for å beregne pi.
  • Det kan hende at det ikke brukes sifrene «3», «1» og «4» etter hverandre.
  • Den må kjøres på en rimelig tid (under 1 minutt) på en moderne datamaskin.

Det korteste programmet vinner.

Kommentarer

  • For å sjekke om sifrene dine stemmer: eveandersson.com/pi/digits
  • Har vi lov til å skrive ut mer enn 500 sifre med tap av nøyaktighet etter de første 500?
  • @Alexandru, I antar det, men jeg foretrekker å se det avkortet.
  • Kan vi bruke et HTTP-bibliotek til å laste ned » sifre i pi » nettsted? 😉
  • Kom hit i håp om å få noe hyggelig og kortfattet for å generere vilkårlige tilnærminger av pi i python … dessverre @Soulman ‘ s pythonløsning er tilsynelatende innstilt på 500 sifre; å erstatte 500 med 1000 gir feil svar. Jeg lurer på om det er en god måte å formulere en alternativ utfordring som vil gi en fin kort funksjon som generelt er nyttig for å generere et vilkårlig antall sifre?

Svar

Golfscript – 29 tegn

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

Jeg legger ut analyse senere

Kommentarer

  • Kan du forklare hvordan dette fungerer?
  • » Jeg legger ut analyse senere «. (venter i 3 år) ….
  • » Jeg legger ut analyse senere » * venter på mer enn 6 år *
  • » Jeg legger ut analyse senere » (venter i 8 år)
  • Venter fortsatt …

Svar

Mathematica (34 tegn): (uten «juks» med trig)

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

Så, for å forklare magien her:
Integrate[function, lower, upper] gir deg området under kurven «funksjon» fra «nedre» til «øvre». I dette tilfellet er den funksjonen [1-x^2]^.5, som er en formel som beskriver den øverste halvdelen av en sirkel med radius 1. Fordi sirkelen har en radius på 1, eksisterer den ikke i verdier x lavere enn -1 eller høyere enn 1. Derfor finner vi arealet til halvparten av en sirkel. Når vi multipliserer med 2, får vi området inne i en sirkel med radius 1, som er lik pi.

Kommentarer

  • Kanskje du bør legge inn, i svaret ditt, en forklaring på hvorfor dette fungerer (for dem som ikke er matte).
  • fantastisk idé. Jeg vil sørge for det for øyeblikket. Jeg ‘ Jeg gir en grunnleggende forklaring på matematikken.
  • Kanskje du kan forkorte den: endre sqrt[1-x^2] til (1-x^2)^.5)
  • og jeg kan fjerne * etter 2. Mathematica er fantastisk.

Svar

Python (83 tegn)

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 

Svar

Husk , 28 25 24 byte

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

Prøv det online!

Beregner verdien av pi som et rasjonelt tall ved hjelp av de første 5000 begrepene i den uendelige serien 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))), og trekker deretter ut de første 500 sifrene.

Koden for å beregne verdien av pi fra et spesifisert antall vilkår er bare 13 byte (Σ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 

Dessverre trenger vi da å kaste bort 3 byte ved å spesifisere nummeret av vilkår som skal brukes:

□70 # 70^2 = 4900 

Og deretter 8 byte til som konverterer det rasjonelle tallet (uttrykt som en brøk) til sifrene i desimalform:

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

Svar

PARI / GP, 14

\p500 acos(-1) 

Du kan unngå trig ved å erstatte andre linje med

gamma(.5)^2 

eller

(6*zeta(2))^.5 

eller

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

eller

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

eller

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

Svar

Python3 136

Bruker Madhava «s formel.

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

Bruker dette formel.

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

Svar

Mathematica (17 byte)

N[ArcCos[-1],500] 

Gyldighetsbevis .

Svar

Pyth , 21

u+/*GHhyHy^T500r^3T1Z 

Bruker denne algoritmen: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) funnet i kommentarene til Golfscript-svaret.

Kommentarer

  • Dette ‘ t fortjener en nedstemning …
  • Dette svaret er feil, det genererer 34247779. .. som, så vidt jeg vet, ikke er pi.
  • @orlp r operasjonen ble nylig endret på en måte som brøt dette svaret. Endre 1 til 0, så fungerer den i gjeldende Pyth.

Svar

JavaScript, 60 byte

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

Prøv det online!

Kommentarer

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

Svar

bc -l (22 = 5 kommandolinje + 17 program)

scale=500 4*a(1) 

Kommentarer

  • Reglene sier » og kan heller ikke kalle en biblioteksfunksjon for å beregne pi. »
  • @Peter Problemet antar jeg at » biblioteksfunksjon » er ikke alltid et godt definert begrep, og det blir bare verre når du sier » for å beregne Pi «, som du kan bruke den til å beregne mellomresultater, for eksempel Sqrt () i Alexandru

    s svar.

  • Jeg tror dette er juks fordi atan beregner 1/4 pi, men det er likevel en interessant løsning.
  • @Thomas O : hvis dette er juks, hvor ‘ er grensen?
  • trig-funksjoner burde ha vært forbudt på grunn av svar som dette. ideen er å beregne pi med en algoritme, ikke en innebygd funksjon. sqrt er litt annerledes da det ‘ ikke er en trig-funksjon.

Svar

Mathematica – 50

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

Svar

Java 10 , 208 207 206 193 byte

 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 byte takket være @ceilingcat .

Prøv det online .

Eller som fullt program (245 byte):

 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));}}  

Prøv det online.

Svar

Axiom, 80 byte

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

for referanse https://tuts4you.com/download.php?view.452 ; det ville være en approssimering til 6 * arctg (1 / sqrt (3)) =% pi og den ville bruke serieutvidelse for 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 

Svar

05AB1E , 20 byte

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

Port til mitt Java-svar (med 503 erstattet med 1000 – alt \ $ \ geq503 \ $ er greit å sende ut den første 500 sifre nøyaktig med denne tilnærmingen).

Prøv det online eller bekreft det » er lik de første 500 sifrene i PI ved hjelp av den innebygde žs .

Forklaring:

 ₄° # 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)  

Svar

Fortran, 154 byte

Blandet rosetta code løsning. Lagrede mange byte ved å bruke implisitte heltall i j k l m n, print i stedet for write, og blande ting rundt

Prøv det online …

 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  

Svar

APL (NARS2000), 20 byte

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

Jeg har ikke klart å teste dette, men her «er en versjon i Dyalog APL. Den eneste forskjellen mellom dem er suffikset » x «, som brukes til rasjonelle tall i NARS2000, men som ikke er tilgjengelig i Dyalog (eller andre varianter tilgjengelig online, så vidt jeg vet).

Den er basert på pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) formelen i kommentarene under det aksepterte Golfscript-svaret.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *