Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Basato su piattaforma Qualcomm Snapdragon X Plus a 8 core, il nuovo Microsoft Surface Pro 12 è un notebook 2 in 1 molto compatto che punta sulla facilità di trasporto, sulla flessibilità d'uso nelle differenti configurazioni, sul funzionamento senza ventola e sull'ampia autonomia lontano dalla presa di corrente
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Il REDMAGIC Astra Gaming Tablet rappresenta una rivoluzione nel gaming portatile, combinando un display OLED da 9,06 pollici a 165Hz con il potente Snapdragon 8 Elite e un innovativo sistema di raffreddamento Liquid Metal 2.0 in un form factor compatto da 370 grammi. Si posiziona come il tablet gaming più completo della categoria, offrendo un'esperienza di gioco senza compromessi in mobilità.
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese di utilizzo intensivo e l'analisi di oltre 50 scatti, l'articolo offre una panoramica approfondita di Nintendo Switch 2. Vengono esaminate le caratteristiche che la definiscono, con un focus sulle nuove funzionalità e un riepilogo dettagliato delle specifiche tecniche che ne determinano le prestazioni
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 18-07-2008, 17:19   #1
unslee
Member
 
L'Avatar di unslee
 
Iscritto dal: Jun 2008
Messaggi: 40
[c++ / calcolo numeri primi] - Mi salta il numero 1 !

Ciao a tutti,
ho risolto un esercizio nel quale veniva chiesto di restituire in output tutti i numeri primi da 1 a 100.000.

Per calcolare se un numero è primo ho creato la funzione prime.

Nella prima versione ho filtrato l'elaborazione nella funzione prime escludendo a priori tutti i numeri che modulo 2 restituivano 0.

Nella seconda versione ho filtrato l'elaborazione nella funzione prime escludendo (grazie all'aiuto di Ziosilvio!) tutti i numeri la cui radice quadrata fosse intera.

Per ottimizzare le prestazioni ho creato una versione 3 del programma che nella funzione prime, prima di procedere all'elaborazione, esclude sia tutti i numeri che nodulo 2 restituiscono 0 sia la cui radice quadrata sia intera.

Prima versione: 58 secondi
Seconda versione: 1' e 31 secondi
Terza version: 40 secondi

L'ottimizzazione delle prestazioni c'è stata ma il mistero è che la versione 3 non mi mostra il numero 1 come primo
La cosa strana è che il numero 1 è proprio il primo argomento passato alla funzione prime che, tra l'altro, lo tratta esplicitamente.
Nelle altre 2 versioni il numero 1 viene outputtato.


Codice:
// Esercizio 630.cpp : definisce il punto di ingresso dell'applicazione console.
//

#include "stdafx.h"

#include <iostream>
using std::cin;
using std::cout;
using std::endl;

#include <cmath>
using std::sqrt;

int _tmain(int argc, _TCHAR* argv[])
{
	return 0;
}

bool prime(int);

int main()
{
	int counter = 0;
	
	for (int number = 1; number <= 100000; number++)
	{
	if (prime(number) == 1)
	{
		cout << "Il numero " << number << " e' un numero primo" << endl;
		counter++;
	}
	}

	cout << counter;

	return 0;
}

bool prime(int number)
{
	int a = 0;
	double number2 = number;
	int b = (int)sqrt(number2);
	
	if (number == 1)
		return number != number;
	else
		if (number == 2)
			return number == number;
		else
	if (number % 2 == 0)
		return number != number;
	else
		if (b == number * number)
		return number != number; 
	else
	{
		for (int counter = number - 1; counter > 1; counter--)
		{
			if (number % counter == 0)
				a = 1;
		}
		
	if (a == 1)
		return number != number;
	else
		return number == number;
	}
}
Grazie a tutti per l'aiuto,

Unslee

Ultima modifica di unslee : 18-07-2008 alle 18:07.
unslee è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2008, 17:25   #2
unslee
Member
 
L'Avatar di unslee
 
Iscritto dal: Jun 2008
Messaggi: 40
Problema risolto ....

un riavvio del pc e il mistero del numero 1 si è risolto!

Unslee
unslee è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2008, 17:30   #3
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Il numero 1 non è considerato un numero primo.

In caso contrario, l'enunciato del teorema fondamentale dell'aritmetica "ogni intero positivo si riscrive in un modo e uno solo come prodotto di potenze di primi" non sarebbe vero (perché si può moltiplicare per 1 tutte le volte che si vuole) e bisognerebbe usarne uno più complicato.

EDIT: oltretutto, il numero 1 si può comunque ottenere come prodotto vuoto di potenze di primi.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu

Ultima modifica di Ziosilvio : 20-07-2008 alle 13:25.
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2008, 17:59   #4
unslee
Member
 
L'Avatar di unslee
 
Iscritto dal: Jun 2008
Messaggi: 40
Non si finisce mai di imparare... grazie per la spiegazione. Ho risistemato il programma perché era stato tarato sulla mia ignoranza in materia! Ora gira correttamente.

:

Ultima modifica di unslee : 18-07-2008 alle 18:08.
unslee è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2008, 18:21   #5
unslee
Member
 
L'Avatar di unslee
 
Iscritto dal: Jun 2008
Messaggi: 40
Trovandoci a parlare dei numeri primi, avrei bisogno di aiuto per capire il testo dell'esercizio (del libro dei fratelli Deitel che sto studiando e non di un corso) che recita così:

Un numero intero si dice primo se è divisibile soltanto per se stesso.

a) Scrivere una funzione che determina se il suo parametro è un numero primo

b) Utilizzare questa fuzione per scrivere un programma che determina e visualizza i numeri primi compresi tra 1 e 100.000. Quandi numeri avete bisogno di provare realmente prima di trovare tutti i numeri primi di questo intervallo?

c) Inizialmente penserete che non serve andare oltre n/2 per verificare se n è un numero primo, ma in realtà potete anche fermarvi alla sua radice quadrata. Perché? Riscrivere il programma ed eseguire le due versioni. Che miglioramento avete ottenuto sulle prestazioni?

Mi mette in crisi la c. Ho pensato di filtrare inizialmente i numeri escludendo quelli il cui modulo 2 restituiva 0 (divisibili per due) e mi trovo allineato.
Quando si fa riferimento alla radice quadrata di n l'unica cosa che mi è venuta in mente è che un numero che abbia una radice quadrata intera non sia un numero primo.

Il fatto è che se filtro per la seconda condizione (radice quadrata non intera) che ho pensato il programma degrada in termini di prestazioni rispetto alla prima soluzione (esclusione dei numeri divisibili per due). Nel testo dell'esercizio mi sembra chiaro che le prestazioni debbano aumentare e quindi credo di non aver capito esattamente cosa stia cercando di dirmi il libro nel punto c).

Grazie sempre per l'aiuto,

Unslee
unslee è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2008, 18:53   #6
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Quote:
Originariamente inviato da unslee Guarda i messaggi
Trovandoci a parlare dei numeri primi, avrei bisogno di aiuto per capire il testo dell'esercizio (del libro dei fratelli Deitel che sto studiando e non di un corso) che recita così:

Un numero intero si dice primo se è divisibile soltanto per se stesso.
Questa definizione è talmente sbagliata, che chi ha scritto quel pezzo dovrebbe essere decapitato per manifesta incapacità di usare la testa senza far danni.

Un numero intero maggiore di 1 si dice primo se è divisibile soltanto per 1 e per se stesso.
Equivalentemente: un numero p intero maggiore di 1 si dice primo se le uniche soluzioni intere positive dell'equazione p=x*y sono x=1, y=p ed x=p,y=1.
Quote:
Originariamente inviato da unslee Guarda i messaggi
Scrivere una funzione che determina se il suo parametro è un numero primo
E fin qui nessun problema.
(A parte il fatto che l'algoritmo ingenuo opera in tempo superpolinomiale nella lunghezza dell'input.)
Quote:
Originariamente inviato da unslee Guarda i messaggi
Utilizzare questa fuzione per scrivere un programma che determina e visualizza i numeri primi compresi tra 1 e 100.000. Quandi numeri avete bisogno di provare realmente prima di trovare tutti i numeri primi di questo intervallo?
"Quandi numeri avete bisogno"
Ma chi è il redattore, Luca Giurato?
Quote:
Originariamente inviato da unslee Guarda i messaggi
Inizialmente penserete che non serve andare oltre n/2 per verificare se n è un numero primo, ma in realtà potete anche fermarvi alla sua radice quadrata. Perché? Riscrivere il programma ed eseguire le due versioni. Che miglioramento avete ottenuto sulle prestazioni?
Il "perché" è un teoremino da algebra del primo anno di università.
Pensa a cosa succederebbe se un numero composto avesse solo fattori primi maggiori della propria radice quadrata...

Il libro dovrebbe voler dire che, se fai un confronto tra il tempo che ci mette la versione che prova i divisori fino a n/2 e quella che prova i divisori fino a sqrt(n), noti che la seconda è molto più veloce.
Il problema è che fare delle misurazioni affidabili non è banale, e non so se a questo punto dei tuoi studi conosci già le funzioni di libreria per il computo del tempo...
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2008, 19:53   #7
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Ma il punto "b" vorrebbe essere uno spunto per arrivare da soli al crivello di eratostene? Perchè se è cosi mi sembra un pò "vago"...
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2008, 20:14   #8
unslee
Member
 
L'Avatar di unslee
 
Iscritto dal: Jun 2008
Messaggi: 40
Ciao Ziosilvio,
peccato per la lontananza altrimenti di chiederei di farmi lezioni di matematica perché sei un asso!

Allora, relativamente alla definizione, quello da decapitare sono io: mi sono sbagliato ed ho mancato un pezzo nella trascrizione!
Anche "quandi" è una mia creazione ...
... chiedo venia e dovrò cercare di essere più attento.

Nel merito del problema sei riuscito a farmi capire (ardua impresa!) esattamente la richiesta del libro. Effettivamente ho fatto girare il programma in entrambi i modi e, anche usando un semplice cronometro (tenendo a bada il più possibile i vari tasks), la differenza di prestazioni è molto visibile.

Questo per me è incomprensibile:
"A parte il fatto che l'algoritmo ingenuo opera in tempo superpolinomiale nella lunghezza dell'input"
Se pensi che per me capire quest'ultima cosa sia utile magari puoi darmi qualche indicazione così mi metto a studiare.

Grazie ancora per l'aiuto,

Unslee
unslee è offline   Rispondi citando il messaggio o parte di esso
Old 18-07-2008, 21:09   #9
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da unslee Guarda i messaggi
Questo per me è incomprensibile:
"A parte il fatto che l'algoritmo ingenuo opera in tempo superpolinomiale nella lunghezza dell'input"
Se pensi che per me capire quest'ultima cosa sia utile magari puoi darmi qualche indicazione così mi metto a studiare.
Vuol dire che provare a dividere il numero X per tutti quelli minori della sua radice quadrata non è un metodo molto furbo.
Se li devi testare nel range 1:100000 non so se arrivi in fondo in tempo utile...(no forse fino a 100000 si...ma ad 1 milione credo proprio di no).
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2008, 14:42   #10
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Quote:
Originariamente inviato da unslee Guarda i messaggi
"A parte il fatto che l'algoritmo ingenuo opera in tempo superpolinomiale nella lunghezza dell'input"
Se pensi che per me capire quest'ultima cosa sia utile magari puoi darmi qualche indicazione
L'algoritmo ingenuo per il test di primalità comporta la divisione del valore n (del quale si vuol sapere se è primo o no) per tutti i numeri primi che non superano la sua radice quadrata.
Il caso peggiore, è che n sia primo oppure il quadrato di un primo, e sia necessario fare tutte le prove.
Se conti il numero T(n) delle operazioni che devi fare nel caso peggiore, e tieni a mente che una stringa binaria che rappresenta il numero n è lunga L=log{2}(n), scopri che per ogni potenza k-esima e per ogni costante C ti ritrovi un valore N(C,k) tale che T(n) >= C*L^k per ogni n > N(C,k)

Si tratta di una branca dell'informatica teorica nota come teoria della complessità.
Puoi vedere qualcosa già su Wikipedia, o sul testo di Cormen, Leiserson e Rivest (se la tua biblioteca ce l'ha).
Quote:
Originariamente inviato da shinya Guarda i messaggi
Vuol dire che provare a dividere il numero X per tutti quelli minori della sua radice quadrata non è un metodo molto furbo.
Se li devi testare nel range 1:100000 non so se arrivi in fondo in tempo utile...(no forse fino a 100000 si...ma ad 1 milione credo proprio di no).
Purtroppo l'algoritmo di Agrawal-Kayal-Saxena opera sì in tempo polinomiale, ma le costanti moltiplicative nascoste sono talmente grandi, che (salvo grossi progressi in teoria dei numeri) all'atto pratico è più veloce l'algoritmo ingenuo!
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 19-07-2008, 20:04   #11
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da Ziosilvio Guarda i messaggi
Purtroppo l'algoritmo di Agrawal-Kayal-Saxena opera sì in tempo polinomiale, ma le costanti moltiplicative nascoste sono talmente grandi, che (salvo grossi progressi in teoria dei numeri) all'atto pratico è più veloce l'algoritmo ingenuo!
Sinceramente, non conoscevo questo algoritmo! Adesso mi documento...
Io mi riferivo al più semplice crivello di eratostene, dato che deve trovare i numeri primi in un range...
shinya è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2 Dopo un mese, e 50 foto, cosa abbiamo capito del...
Gigabyte Aero X16 Copilot+ PC: tanta potenza non solo per l'IA Gigabyte Aero X16 Copilot+ PC: tanta potenza non...
vivo X200 FE: il top di gamma si è fatto tascabile? vivo X200 FE: il top di gamma si è fatto ...
Crollano di prezzo gli stupendi TV 4K OL...
Prodotti pericolosi su Temu e Shein: l'U...
JLR annuncia il ritardo del Range Rover ...
Stufi di tagliare il prato? Chi prova un...
Verso un vaccino universale contro il ca...
L'iPhone 17 Air con batteria 'mini' da m...
Iliad offre l'upgrade gratuito ai propri...
Sembra impossibile ma è scesa ancora: la...
Netflix: ecco tutti i titoli ''shock'' i...
Altman, OpenAI: 'Supereremo quota 1 mili...
Sedie gaming con LED, massaggio e poggia...
OpenAI, l'IA conquista l'oro all'Olimpia...
FBC: Firebreak è un flop? I gioca...
Due robot Roborock al minimo storico: la...
Sfida tra laptop AI con schermo OLED: AS...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:14.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v