Primzahlen

Wolfsbein

Erfahrenes Mitglied
Hallo
ich experimentiere etwas mit der Ausgabe von Primzahlen. Hier mal meine PHP Lösung, die fast genauso auch in C oder JAVA funktioniert.
PHP:
<?php
// Primzahlencheck
function getModulo($rgPrim,$number) {
    for($i=0;$i<count($rgPrim);$i++)
    {
        if($number % $rgPrim[$i] == 0) {
            return false;
        }
    }
    return true;
}

$rgPrim = array(2);
$i=3;
$max=100;

while($i<$max)
{
    if(getModulo($rgPrim,$i)) {
        $rgPrim[] = $i;
    }
    $i++;
}
// Zahlen ausgeben
echo '<pre>';
print_r($rgPrim);
echo '</pre>';
?>
Gäbe es einen schnelleren Ansatz?
 
Ja! Geschwindigkeitssteigerung um ca. 100%:

$i++; durch $i += 2; ersetzen :)

edit: Ja, ok, nicht wirklich 100%, da die geraden Zahlen ja eh beim ersten Modulo-Check rausfliegen. Sollte aber mit Zweierschritten trotzdem einen Tick schneller sein.
 
Zuletzt bearbeitet:
Servus!

Sicher!

Code:
public class PrimeTest{

	public PrimeTest(){
	
	}
	
	public boolean isPrime(int n){
		if(n<2)
			return false;
		if (n==2)
			return true;
		if((n % 2) == 0)
			return false;
		for(int i = 3; i <= Math.sqrt(n); i+=2)
				if( (n % i) == 0)
					return false;
		return true;
	}
	
	public void doIt(){
		for(int i = 0; i < 100;i++)
			if(isPrime(i))
				System.out.println("Primzahl:" + i);
	}
	
	public static void main(String[] args){
		new PrimeTest().doIt();
	}

}

Gruß Tom
 
@Tom: das mit der Wurzel musst du mir erklären.?
Und dass der Test auf n<1 bzw. n=2 schneller sein soll glaube ich nicht ganz. Denn sobald n>2 ist und das geht ja sehr schnell ;) sind diese beiden if-Abfragen überflüssig und bremsen doch, oder?
 
Servus!

Die erste IF- Abfrage dient zur Sicherheit ... das ja niemand versucht eine nicht Natürliche Zahl auf Prim zu testen ...

Der Test ==2 muss auch rein, da sonnst die einzige gerade Primzahl 2 bei

n % 2 == 0 herausfliegen würde ...

Und man muß nur deshalb bis zur Wurzel der Zahl prüfen, da die Teiler einer Zahl immer paarweise auftreten, z.B. bei 105 = 7*15 ist mit 7 auch 15 Teiler von 105. Dabei ist immer der eine Teiler kleiner und der andere größer als die Wurzel aus der Zahl; nur bei Quadratzahlen können beide gleich groß sein, z.B. 81=9*9. Wenn also keine Teiler vorhanden sind, die kleiner oder gleich der Wurzel aus der Zahl sind, dann kann es auch keine größeren Teiler geben. Das bedeutet aber, dass wir die Schleife in der Primzahlprobe höchstens so lange durchlaufen müssen, bis der Teiler die Wurzel erreicht.

Gruß Tom
 
Danke das hilft mir weiter.
@Reima: Bei dir ist noch ein kleiner Fehler drin. Wenn du mit $i += 2 arbeitest (in der while Schleife meintestd du doch?), dann wird die Drei ausgelassen.
 
Es geht auch noch schneller!
PHP:
<?php
	$prim[0] = 2;
	$primXn[0] = 2;
	
	$n = 3;
	$max = 40000;
	
	while( $n < $max )
	{
		$length = count($prim);
		
		for ( $idx=0 ; $idx < $length ; $idx++ )
		{
			if( $primXn[$idx] < $n ) $primXn[$idx] += $prim[$idx];
			if( $primXn[$idx] == $n ) $idx = $length+1;
		}
		
		if( $idx == $length )
		{
			$prim[$idx] = $n;
			$primXn[$idx] = $n;
		}
		
		$n+=2;
	}
	
echo '<pre>';
print_r($prim);
echo '</pre>';

?>

Dieser Code dürfte seine Stärke besonders bei großen Zahlen haben, da Modulo dann immer aufwändiger wird.

EDIT:
Änderung zurückgenommen.


Gruß
Falk
 
Zuletzt bearbeitet:
Jetzt habe ich noch eine Frage an die JAVA Experten. Wie kann ich meine PHP Lösung möglichst nahe nach JAVA portieren? Es geht mir hauptsächlich um das Array mit den bisher errechneten Primzahlen. Ich weiß, dass ich in JAVA keine dynamischen Arrays erzeugen kann. Die bisher geposteten JAVA Implementierungen geben die gefundene Variable ja immer gleich aus.
Und der Code von Thomas
Code:
for(int i = 3; i <= Math.sqrt(n); i+=2)
if( (n % i) == 0)
return false;
ist dann ja wieder langsammer, da immer alle i+2 geprüft werden. Bei meiner PHP Lösung werden ja nur die Primzahlen aus dem Array zum Testen hergenommen (Jede Zahl ist aus Primzahlen zusammengesetzt, außer sie ist selbst eine, oder? Primfaktorzerlegung).
 
Ich habe ein paar Tests mit dem PHP Code auf einem P4 3GHz HT durchgeführt.
PHP-Version: 4.3.2
Apache 1.3.27

// 50 000: 18.403012991
// 100 000: 61.8537489176

// 50 000 und $i += 2: 17.8556699753
// 50 000 vogtländer code: 17.7759870291

Man sieht das die Unterschiede zwischen $i++ und $i+=2 sehr gering sind. Kann das vielleicht mal jemand auf einem anderen System ausprobieren?
 

Neue Beiträge

Zurück