Bereken 500 cijfers van pi

Schrijf een programma om de eerste 500 cijfers van pi te berekenen, waarbij je aan de onderstaande regels voldoet:

  • Het mag niet langer zijn dan 500 tekens.
  • Het mag geen “pi”, “math.pi” of soortgelijke pi-constanten bevatten, noch mag het een bibliotheekfunctie aanroepen om pi te berekenen.
  • Het mag de cijfers “3”, “1” en “4” niet opeenvolgend gebruiken.
  • Het moet binnen een redelijke tijd (minder dan 1 minuut) op een moderne computer worden uitgevoerd.

Het kortste programma wint.

Reacties

  • Om te controleren of je cijfers correct zijn: eveandersson.com/pi/digits
  • Mogen we meer dan 500 cijfers afdrukken met verlies van nauwkeurigheid na de eerste 500?
  • @Alexandru, I veronderstel van wel, maar ik zou het liever afgekapt zien.
  • Kunnen we een HTTP-bibliotheek gebruiken om ” cijfers van pi ” website? 😉
  • Kwam hier in de hoop iets aardigs en beknopters te krijgen voor het genereren van willekeurige lengtebenaderingen van pi in python … helaas @Soulman ‘ s python-oplossing is blijkbaar afgestemd op 500 cijfers; het vervangen van 500 door 1000 geeft een onjuist antwoord. Ik vraag me af of er een goede manier is om een alternatieve uitdaging te formuleren die een mooie korte functie zou opleveren die over het algemeen handig is voor het genereren van een willekeurig aantal cijfers?

Antwoord

Golfscript – 29 tekens

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

Ik zal de analyse later posten

Reacties

  • Kun je uitleggen hoe dit werkt?
  • ” Ik zal later een analyse posten “. (wacht 3 jaar) ….
  • ” Ik zal analyse later posten ” * wacht op meer dan 6 jaar *
  • ” Ik zal analyse later posten ” (wacht 8 jaar)
  • Wacht nog steeds …

Antwoord

Mathematica (34 tekens): (zonder “vals spelen” with trig)

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

Dus, om de magie hier uit te leggen:
Integrate[function, lower, upper] geeft u het gebied onder de curve “functie” van “onder” naar “boven”. In dit geval is die functie [1-x^2]^.5, een formule die de bovenste helft van een cirkel met straal 1 beschrijft. Omdat de cirkel een straal van 1 heeft, bestaat deze niet voor waarden van x lager dan -1 of hoger dan 1. Daarom zoeken we de oppervlakte van een halve cirkel. Als we vermenigvuldigen met 2, krijgen we het gebied binnen een cirkel met straal 1, die gelijk is aan pi.

Opmerkingen

  • Misschien jij zou in je antwoord een uitleg moeten invoegen waarom dit werkt (voor hen die geen wiskunde zijn).
  • geweldig idee. Ik zal er binnenkort voor zorgen. Ik ‘ zal een eenvoudige uitleg geven van de betrokken wiskunde.
  • Misschien zou je het kunnen inkorten: verander sqrt[1-x^2] in (1-x^2)^.5)
  • en ik kan de * verwijderen na de 2. Mathematica is geweldig.

Antwoord

Python (83 tekens)

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 

Antwoord

Husk , 28 25 24 bytes

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

Probeer het online!

Berekent de waarde van pi als een rationaal getal met de eerste 5000 termen van de oneindige reeks 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))), en extraheert vervolgens de eerste 500 cijfers.

De code om de waarde van pi te berekenen uit een bepaald aantal termen is slechts 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 

Helaas moeten we dan 3 bytes verspillen aan het specificeren van het aantal van te gebruiken termen:

□70 # 70^2 = 4900 

En dan nog 8 bytes die het rationale getal (uitgedrukt als een breuk) omzetten in cijfers in decimale vorm:

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

Answer

PARI / GP, 14

\p500 acos(-1) 

Je kunt triggers vermijden door de tweede regel met

gamma(.5)^2 

of

(6*zeta(2))^.5 

of

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

of

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

of

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

Answer

Python3 136

Gebruikt Madhava “s formule.

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

Gebruikt dit formule.

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

Antwoord

Mathematica (17 bytes)

N[ArcCos[-1],500] 

Bewijs van geldigheid .

Antwoord

Pyth , 21

u+/*GHhyHy^T500r^3T1Z 

Gebruikt dit algoritme: pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) gevonden in de commentaren van het Golfscript-antwoord.

Reacties

  • Dit verdient geen ‘ t een downvote …
  • Dit antwoord is onjuist, het genereert 34247779. .. wat, voor zover ik weet, niet pi is.
  • @orlp De r operatie is onlangs gewijzigd op een manier die dit antwoord kapot maakte. Verander de 1 naar een 0, en het zal werken in de huidige Pyth.

Answer

JavaScript, 60 bytes

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

Probeer het online!

Reacties

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

Answer

bc -l (22 = 5 opdrachtregel + 17 programma)

scale=500 4*a(1) 

Reacties

  • De regels zeggen ” noch mag het een bibliotheekfunctie aanroepen om pi te berekenen. ”
  • @Peter Het probleem dat ik denk is dat ” bibliotheekfunctie ” is niet altijd een goed gedefinieerde term, en het wordt alleen maar erger als je ” zegt om Pi te berekenen “, zoals u het kunt gebruiken om tussenresultaten te berekenen, bijvoorbeeld Sqrt () in Alexandru

    s antwoord.

  • Ik denk dat dit vals spelen is, omdat atan 1/4 pi berekent, maar het is toch een interessante oplossing.
  • @Thomas O : als dit valsspelen is, waar is ‘ de limiet?
  • trig-functies zouden verboden moeten zijn vanwege dit soort antwoorden. het idee is om pi te berekenen met een algoritme, niet met een ingebouwde functie. sqrt is een beetje anders omdat het ‘ geen trig-functie is.

Antwoord

Mathematica – 50

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

Antwoord

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 dankzij @ceilingcat .

Probeer het online .

Of als volledig programma (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));}}  

Probeer het online.

Antwoord

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

ter referentie https://tuts4you.com/download.php?view.452 ; het zou een benadering zijn van 6 * arctg (1 / sqrt (3)) =% pi en het zou serie-uitbreiding gebruiken voor 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 

Antwoord

05AB1E , 20 bytes

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

Poort van mijn Java-antwoord (met de 503 vervangen door 1000 – alles wat \ $ \ geq503 \ $ is, is prima om de eerste uit te voeren 500 cijfers nauwkeurig met deze benadering).

Probeer het online of verifieer het ” s gelijk aan de eerste 500 cijfers van PI met behulp van de ingebouwde žs .

Uitleg:

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

Antwoord

Fortran, 154 bytes

De rosetta code oplossing. Veel bytes opgeslagen met impliciete gehele getallen i j k l m n, print in plaats van write, en dingen in willekeurige volgorde afspelen rond

Probeer het 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  

Antwoord

APL (NARS2000), 20 bytes

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

Ik heb dit “niet kunnen testen, maar hier” s een versie in Dyalog APL. Het enige verschil tussen beide is het achtervoegsel ” x “, dat wordt gebruikt voor rationale getallen in NARS2000 maar niet beschikbaar is in Dyalog (of andere varianten online beschikbaar, voor zover ik weet).

Het is gebaseerd op de pi = 2 + 1/3*(2 + 2/5*(2 + 3/7*(2 + 4/9*(2 + ...)))) -formule in de commentaren onder het geaccepteerde Golfscript-antwoord.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *