Ricerca numeri primi

Programmazione, algoritmica, teoria dell'informazione, ...
mykelyk
Messaggi: 12
Iscritto il: 01 gen 1970, 01:00

Messaggio da mykelyk »

Ecco la mia ultima versione.
Massimo dell'efficienza(beh, diciamo che partendo dal crivello ho fatto quel che ho potuto):

Codice: Seleziona tutto

#include "stdafx.h"
#include <iostream>
#include <math>
using namespace std;
union bools{
public:
	unsigned char byte;
	struct bits{
    public:
		unsigned char _0:1, _1:1, _2:1, _3:1, _4:1, _5:1, _6:1, _7:1;
		void set(unsigned int n){
			switch(n){
				case 0:_0=0;return;
				case 1:_1=0;return;
				case 2:_2=0;return;
				case 3:_3=0;return;
				case 4:_4=0;return;
				case 5:_5=0;return;
				case 6:_6=0;return;
			}		   _7=0;
		}
		unsigned char get(unsigned int n){
			switch(n){
				case 0:return _0;
				case 1:return _1;
				case 2:return _2;
				case 3:return _3;
				case 4:return _4;
				case 5:return _5;
				case 6:return _6;
			}		   return _7;
		}
	} bit;
};
int main(){
#define MAX 4294967280 //il massimo che il computer regge usando interi a 32bit
#define crivella() for(j= i8*(t=2*i8+2), t--; j<HMx; j+=t){jo8 = j/8; jm8 = j%8; seek(jo8, jm8)}
#define seek(a, n) switch(n){case 0:V[a].bit._0=0;break;case 1:V[a].bit._1=0;break;case 2:V[a].bit._2=0;break;case 3:V[a].bit._3=0;break;case 4:V[a].bit._4=0;break;case 5:V[a].bit._5=0;break;case 6:V[a].bit._6=0;break;default:V[a].bit._7=0;}
	unsigned int t, i, j, i8, jo8, jm8,
		Max = (MAX+15)/16,
		rMax = ((unsigned int)sqrt((long double)MAX) + 15)/16,
		HMx = (MAX+1)/2;
	bools* V = new bools[Max];
	for(i=0; i<Max; i++)
		V[i].byte = 0xff;
	V[0].bit._0 = 0;
	for(i=0; i<rMax; i++){
		i8 = i*8;
		if(V[i].bit._0)
			crivella();
		i8++;
		if(V[i].bit._1)
			crivella();
		i8++;
		if(V[i].bit._2)
			crivella();
		i8++;
		if(V[i].bit._3)
			crivella();
		i8++;
		if(V[i].bit._4)
			crivella();
		i8++;
		if(V[i].bit._5)
			crivella();
		i8++;
		if(V[i].bit._6)
			crivella();
		i8++;
		if(V[i].bit._7)
			crivella();
	}
	//FILE *fw;
	//fopen_s(&fw, "output.txt", "w");
	//fprintf(fw, "%u\n", 2);
	//for(i=1; i<HMx; i++)
	//	if(V[i/8].bit.get(i%8))
	//		fprintf(fw,"%u\n",2*i+1);
	//cout << 2 << endl;
	//for(i=j=1; i<HMx; i++){
	//	if(V[i/8].bit.get(i%8)){
	//		cout << 2*i+1;
	//		if(++j%20)
	//			cout << endl;
	//		else{
	//			char pause[2];
	//			cin.getline(pause, 1);
	//		}
	//	}
	//}
	cout << ">- Finito -<" << endl;
	char pause[2];
	cin.getline(pause, 1);
	return 0;
}
Sul mio computer pentium 4 dualcore 2,4Ghz(naturalmente ne usa solo uno) occupazione di ram: 263.884Kb
tempo di uso cpu: 1'8"

@Reese: const e define sono viversi. define è più veloce perchè viene sostituito in fase di compilazione, mentre const è una normale variabile, solo non modificabile, che quindi è accessibile a run-time.

@SkZ: Non mi risultano linguaggi di programmazione che usino un bit per la memoria, infatti la ram si è ridotta ad un'ottavo.
fph
Site Admin
Messaggi: 3958
Iscritto il: 01 gen 1970, 01:00
Località: in giro
Contatta:

Messaggio da fph »

mykelyk ha scritto: @SkZ: Non mi risultano linguaggi di programmazione che usino un bit per la memoria
IIRC l'implementazione di vector<bool> del gcc 4 fa questa ottimizzazione.
--federico
[tex]\frac1{\sqrt2}\bigl(\left|\text{loves me}\right\rangle+\left|\text{loves me not}\right\rangle\bigr)[/tex]
Avatar utente
SkZ
Messaggi: 3333
Iscritto il: 03 ago 2006, 21:02
Località: Concepcion, Chile
Contatta:

Messaggio da SkZ »

ma dovrebbe essere tolta prossimamente, quindi meglio non farci affidamento.
leggevo in rete che alcune implementazioni di c++ sotto win assegnano 1bit a bool
impara il [tex]~\LaTeX[/tex] e mettilo da par[tex]\TeX~[/tex]

Software is like sex: it's better when it's free (Linus T.)
membro: Club Nostalgici
Non essere egoista, dona anche tu! http://fpv.hacknight.org/a8.php
Avatar utente
Reese
Messaggi: 35
Iscritto il: 12 gen 2007, 15:46

Messaggio da Reese »

Che range di interi da' _w64?
Why would anybody want empathy?
Avatar utente
FeddyStra
Messaggi: 403
Iscritto il: 19 set 2006, 15:34
Località: 45° 7' 19.2'' N 7° 23' 20.1'' E

Messaggio da FeddyStra »

Perchè qualcuno non prova con il crivello di Atkin?
http://en.wikipedia.org/wiki/Sieve_of_Atkin
[quote="julio14"]Ci sono casi in cui "si deduce" si può sostituire con "è un'induzione che saprebbe fare anche un macaco", ma per come hai impostato i conti non mi sembra la tua situazione...[/quote][quote="Tibor Gallai"]Ah, un ultimo consiglio che risolve qualsiasi dubbio: ragiona. Le cose non funzionano perché lo dico io o Cauchy o Dio, ma perché hanno senso.[/quote]To understand recursion, you fist need to understand recursion.
[tex]i \in \| al \| \, \pi \, \zeta(1)[/tex]
Ciber_girl
Messaggi: 1
Iscritto il: 11 giu 2007, 17:26

Messaggio da Ciber_girl »

Ciao a tutti
pensavo a se dovessi calcolare numeri primi in un intervallo di 2 numeri cosa mi converrebbe usare???

Accetto suggerimenti

Ciao
Rispondi