<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html>
<head>
<title>Prvočísla 2.0</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250" />
<meta name="author" content="Ondřej Staněk: ostan at gmail.com" />
</head>
<body>
<?php
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Tento kód vytvořil Ondřej Staněk (http://www.ostan.tk, resp. www.gvp.cz/~ostan) *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/
$max = $_GET['max'];
class stopky { // trida stopky měří, za jak dlouho se kód zpracuje
var $start;
function getmicrotime () {
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
function stopky () {
$this->start = $this->getmicrotime();
}
function stop () {
return $this->getmicrotime() - $this->start;
}
}
class prvocisla {
// nadefinovani prvniho prvocisla (slouzi k vypoctu ostatnich)
var $prvocisla = array(2);
var $max;
// zjistuje, zda je cislo delitelne
function JeDelitelne ($delenec, $delitel) {
return ($delenec % $delitel == 0) ? TRUE : FALSE;
}
// zjistuje, zda je predhozene cislo prvocislem
function JePrvocislo ($cislo) {
$JePrvocislo = TRUE;
// projde cele pole a zkusi cislo delit prvocislama v tabulce
foreach ($this->prvocisla as $id => $prvocislo) {
if ($this->JeDelitelne($cislo, $prvocislo)) {
$JePrvocislo = FALSE;
break; // Jestlize je delitelne, vyskoc ze smycky
}
if ($prvocislo * $prvocislo >= $cislo) { break; } // pokud je druha mocnina prvocisla vetsi nez cislo, uz nepokracuj
//tento radek vyrazne zrychluje skript (asi 15x)
}
return $JePrvocislo; // odpovez, jestli je to prvocislo
}
function prvocisla ($max) {
$this->max=$max;
for ($cislo=3; $cislo <= $max; $cislo++) { // zkousi kazde cele cislo v intervalu <3, $max>
if ($this->JePrvocislo($cislo)) {
$this->prvocisla[] = $cislo; // pokud to je prvocislo, pridej ho do tabulky
}
}
}
function ArrayPrvocisla () {
return $this->prvocisla; // vrati obsah pole $this->prvocisla
}
}
// trida, ktera resi vystup programu
class output {
function output ($pole) {
echo "<table border=\"1\">\n";
$sloupcu = ceil (bcsqrt (count($pole), 1)); // pocet sloupcu v tabulce; vypocti tak, aby byl ctverec
$n = 0;
for ($radek = 0; $radek < $sloupcu; $radek++) {
echo "<tr>";
for ($sloupec = 0; $sloupec < $sloupcu; $sloupec++) {
echo "<td>". $pole[$n] ."</td>";
$n++;
}
echo "</tr>\n";
}
echo "</table>\n";
}
}
if (empty($max)) { $max=1000; }
$stopky = new stopky;
$prvocisla = new prvocisla($max);
new output($prvocisla->ArrayPrvocisla());
echo "<p>Nalezeno ". count($prvocisla->prvocisla) ." prvočísel ";
echo "z čísel od 2 do ". $prvocisla->max;
echo "<br>Stránka se generovala ". $stopky->stop() ." vteřiny</p>\n";
?>
<hr />
<p><a href="zdrojak.php">Zobrazit zdrojový kód</a></p>
</body>
</html>