WinFuture-Forum.de: Primzahlen berechnen in php - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Primzahlen berechnen in php Primzahlen in php berechnen


#1 Mitglied ist offline   Milka_Kuh 

  • Gruppe: Mitglieder
  • Beiträge: 1
  • Beigetreten: 16. Mai 12
  • Reputation: 0

geschrieben 16. Mai 2012 - 18:21

Hallo, ich habe eine Frage:
Ich muss in php etwas erstellen, wo ich eine Zahl eingeben kann und das zeigt mir an, ob die eingegebene Zahl eine Primzahl ist oder nicht.
Zurzeit hab ich das:
<?php
$a = $_POST["Zahl"];
$count = 2;

if ($a = 1){
echo "Die Zahl " $a " ist keine Primzahl!";
}else{
while ($count <= 1000){
if ($a % $count = 0) {
echo "Die Zahl " $a " ist eine Primzahl!";
}else{
$count +1;
}
}
}
if (mod != 0){
echo "Die Zahl " $a " ist keine Primzahl!";
?>

ich habe jedoch keine Ahnung ob das stimmt...kann mir vielleicht irgendwer bei meinem Problem helfen? Danke!
0

Anzeige



#2 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.115
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 16. Mai 2012 - 19:25

Willkommen im Forum!

Mit PHP kann ich Dir nicht weiterhelfen, aber zumindest beim Algorithmus könntest Du Dir das mal angucken. Du überprüfst z.B. nur, ob der Rest einer Division 0 ist. Das reicht als Bedingung aber nicht aus (4 % 2 = 0, aber 4 ist nicht prim). Andersrum wird ein Schuh draus. Wenn sich bis zur zu prüfenden Zahl keine Divisionen mit einem Rest von 0 finden, handelt es sich um eine Primzahl. Aus Effizienzgründen sollte man davon ausgehen, daß es sich um eine Primzahl handelt und abbrechen, wenn man doch einen Teiler findet.

Dieser Beitrag wurde von Mr. Floppy bearbeitet: 16. Mai 2012 - 19:29

0

#3 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 16. Mai 2012 - 19:32

Schau dir mal den Sieb des Eratosthenes an. Das ist mWn der einfachste Algorithmus um sich Primzahlen ausgeben zu lassen.

Wenn du dich traust, kannst du es auch mit etwas komplizierterem versuchen, wie dem Miller Rabin Test oder AKS.
0

#4 Mitglied ist offline   deezee 

  • Gruppe: aktive Mitglieder
  • Beiträge: 119
  • Beigetreten: 05. Februar 09
  • Reputation: 0

geschrieben 16. Mai 2012 - 21:17

maximal bis zur hälfte von $a zählen und nur auf ungrade Ziffern prüfen

Dieser Beitrag wurde von deezee bearbeitet: 16. Mai 2012 - 21:28

0

#5 Mitglied ist offline   __42__ 

  • Gruppe: aktive Mitglieder
  • Beiträge: 38
  • Beigetreten: 10. März 12
  • Reputation: 5

geschrieben 16. Mai 2012 - 22:45

$a % $count = 0
Tests auf Gleichheit werden in PHP mit "==" bzw. "===" durchgeführt.
0

#6 Mitglied ist offline   Ludacris 

  • Gruppe: Moderation
  • Beiträge: 4.668
  • Beigetreten: 28. Mai 06
  • Reputation: 218
  • Geschlecht:Männlich

geschrieben 17. Mai 2012 - 21:34

<?php
$i = (int)$_GET["zahl"];
for($i=1; $i<=10000; $i++){
	if($i==1){
		echo $i."<br>";
	}
	else if($i==2 || $i==3){
		echo $i."<br>";
	}
	else if(($i%2)!=0){
		if(($i%3)!=0){
			echo $i."<br>";
		}
	}

}
?>


der Code gibt dir Primzahlen bis 10000 aus :)

<?php
$i = (int)$_GET["zahl"];
if($i==2 || $i==3){
	echo $i." ist eine Primzahl.<br>";
}
else if(($i%2)!=0){
	if(($i%3)!=0){
		echo $i." ist eine Primzahl.<br>";
	}
	else 
	{
		echo $i." ist keine Primzahl.<br>";
	}
}
else 
{
	echo $i." ist keine Primzahl.<br>";
}
?>

und der hier gibt dir aus ob die zahl im URL Parameter eine Primzahl ist oder nicht :)
0

#7 Mitglied ist offline   TO_Webmaster 

  • Gruppe: Moderation
  • Beiträge: 3.212
  • Beigetreten: 27. März 02
  • Reputation: 82
  • Geschlecht:Männlich

geschrieben 17. Mai 2012 - 22:57

 Zitat (Ludacris: 17. Mai 2012 - 21:34)

der Code gibt dir Primzahlen bis 10000 aus :)

Hmm, der gibt z.B. auch 25 (=5*5) aus.

Hier meine Implementierung:

<?PHP

function modpot( $p, $c, $m )
{
	$r = 1;
	
	while( $c ){
		if( $c % 2 )
			$r = ( $r * $p ) % $m;
		$p = ( $p * $p ) % $m;
		$c = $c >> 1;
	}
	
	return $r;
}

function isprime( $n ){

	if( $n < 3 )
		return $n - 1;

	if( $n % 2 == 0 )
		return 0;
	
	$d = $n - 1;
	$s = 1;
	
	while( ( $d = $d >> 1 ) % 2 == 0 )
		++$s;
		
	$z = array( 2, 7, 61 );
		
	foreach( $z as $a ){
	
		if( $a < $n && modpot( $a, $d, $n ) != 1 ){
			$c = 1;
			for( $r = 0; $r < $s; ++$r )
				if( modpot( $a, ( 1 << $r ) * $d, $n ) == $n - 1 )
					$c = 0;
			if( $c )
				return 0;
		}
	}
	
	return 1;
}




$zahl = (int) $_GET['n'];

if( $zahl <= 0 || (string) $zahl !== (string) $_GET['n'] ){
	echo 'grr!';
} else {
	echo $zahl . ' ist ' . ( isprime( $zahl ) ? 'wahrscheinlich' : 'nicht' ) . ' prim.<br />';
}

echo '<br /><br />Beispielprimzahlabfragen:<br /><br />';

for( $i = 0; ++$i < 10000; ){
	echo $i . ' ist ' . ( isprime( $i ) ? 'wahrscheinlich' : 'nicht' ) . ' prim.<br />';
}

?>



MfG TO_Webmaster
The old reverend Henry Ward Beecher
called a hen the most elegant creature.
The hen pleased for that,
laid an egg in his hat.
And so did the hen reward Beecher.
0

#8 Mitglied ist offline   Ludacris 

  • Gruppe: Moderation
  • Beiträge: 4.668
  • Beigetreten: 28. Mai 06
  • Reputation: 218
  • Geschlecht:Männlich

geschrieben 18. Mai 2012 - 00:09

stimmt, ich hab die überprüfung auf 5er und 7er nicht eingebaut. mit

for($i=1; $i<=10000; $i++){
	if($i==1){
		echo $i."<br>";
	}
	else if($i==2 || $i==3){
		echo $i."<br>";
	}
	else if(($i%2)!=0){
		if(($i%3)!=0){
			if(($i%5) !=0){
				if(($i%7)!=7){
					echo $i."<br>";
				}
			}
		}
	}
}

sollte es gehen
0

#9 Mitglied ist offline   __42__ 

  • Gruppe: aktive Mitglieder
  • Beiträge: 38
  • Beigetreten: 10. März 12
  • Reputation: 5

geschrieben 18. Mai 2012 - 01:43

 Zitat (Ludacris: 18. Mai 2012 - 00:09)

stimmt, ich hab die überprüfung auf 5er und 7er nicht eingebaut. mit

for($i=1; $i<=10000; $i++){
	if($i==1){
		echo $i."<br>";
	}
	else if($i==2 || $i==3){
		echo $i."<br>";
	}
	else if(($i%2)!=0){
		if(($i%3)!=0){
			if(($i%5) !=0){
				if(($i%7)!=7){
					echo $i."<br>";
				}
			}
		}
	}
}

sollte es gehen

11*11=121
0

#10 Mitglied ist offline   Mr. Floppy 

  • Gruppe: VIP Mitglieder
  • Beiträge: 4.115
  • Beigetreten: 01. Juli 08
  • Reputation: 271
  • Geschlecht:Männlich

geschrieben 18. Mai 2012 - 08:57

@Ludacris
Ganz so einfach ist es dann doch nicht. TO_Webmaster und __42__ haben ja schon darauf hingewiesen, wo das Problem liegt. Deine Methode findet nur Primzahlen, die kleiner als das Quadrat der nächst größeren Primzahl sind. Beispiel: Wenn Du die 11 jetzt auch noch hinzufügst, gibt's den nächsten Fehler bei 13². Der Code müßte also alle Primzahlen für die Moduloberechnung bereits enthalten. Dann würde aber auch eine simple Liste genügen. Die ist aber dummerweise unendlich groß.

Dieser Beitrag wurde von Mr. Floppy bearbeitet: 18. Mai 2012 - 09:09

1

#11 Mitglied ist offline   Leshrac 

  • Gruppe: VIP Mitglieder
  • Beiträge: 1.518
  • Beigetreten: 14. November 05
  • Reputation: 140
  • Geschlecht:Männlich
  • Wohnort:Whangaroa (NZ)

geschrieben 18. Mai 2012 - 12:00

 Zitat (Witi: 16. Mai 2012 - 19:32)

Schau dir mal den Sieb des Eratosthenes an. Das ist mWn der einfachste Algorithmus um sich Primzahlen ausgeben zu lassen.

Yup.

Zitat

Wenn du dich traust, kannst du es auch mit etwas komplizierterem versuchen, wie dem Miller Rabin Test oder AKS.

Da gibt es eine "fertigloesung" vom MIT, mal so als inspiration :D

Ansonsten, je groesser die werte werden desto groesser wird auch der rechenaufwand mit solch einem einfachen script. Man kann das natuerlich noch ein bisschen optimieren, indem man alle zahlen ueber 5 ausschliesst die nicht auf 1, 3, 7 oder 9 enden. Sieht dann so aus:

function isPrime($n)
{
if ($n > 5)
{
if (! in_array(substr($n, -1), array(1, 3, 7, 9))) // quick win
return false;

for ($i=2; $i<=floor(sqrt($n)); $i )
{
if ($n % $i === 0)
return false;
}
}
elseif ($n == 4) // 2, 3 and 5 are prime
return false;

return true;
}


Dieser Beitrag wurde von Leshrac bearbeitet: 18. Mai 2012 - 17:02

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0