Newsgroup: it.scienza.informatica
Titolo: Calcolo del PI GRECO

Per esercitarmi a programmare in Visual Basic ho scritto un programma che
calcola il PI GRECO con la precisione che desidera l'utente. Con la
precisione di 200 cifre decimali il mio PC (un pentium II - 200 MHz) ha
impiegato circa 10 minuti per fare il calcolo:
3 , 1 4 1 5 9   2 6 5 3 5   8 9 7 9 3   2 3 8 4 6
      2 6 4 3 3   8 3 2 7 9   5 0 2 8 8   4 1 9 7 1
      6 9 3 9 9   3 7 5 1 0   5 8 2 0 9   7 4 9 4 4
      5 9 2 3 0   7 8 1 6 4   0 6 2 8 6   2 0 8 9 9
      8 6 2 8 0   3 4 8 2 5   3 4 2 1 1   7 0 6 7 9
      8 2 1 4 8   0 8 6 5 1   3 2 8 2 3   0 6 6 4 7
      0 9 3 8 4   4 6 0 9 5   5 0 5 8 2   2 3 1 7 2
      5 3 5 9 4   0 8 1 2 8   4 8 1 1 1   7 4 5 0 2
      8 4 1 0 2   7 0 1 9 3   8 5 2 1 1   0 5 5 5 9
      6 4 4 6 2   2 9 4 8 9   5 4 9 3 0   3 8 1 9 6
Quello che mi chiedo č:
- E'  possibile (almeno in linea teorica) creare un procedimento che aumenti
progressivamente la precisione (senza ovviamente ricominciare dall'inizio il
calcolo)?
- Come si puň velocizzare il calcolo? (ho utilizzato variabili di tipo byte
per ogni cifra decimale e sono consapevole che quando l'elaborazione "passa"
il controllo della coda di eventi a Windows c'č un po' di spreco in
risorse).
Se qualcuno vuole il listato sarň lieto di inviarglielo.
Saluti
Claudio (
rofa...@tin.it
)

 writes:

Uhm, bello.
Dunque che formula hai usato? 
Quelle che conosco io sono 
Wallis (1665): Pi/2 = \Sum_{n=1}^{\inf} (4n^2)/(4n^2-1)
Gregory (1671): Pi/4 = \Sum_{n=0}^{\inf} (-1)^n/(2n+1)
Machin (1706): Pi/4 =  4 arctg(1/5) - arctg (1/239)
	usando arctg X = \Sum_{n=0}^{\inf} (-1)^n X^(2n+1)/(2n+1)
Ramanujan (1914): 
1/Pi= \sqrt(8)/9801 \Sum_{n=0}^{\inf} (4n)!(1103+26390n)  /
					 ( (n!)^4 396^(4n) )
Borwein (1987) omissis (e' lunga mezza pagina) oltre che la piu'
					 veloce...
La formula di Chudnovsky dovrebbe essere quella migliore pero' da
computare (i matematici non tengono in generale conto della memoria)
sul mio pc (ppro 200mhz 64mb) con mathematica ho calcolato 500.000
cifre in 7000 secondi..
200 cifre non riesco neanche a cronometrarlo
In[2]:= Timing[N[Pi,200]]
Out[2]= {0. Second,
3.1415926535897932384626433832795028841971693993751058209\
74944592307816406286208998628034825342117067982148086513282306647093844\
60955058223172535940812848111745028410270193852110555964462294895493038\
20 }
Comunque piu' che la memoria, la cpu e il s.o. fa l'algoritmo che usi
 
-- 
# Giorgio Vecchiocattivi
# Osra Toscana srl
# Tel. 
+39 339 2842578

 computare
Cosa intendi esattamente con computare ?
Che tu sappia Mathematica compie le operazioni direttamente su vettori di
numeri binari?
Saluti
Claudio (
rofa...@tin.it
)

 numeri binari?
Non so cosa ne pensa Giorgio, ma che io sappia, Mathematica opera su
grandezze con un numero qualsiasi di cifre decimali, e non devi preoccuparti
della loro rappresentazione interna. Ciač, se gli dici che vuoi 50'000 cifre
decimali, lui fa i conti con quelle cifre (a parte alcuni limiti che
probabilmente ha e che non conosco).
--
Alessandro Monti

 probabilmente ha e che non conosco).
Non ho idea di come rappresentino internamente i numeri a precisione
arbitraria, sono abbastanza sicuro che non sia la rappresentazione
piu' compatta che si possa pensare (dalla memoria che si ciuccia..) 
I limiti sono solo quelli della memoria... dovrebbe esserci comunque
una funzione che restituisce la dimensione in byte di un'oggetto
allocato, quando torno a casa gli do un'occhiata.
-- 
# Giorgio Vecchiocattivi

Se qualcuno vuole il listato sarò lieto di inviarglielo.
bene, forse ti scriverò in privato per chiederti di inviarmi il sorgente e
l' eseguibile.
Infatti non ho VB installato bensì Delphi.
Non voglio essere cattivo, ma la velocità potrebbe dipendere essenzialmente
dall' algoritmo che hai utilizzato come dal compilatore VB.
Tempo fa un mio amico ha fatto in VB un programmino per criptare un file
qualunque. L' algoritmo era molto semplice, si limitava all' uso dell'
operatore xor.
Mi ha parlato dei tempi impiegati per criptare e sono rimasto "sconvolto".
Del tipo 5 minuti per circa 500 Kb.
Io ho scritto lo stesso programma complicando anche un po'  l' algoritmo ed
in 5 minuti cripto 80 Mb !!!
Del resto lui ha un processore molto più veloce del mio che è un semplice 90
Mhz !! Anche come memoria lui dovrebbe avere 64 o 128 Mb, mentre io sto a
32. Come HD il suo non è SCSI ed è del del mio stesso tipo.
Può anche darsi che il suo algoritmo fosse lento per altri motivi nella
stesura del codice.......chissà.
Altri amici mi hanno riferito problemi simili con altri programmi.
Comunque manda pure il codice e darò un' occhiata all' algoritmo utilizzato.
Se puoi aggiungi qualche nota così ci capisco meglio.
Se ti interessa, ti posso postare il codice e l' esempio di un programma per
fattorizzare numeri interi.
Questo mette a terra il PC in tutti i sensi. Io l' ho inizialmente
sviluppato utilizzando il tipo intero che offriva un range positivo compreso
tra circa  1 e 2^31. Volendo è possibile incrementare questo range a 2^63 e
durante la fattorizzazione si può anche andare a prendere un caffè mentre se
è ora di cena anche una pizza va bene ugualmente !!! Con questo voglio dire
che il PC impiega tantissimo tempo per fare questo calcolo.
Ovviamente dipende anche dall' algoritmo utilizzato. Io me ne sono inventato
uno ragionando, forse ne esistono di migliori che si basano sui criteri di
divisibilità ecc.....però si sa benissimo che la risoluzione di un calcolo
simile richiede molto tempo.
Per ora ti saluto.....ciao !!!
Antonio Tarolla
BSSoftware Tips Mailing - List Support




>Claudio (
rofa...@tin.it
)
Spediscimelo, cosi' riscrivo il programma in C facciamo un confronto
dei tempi d'esecuzione...
--
Andrea Laforgia
andrea_...@bigfoot.com