[c++] Primzahlengenerator: Ganzzahlige primzahlen

hi leute, hier mal mein (etwas schlecht programmierter) Primzahlengenerator.
ich brauchte sowas für eine übung und jetzt wollte ich das teil mal on stellen.

wie gesagt, wurde runtergecodet ohne jetzt drüber nachzudenken ob der code "schön" ist. ist leider auch etwas unkommentiert.
wenn bedarf besteht, kommtentier ich das teil vielleicht!. (vielleicht: weil ichs ggfs. neu progge und zwar etwas sauberer)

achso:
dieser code ist absolut nicht effizient ;-)
da kann selbst eine webseite die teile schneller berechnen *hihi*

Code:
// primzahlen generator
// der code ist nicht der beste,
// habs einfach "schnell" mal gecoded.

#include <math.h>
#include <iostream>
#include <vector>
#include <time.h>

using namespace std;

void primzahl(int max);


int main(){
	int max;
	cout << "Wieviele Primzahlen?\n";
	cin >> max;
	cout << "Primzahlen werden generiert\n";
	primzahl(max);
	return 0;
}




void primzahl(int max){
	clock_t end, start;
	start = clock();
	double diff;
	vector<int> primVec;
	double checkMod1, checkMod2, checkMod3, doubleLast;
	int pZahl = 6;
	int selfZahl, intLast;
	int k = 0;
	primVec.push_back(2); primVec.push_back(3); primVec.push_back(5); 
	max -= 4;
	do{
		pZahl++;
		checkMod1 = pZahl % 2;
		checkMod2 = pZahl % 3;
		checkMod3 = pZahl % 5;
		if(checkMod1 == 0 || checkMod2 == 0 || checkMod3 == 0);
		else {  // ELSE 1
			if(k=-1) k = 0;
			while(k!=primVec.size())
			{
				selfZahl = primVec.at(k);

				doubleLast = (double)pZahl/(double)selfZahl;
				intLast = pZahl/selfZahl;	
				selfZahl *= selfZahl;

				if(selfZahl == pZahl || doubleLast==intLast){ 
					k = -1;
					break;

				}
				k++;
			}

			if(k!=-1){
				primVec.push_back(pZahl);
				max--;
			}
		} // ende  ELSE 1
	} // ende do
	while(max>=0);
	end = clock();

	for(unsigned int i=0;i<primVec.size();i++){
		cout << primVec.at(i) << " ";
	}
	cout << endl;
	diff = ((double)(end-start)/CLOCKS_PER_SEC);
	cout << endl << "Zeit zum Berechnen: " << diff << " (in Sekunden)\n";

}
 
Original von _fux_
Code:
		checkMod1 = pZahl % 2;
		checkMod2 = pZahl % 3;
		checkMod3 = pZahl % 5;
		if(checkMod1 == 0 || checkMod2 == 0 || checkMod3 == 0);

also ich bin zwar schon ziemlich müde und hab keine Muse mehr, den code auszuprobieren, aber ich möchte einfach mal behaupten, du hast da die 7 vergessen.
 
Original von beavisbee
Original von _fux_
Code:
		checkMod1 = pZahl % 2;
		checkMod2 = pZahl % 3;
		checkMod3 = pZahl % 5;
		if(checkMod1 == 0 || checkMod2 == 0 || checkMod3 == 0);

also ich bin zwar schon ziemlich müde und hab keine Muse mehr, den code auszuprobieren, aber ich möchte einfach mal behaupten, du hast da die 7 vergessen.


nope, die 7 ist die erste zahl die durch den prüfdurchlauf geht, ich glaube ich hätte da auch die 7 verwenden können, aber so einfach ist das nicht. da müsste ich auch die 13 einfügen ect..... weil 169 ist nicht durch 7 teilbar und ist lt. den prüfungen eine primzahl, jedoch ist 169 = 13*13, d.h. das wäre dann keine primzahl.

achte mal auf die variable pZahl:

Code:
int pZahl = 6;
	int selfZahl, intLast;
	int k = 0;
	primVec.push_back(2); primVec.push_back(3); primVec.push_back(5); 
	max -= 4;
	do{
		pZahl++;
.
.
.

7 wird als erstes "rechnerisch" gefunden.
ich will nochmal andeuten, es gibt definitiv bessere verfahren ;)


hey ArnoNühm, was meinste mit "das isn scherz, oder?".
wie gesagt, das teil habe ich einfach schnell runterprogrammiert und es findet sogar primzahlen (nur ganzzahlige). aber der code ist absolut ineffizient. es ist dazu gedacht maximal 100 primzahlen zu finden und das tut es noch relativ schnell und der code war auch schnell progrogrammiert (ca. 5 minuten).
es gibt schönere verfahren, dessen bin ich mir bewusst, aber ich hatte keine zeit um etwas schlaues zu basteln ;) bin doch erst seid nem Jahr am coden :-P (heißt: ich werde noch besser, ect...)
 
Hab mich halt gewundert, warum da code ohne frage dazu gepostet wird. Einige Zeilen find ich da schon sehr merkwürdig und schwer lesbar.

Code:
doubleLast = (double)pZahl/(double)selfZahl;
				intLast = pZahl/selfZahl;	
				selfZahl *= selfZahl;

				if(selfZahl == pZahl || doubleLast==intLast){ 

...
##################################
				if(pZahl%selfZahl == 0){ 

...

wäre das nicht das gleiche in lesbar und etwas schneller?

Das k sollte man auch nicht missbrauchen, um festzustellen, ob man ne faktorisierung gefundnen hat und stattdessen nen zusätzliches flag einführen. Das macht es anderen leichter den code zu verstehen.
Wenn du das ganze nen bsschen fixer haben möchtest könntetest du sieven. Hab da mal ne ähnliche Übung gemacht, als ich mit proggen angefangen hab. Ich suchs dir mal raus.

edit:

hier ist die sievefunction, die ich mal gebaut hab:

Code:
inline void setbit(unsigned int bit, unsigned int& bits)
{
	bits |= (1 << bit);
}

inline bool getbit(unsigned int bit, unsigned int bits)
{
	if((bits & (1 << bit)) != 0) return true;
	return false;
}

inline void sieve(unsigned int* a,unsigned int sieveMax)
{
	static unsigned sieved = 3;
	unsigned current = 3;
	for(;current <= sieveMax; current+=2)
	{
		if(!(getbit(current % 32, a[current / 32])))
		{
			unsigned i = current << 1;
			while(i < sieved){i += current;}//die zeile hier ist wohl noch etwas suboptimal, dazu barucht es eigentlich keine loop
			while(i <= sieveMax)
			{
				setbit(i % 32, a[i / 32]);//ist faktorisierbar
				i += current;
			}
		}
	}
	sieved = sieveMax;
}

die sievefunction bekommt ein array (von 32-bit werten) mit der groeße von midestens sievamax bits, welches mit 0 initialisiert ist und markiert alle faktorisierbaren zahlen mit 1. danach kann man die primzahlen (die verbliebenen 0-bits) ablesen. Auch das kann noch deutlich weiter optimiert werden, aber dazu braucht es dann etwas mehr code.
 
Warum denn immer so kompliziert?
Habe vor geraumer Zeit mal so ein kleines C-Prog geschrieben:
Code:
#include <stdio.h>

int main(int argc, char **argv)
{
	unsigned long p, d, max;
	char f;
	
	if(argc<2)
		max=1000;
	else
		max=strtoul(argv[1], NULL, 10);

	printf("2\n");

	for(p=3;p<=max;p+=2)
	{
		for(d=2,f=1;d*d<=p;d++)
		{
			if(!(p%d))
			{
				f=0;
				break;
			}
		}
		if(f)printf("%d\n",p);
	}
	return 0;
}

es findet sogar primzahlen (nur ganzzahlige)
Wie definierst du denn nicht-ganzzahlige Primzahlen?
Oder meinst du Primelemente in der Ringtheorie?

mfg, loose
 
DAS würde mich auch interessieren... Der einzige grund, warum ich den Thread überhaupt angeklickt habe :-)))

das liegt daran, weil ich mich mit dem Thema "primzahlen" erst gestern beschäfigt hat, vorwissen dazu habe ich auch kaum.
aus irgendeinem grund dachte ich, es gibt auch nicht ganzzahlige primzahlen :D
aber das "ganzzahlig" scheint wohl komplett überflüssig zu sein ;)
 
Original von farhaven
Das "kompliziert" mag damit zu tun haben, dass diese Brute-Force-Methode auf Dauer schwerst ineffizient ist :P

So weit ich weiß gibt zur primzahlfindung ausschließlich bruteforcemethoden (bessere und schlechtere). Fermatzahlen kann man zwar schneller finden, die sind aber nicht immer prim.
 
Original von _fux_
DAS würde mich auch interessieren... Der einzige grund, warum ich den Thread überhaupt angeklickt habe :-)))

das liegt daran, weil ich mich mit dem Thema "primzahlen" erst gestern beschäfigt hat, vorwissen dazu habe ich auch kaum.
aus irgendeinem grund dachte ich, es gibt auch nicht ganzzahlige primzahlen :D
aber das "ganzzahlig" scheint wohl komplett überflüssig zu sein ;)

primzahlen ist das nich stoff der vierten klasse in mathe?
 
Deswegen sagte ich ja auch "diese Brute-Force-Methode". Ausserdem würde ich das Sieb des Eratosthenes nicht als Brute-Force bezeichnen, da bei Brute-Force ja das schlichte durchprobieren von allen Möglichkeiten im Vordergrund steht.
 
Original von Chakky
Original von _fux_
DAS würde mich auch interessieren... Der einzige grund, warum ich den Thread überhaupt angeklickt habe :-)))

das liegt daran, weil ich mich mit dem Thema "primzahlen" erst gestern beschäfigt hat, vorwissen dazu habe ich auch kaum.
aus irgendeinem grund dachte ich, es gibt auch nicht ganzzahlige primzahlen :D
aber das "ganzzahlig" scheint wohl komplett überflüssig zu sein ;)

primzahlen ist das nich stoff der vierten klasse in mathe?

alle schuljahre VOR meinem studium waren (die einstellung ist und war nicht in jedem fall gut) für mich sehr uninteresant, ich hatte das gefühl', dass das, was ich da lern' absolut schwachsinnig für mich ist / sein wird. ich wollte schon immer wissen wir man spiele programmiert und nun bin ich fast am ziel - das problem ist, ich muss nun viel mehr tun um wieder "fit" (so richtig fit) im kopfe zu werden ;-)

und da kein interese da war, hatte ich auch nur alles mal einfach geschrieben (im schnitt 2 - 3) damit ichs besteh' - hängen geblieben ist kaum etwas.... (was ich im falle mathe sehr bereue, aber is trotzdem machbar ;-P )

p.s.:
zum erstenmal hab ich das gefühl was sinnvolles zu lernen und zu tun, das hatte ich definitv vorher kaum bis gar nicht gehabt - bis auf meine ausbildung, die mir ein wenig gebracht hatte, emfande ich alle anderen schulen für mich persönlich als zeitverschwendung, zumindest was das lernstoff betrifft (bis auf wenige ausnahmen!) ;) aber ich finde in den jahren lernt man "soziale kompentenz", alles ist alles gut gelaufen bis jez für mich ;)
 
Ich habe vor längerer Zeit mal einen Miller-Rabin-Primzahltest in C++ implementiert.

Miller-Rabin-Test@My Bloq

Dieser Test wird auch zum testen von sehr großen Primzahlen, wie für RSA benutzt.
Zum generieren könnte ich auch noch Marsenne Primzahlen empfehlen, musst du halt noch testen.

MFG
Ace
 
Hallo,
warum in die Ferne streifen, wenn das Nahe doch so gut ist:
Programmieraufgaben - Primzahlen mit versch. Tests


Irgendwie steig ich durch dein Code echt nicht durch, du machst da Operationen, die ich in dem Zusammenhang noch nie gesehen habe.


aber der code ist absolut ineffizient. es ist dazu gedacht maximal 100 primzahlen zu finden und das tut es noch relativ schnell
Also selbst mit sehr sehr sehr miesen Brute Force kann man problemlos die Primzahlen zwischen 2 und 1 Millionen ( ingesamt 78.498 ) sehr schnell finden.


primzahlen ist das nich stoff der vierten klasse in mathe?
Oder ~5 Semester Mathestudium - Zahlentheorie.
 
Original von Elderan
Irgendwie steig ich durch dein Code echt nicht durch, du machst da Operationen, die ich in dem Zusammenhang noch nie gesehen habe.
ach, so schwer is der nich .... :D war irgendwie mit nem "siebungsverfahren" und noch nem anderen check gemischt.


primzahlen ist das nich stoff der vierten klasse in mathe?
Oder ~5 Semester Mathestudium - Zahlentheorie.[/quote]

bin auf der fh und studiere informatik, was auch gut ist :D mathe ist nicht so meins, bzw. mir viel zu viel quatsch ;-P
 
Zurück
Oben