Innanzi tutto grazie mille per aver risposto
Di prove ne ho fatte tante e sul programma che ho postato ho eseguito anche la prova prova dei 5 miliardi anzichè 10 e mi ha restituito come tempo 3 minuti anzichè 2,25. Di fatto però aggiungendo una qualsiasi operazione, anche solo quella di a=nr%molt, mi aumenta il tempo del doppio. Inoltre devo dire che il tempo rimane costante anche a fronte di un numero sempre più grande e cioè ogni 10 miliardi o ogni 5 miliardi, il tempo rimane costante a 5,5 minuti e a 3 minuti
Ho provato perfino a riscrivere il programma nel linguaggio Julia(riportato sotto) per vedere la differenza di gestione del calcolo, ma è stato ancora peggio… 11 minuti senza nessun calcolo e 16 minuti con inserito le tre righe di calcolo.
import Dates
ora = Dates.Time(Dates.now())
println("Inizio Ricerca ", ora)
ni = 441000000000000000001
#Numero di ricerca
limite = isqrt(ni)
lunghezza = length(string(ni))
println("Numero di ricerca ", ni, " lunghezza ", lunghezza, " Limite ricerca ", limite)
#*****************************
leggi = open(string("F:/programmi python/b6006/6006.txt"), "r")
mnassimo=1000
np=[]
cont=1
while cont==1
a=readline(leggi)
if a==""
close(leggi)
break;
end
push!(np, parse(Int64,a))
end
close(leggi)
agg=0
tempo=100
molt=0
cont=2
while molt<limite
global cont
global molt
global tempo
global agg
global ora
if np[cont]==0
agg=agg+6006
cont=1
end
molt=np[cont]+agg
if molt>tempo
ora = Dates.Time(Dates.now())
println(molt," ", ora)
tempo=tempo+10000000000
end
a=mod(ni, molt)
if mod(a, 2)!=0
if molt-a<mnassimo
b=molt
end
end
cont=cont+1
end
La cosa che mi lascia più perplesso è che il tempo impiegato con le tre righe di calcolo inserite, e cioè 11 minuti, è lo stesso tempo di un programma che calcola questa sequenza con un avanzamento più ridotto e cioè 30 anzichè 6006 e ne controlla ad uno ad uno i vari risultati.
import math
from datetime import datetime
import time
now = datetime.now().time()
print("ora inizio =", now)
#************************
nr = 1000000000000000000001
#**** numero da ricercare
limite=int(math.sqrt(nr))
print ('ricerca del numero ',nr,' ',len(str(nr)),' Limite ricerca ',limite)
massimo=1000
limite2=int(massimo*1.6)
scrivi=open('divisori_ottimizzati.txt','w')
scrivi.write(str(nr)+'\n')
scrivi.write(str(massimo)+'\n')
scrivi.write('3'+'\n')
scrivi.write('5'+'\n')
scrivi.write('7'+'\n')
scrivi.write('11'+'\n')
scrivi.write('13'+'\n')
scrivi.write('17'+'\n')
scrivi.write('19'+'\n')
scrivi.write('23'+'\n')
scrivi.write('29'+'\n')
tempo=100
molt=30
start=time.perf_counter()
while molt<limite2:
a=nr%(molt+1)
if a%2==0:
b=(-a)+((molt+1)*2)
else:
b=(-a)+(molt+1)
if b<=massimo:
scrivi.write(str(molt+1)+'\n')
a=nr%(molt+7)
if a%2==0:
b=(-a)+((molt+7)*2)
else:
b=(-a)+(molt+7)
if b<=massimo:
scrivi.write(str(molt+7)+'\n')
a=nr%(molt+11)
if a%2==0:
b=(-a)+((molt+11)*2)
else:
b=(-a)+(molt+11)
if b<=massimo:
scrivi.write(str(molt+11)+'\n')
a=nr%(molt+13)
if a%2==0:
b=(-a)+((molt+13)*2)
else:
b=(-a)+(molt+13)
if b<=massimo:
scrivi.write(str(molt+13)+'\n')
a=nr%(molt+17)
if a%2==0:
b=(-a)+((molt+17)*2)
else:
b=(-a)+(molt+17)
if b<=massimo:
scrivi.write(str(molt+17)+'\n')
a=nr%(molt+19)
if a%2==0:
b=(-a)+((molt+19)*2)
else:
b=(-a)+(molt+19)
if b<=massimo:
scrivi.write(str(molt+19)+'\n')
a=nr%(molt+23)
if a%2==0:
b=(-a)+((molt+23)*2)
else:
b=(-a)+(molt+23)
if b<=massimo:
scrivi.write(str(molt+23)+'\n')
a=nr%(molt+29)
if a%2==0:
b=(-a)+((molt+29)*2)
else:
b=(-a)+(molt+29)
if b<=massimo:
scrivi.write(str(molt+29)+'\n')
molt=molt+30
end=time.perf_counter()
print('Tempo prima parte',end-start)
print('seconda parte')
start=time.process_time()
while molt<limite:
if molt>tempo:
end = time.perf_counter()
print(molt,end-start)
tempo=molt+10000000000
start = time.perf_counter()
a=nr%(molt+1)
if a%2!=0 and molt+1-a<massimo:
scrivi.write(str(molt+1)+'\n')
a=nr%(molt+7)
if a%2!=0 and molt+7-a<massimo:
scrivi.write(str(molt+7)+'\n')
a=nr%(molt+11)
if a%2!=0 and molt+11-a<massimo:
scrivi.write(str(molt+11)+'\n')
a=nr%(molt+13)
if a%2!=0 and molt+13-a<massimo:
scrivi.write(str(molt+13)+'\n')
a=nr%(molt+17)
if a%2!=0 and molt+17-a<massimo:
scrivi.write(str(molt+17)+'\n')
a=nr%(molt+19)
if a%2!=0 and molt+19-a<massimo:
scrivi.write(str(molt+19)+'\n')
a=nr%(molt+23)
if a%2!=0 and molt+23-a<massimo:
scrivi.write(str(molt+23)+'\n')
a=nr%(molt+29)
if a%2!=0 and molt+29-a<massimo:
scrivi.write(str(molt+29)+'\n')
molt=molt+30
end=time.process_time()
print('Tempo seconda parte',end-start)
scrivi.close()
Inoltre questo programma scrive su disco il risultato ottenuto se la condizione è vera perciò penso sia più complesso per Python gestire questo programma rispetto al primo postato.
Continuerò a fare prove perchè l'obbiettivo e portare il tempo a 5 minuti, o poco più, e se avete qualche idea sarà molto ben accetta.
Di nuovo grazie mille