NumeriPrimi a gogo

MastroLindo

Utente abituale
12 Aprile 2018
141
18
venezia
EXCEL 2016
0
NumeriPrimi a gogo un piccolo programma in excel vba ideale per studenti di matematica e non studenti.

Innanzitutto ringrazio tutti gli users che mi hanno aiutato: Ges, dracoscrigno, in particolare Bruno che mi ha aiutato con le matrici.

Questo piccolo programma calcola i numeri primi da 1 a 9.223.372.036.854.775.807 (se partiamo da 1 per ragioni di calcolo omette il 2 e 5 se guardate il codice si capisce subito). Comunque si può partire da qualsiasi numero ed arrivare a calcolare i numeri primi fino al numero desiderato.

Attenzione se l’intervallo dei numeri e molto grande il calcolo può durare anche ore.

Io ho un portatile con 6 giga di memoria e cpu i7 e per alcuni calcoli impiego:

da 1 a 300 000 impiego 0,21875 secondi.

da 1 a 1 000 000 impiego 1,031 secondi.

da 1 a 10 000 000 impiego 23,625 secondi.

da 1 a 1 000 000 000 impiego 3h 56m 36s,87 secondi. Ecc. ecc.

Ho lasciato il computer di notte lavorare da solo, quindi più alti sono i numeri più tempo impiega.

Es. da 8 500 000 001 a 9 000 000 000 impiego 8h 13m 13s,664.

Però se mi interessa sapere se un numero molto alto è primo digito solo il numero oppure digito un piccolo intervallo tra un numero e l’altro.

Sono lontano anni luce a scoprire il numero primo più grande come già scoperto, ma comunque ho fatto un piccolissimo passo.

Accetto volentieri qualunque suggerimento per velocizzare i calcoli.

Spero sia di aiuto a qualcuno.

Grazie

Ciao a tutti
 

Allegati

  • Like
Reactions: Rubik72 and ges

MastroLindo

Utente abituale
12 Aprile 2018
141
18
venezia
EXCEL 2016
0
Ciao a tutti gli users.
Ecco un'altra versione del file NumeriPrimi_a_gogo con file txt esterno.
Ho provato ad usufruire del file TXT di dracoscrigno contenente una lista di numeri primi che richiamati da codice diventano i divisori per il calcolo di numeri primi stessi. L'ultimo numero del file divisori.text è: 499649 che se elevato al quadrato mi da 249.649.123.201 che è il numero limite per il calcolo dei numeri primi (salvo miei errori di calcolo). Mentre con la prima versione posso calcolare i numeri primi fino a : 9.223.372.036.854.775.807. In allegato i due i files.
Ho notato che la prima versione è più veloce della seconda.
Come sempre accetto volentieri qualunque suggerimento per velocizzare e semplificare i calcoli.
Grazie
Ciao
 

Allegati

MastroLindo

Utente abituale
12 Aprile 2018
141
18
venezia
EXCEL 2016
0
Ciao a tutti per chi interessa propongo un'altra versione per il calcolo dei numeri primi.
Questa versione è velocissima ed ha un solo handicap cioè e' limitata , calcola i numeri primi fino al numero di:' 1.0172.000.000 circa.
Premetto la formula del calcolo è stata copiata da un sito giapponese e rielaborata e adattata al mio programma.
Pertanto chiedo cortesemente agli esperti se si può' andare oltre a numero sopra scritto.( almeno per quelli che hanno installato excel 64 bit). Accetto consigli da tutti.
grazie.
 

Allegati

  • Like
Reactions: Bruno and ges

muni

VBA Expert
Expert
25 Novembre 2018
278
28
Roma
2013
18
Cosa succede oltre quel numero? Un problema di memoria?

P.S. non capisco nel codice la frase relativa al LongLongPtr che non usi nel tuo codice ...
 
  • Like
Reactions: MastroLindo

MastroLindo

Utente abituale
12 Aprile 2018
141
18
venezia
EXCEL 2016
0
Cosa succede oltre quel numero? Un problema di memoria?

P.S. non capisco nel codice la frase relativa al LongLongPtr che non usi nel tuo codice ...
Ciao.
Scusami le prime tre righe di spiegazioni sono da ignorare mi sono dimenticato di cancellarle, pertanto non hanno niente a che vedere con il codice, erano riferite alla prima versione. Perché con la voce del menu sostituisci si è aggiunto un Long ad LongPtr .
Comunque:
Succede Overflow cioè Problema di memoria.
Per chi ha excel 32 bit accetta solo la funzione Long o inferiore allora va in overflow con numeri più bassi.
per chi ha excel 64 bit non accetta la funzione LongLong da problemi con le matrici.
Con il codice iniziale potevo calcolare i numeri primi fino a 9.223.372.036.854.775.807 usando la funzione LongLong. I calcoli duravano ore e il tempo era in proporzione alla grandezza del numero. Cioè io calcolavo i numeri primi per 1.000.000.000 alla volta e cosi via. Poi man mano il numero da calcolare diventava sempre più grande passavo a 500.000.000 per volta, poi a 250.000.000 per volta e cosi via.
Sono lontano anni luce a scoprire il numero primo più grande come già scoperto, ma comunque ho fatto un piccolissimo passo.
 
Ultima modifica:

muni

VBA Expert
Expert
25 Novembre 2018
278
28
Roma
2013
18
Succede Overflow cioè Problema di memoria.
No, un overflow non è un problema di memoria.

In quale riga esattamente hai quell'errore?

funzione Long
Il Long è un tipo di dato non una funzione. E che vengano trattati, al massimo, i Long (come tipo di dato intero) è normale perché in un sistema a 32 bit i Long sono a 32 bit.

funzione LongLong da problemi con le matrici.
Anche il LongLong è un tipo di dato intero a 64 bit. Dai maggiori dettagli circa questi "problemi".

Sono lontano anni luce a scoprire il numero primo più grande come già scoperto, ma comunque ho fatto un piccolissimo passo.
Non vorrei deluderti ma questo non si fa con Excel e VBA ma ci vogliono particolari algoritmi implementati con linguaggi molto più efficienti e hardware molto più veloci.

Se vogliamo dare una soluzione agli errori, si può dare un'occhiata ma per i numeri primi, con Excel/VBA e i sistemi casalinghi, non potrai mai andare oltre un certo limite. Esistono limiti di memoria utilizzabile e tanti altri problemi che rendono la faccenda una mera "curiosità" che può andare bene come divertimento ...
 
  • Like
Reactions: MastroLindo

MastroLindo

Utente abituale
12 Aprile 2018
141
18
venezia
EXCEL 2016
0
muni @muni
Ciao
siccome sono alle prime armi nella programmazione vba, fai più presto te a capire gli errori del codice. Lancia il programma aumentando la ricerca dei numeri primi a 1.500.000.000 e vedrai tutti gli errori.
Lo so che excel non è il programma adatto per grandi calcoli però per me che sono un piccolo appassionato di matematica è stata una grande soddisfazione arrivare a calcolare i numeri primi fino a 9.223.372.036.854.775.807. (con la prima versione)
Difatti per me è un divertimento.
Graziecappello_saluta
 

muni

VBA Expert
Expert
25 Novembre 2018
278
28
Roma
2013
18
A casa non ho installata una versione a 64 bit. Dovrei farlo in ufficio su uno dei sistemi, quindi io ho soltanto segnalazione di "Memoria esaurita".

Se hai un errore di "Overflow" sul sistema a 64 bit, dovresti dirmi in quale riga del codice avviene.

P.S. Se sei appassionato di matematica e numeri primi, con un linguaggio più adeguato puoi avere risultati più veloci e comunque divertenti.
 
  • Like
Reactions: MastroLindo

MastroLindo

Utente abituale
12 Aprile 2018
141
18
venezia
EXCEL 2016
0
errore run time 7
memoria esaurita.

Visual Basic:
Sub NumPrimi()
    Dim j     As Long
    Dim i     As Long
    Dim a     As Long
    Dim b     As Long
    Dim arr() As Long
    Dim Rigo  As Long
    Dim Colo  As Long
    Dim Righe As Long
    Dim Tempo
    Application.ScreenUpdating = False
    Sheets("NumeriPrimi").Select
    a = Cells(1, 2)
    b = Cells(2, 2)
    Colo = 0: Rigo = 0
    Righe = Cells(1, 12) 'Numero di Righe. Si può sceglire l'incollonamento con numero di righe da 3 fino a 1048574.
    Rows("3:1048576").ClearContents  'Per cancellare tutte le righe dalla Terza Rigo a righe + 2.
    Cells(1, 16) = Now()
    Tempo = Timer
    ReDim arr(1 To b, 1 To 1)  <-----------------------------------qua
    For i = 3 To b Step 2
        arr(i, 1) = True
    Next i
    For i = 3 To b Step 2
        If arr(i, 1) Then
            'MsgBox i
            For j = i * 2 To b Step i
                arr(j, 1) = False
            Next j
        End If
    If arr(i, 1) = True And i >= a Then
    Rigo = Rigo + 1
    If Rigo > Righe Then
    Range("A3").Resize(Rigo - 1).Offset(, Colo) = arr
    Colo = Colo + 1: Rigo = 1
    End If
    arr(Rigo, 1) = i '"'" & i Se il numero è molto grande ed esce in formatazione scientifica sostituire: = i con = "'" & i (rallenta calcolo).
    End If
    Next
    Range("A3").Resize(Rigo).Offset(, Colo) = arr
    Cells(1, 20) = Colo * Righe + Rigo 'Numero totale di numeri Primi
    Cells(2, 16) = Now()
    Range("Q2") = Timer - Tempo
    If Range("A3") = 1 Then Range("A3") = 2
    Application.ScreenUpdating = True
Beep
End Sub
 
Ultima modifica di un moderatore:

muni

VBA Expert
Expert
25 Novembre 2018
278
28
Roma
2013
18
Ah ... beh ... Memoria esaurita non Overflow

Con un array di 1.0172.000.000 Long ovviamente può capitare secondo quanta memoria disponibile hai al momento.
 
  • Like
Reactions: MastroLindo

MastroLindo

Utente abituale
12 Aprile 2018
141
18
venezia
EXCEL 2016
0
Ah ... beh ... Memoria esaurita non Overflow

Con un array di 1.0172.000.000 Long ovviamente può capitare secondo quanta memoria disponibile hai al momento.
Ciao
Certo ma io volevo visto che ho excel 64 bit sostiture Long con LongLong.
Con la funzione LongLong mi da errore sempre sulla matrice: Tipo non corrispondente.
Con la prima versione di codice che o postato con LongLong posso arrivare con i calcoli fino a 9.223.372.036.854.775.807 per essere più preciso fino a 9.223.372.036.854.775.805 che a mio modesto parere e' già abbastanza per uso didattico o amatoriale.
Ps il mio portatile ha: Memoria 4 giga processore i7.
 

muni

VBA Expert
Expert
25 Novembre 2018
278
28
Roma
2013
18
Ti ho già detto che non è una funzione ma un tipo di dato.

Con il tipo di dato LongLong in quale riga esattamente ti dà l'errore? Cerca di essere preciso...
 
  • Like
Reactions: MastroLindo

MastroLindo

Utente abituale
12 Aprile 2018
141
18
venezia
EXCEL 2016
0
Ti ho già detto che non è una funzione ma un tipo di dato.

Con il tipo di dato LongLong in quale riga esattamente ti dà l'errore? Cerca di essere preciso...
Scusa la mia ignoranza in materia!
Con il tipo di dato LongLong mi da il seguente errore:
ReDim arr(1 To b, 1 To 1) il valore b viene contrassegnato in giallo. Tipo non corrispondente.
 

muni

VBA Expert
Expert
25 Novembre 2018
278
28
Roma
2013
18
Scusa ma il LongLong dove lo hai usato?

Il codice era

Codice:
    Dim j     As Long
    Dim i     As Long
    Dim a     As Long
    Dim b     As Long
    Dim arr() As Long
    Dim Rigo  As Long
    Dim Colo  As Long
    Dim Righe As Long
    Dim Tempo

...

ReDim (1 To b, 1 To 1)
e nella versione a 64 bit come è diventato?
 

MastroLindo

Utente abituale
12 Aprile 2018
141
18
venezia
EXCEL 2016
0
Scusa ma il LongLong dove lo hai usato?

Il codice era

Codice:
    Dim j     As Long
    Dim i     As Long
    Dim a     As Long
    Dim b     As Long
    Dim arr() As Long
    Dim Rigo  As Long
    Dim Colo  As Long
    Dim Righe As Long
    Dim Tempo

...

ReDim (1 To b, 1 To 1)
e nella versione a 64 bit come è diventato?
Mi sono spiegato male.
Il codice cosi postato con il tipo di dato Long gira normalmente ma è limitato a 1.0172.000.000 . Ma se voglio usare il tipo di dato LongLong mi da gli errori sopra descritti.
 

muni

VBA Expert
Expert
25 Novembre 2018
278
28
Roma
2013
18
Il codice cosi postato con il tipo di dato Long gira normalmente ma è limitato a 1.0172.000.000 . Ma se voglio usare il tipo di dato LongLong mi da gli errori sopra descritti.
E io ti ho chiesto ... SE USI IL LONGLONG come diventa il codice? Lo vuoi riportare con il LongLong?
 

MastroLindo

Utente abituale
12 Aprile 2018
141
18
venezia
EXCEL 2016
0
Basta sostituire tutti i Long con LongLong e provi. La mia cultura di vba arriva fino qua. Sto studiando perchè la programazione vba mi piace.
 

Sostieni ForumExcel

Aiutaci a sostenere le spese e a mantenere online la community attraverso una libera donazione!