Autor Zpráva
janbarasek
Profil
Ahoj,
už nějakou dobu používám následující PHP funkci, kterou jsem před časem navrhl a nyní mi přestala z ničeho nic fungovat. Nevyšel náhodou nějaký update?

Chybová hláška

[Wed Aug 20 13:27:27.784320 2014] [:error] [pid 25808] [client 127.0.0.1:46152] PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in /var/www/html/math/function.php on line 176, referer: http://localhost/math

Zdrojový kód

Chybový řádek jsem zvýraznil.
function kraceni($a, $b) {
    if ($a == $b) { return '1'; }
    if ($b == 1) { return $a; }
    if ($b == 0) { return 'INF'; }
    while (strpos($a, '.') !== false || strpos($b, '.') !== false) { $a *= 10; $b *= 10; }
    $prvocisla = '2;3;5;7;11;13;17;19;23;29;31;37;41;43;47;53;59;61;67;71;73;79;83;89;97;101;103;107;109;113;127;131;137;139;149;151;157;163;167;173;179;181;191;193;197;199;211;223;227;229;233;239;241;251;257;263;269;271;277;281;283;293;307;311;313;317;331;337;347;349;353;359;367;373;379;383;389;397;401;409;419;421;431;433;439;443;449;457;461;463;467;479;487;491;499;503;509;521;523;541;547;557;563;569;571;577;587;593;599;601;607;613;617;619;631;641;643;647;653;659;661;673;677;683;691;701;709;719;727;733;739;743;751;757;761;769;773;787;797;809;811;821;823;827;829;839;853;857;859;863;877;881;883;887;907;911;919;929;937;941;947;953;967;971;977;983;991;997;1009';
    $parser = explode(';', $prvocisla);
    $x = 0;
    while ($x < 169) {
        if ($a%$parser[$x] == 0 && $b%$parser[$x] == 0) {
            if (kraceni($a/$parser[$x], $b/$parser[$x]) == ($a/$parser[$x]).'|'.($b/$parser[$x])) {
                return ($a/$parser[$x]).'|'.($b/$parser[$x]);
            } else {
                return kraceni($a/$parser[$x], $b/$parser[$x]);
            }
        }
        if ($a < $parser[$x] || $b < $parser[$x]) { break; }
        $x++;
    }
    return $a.'|'.$b;
}
Mikro FAQ: Ano, vím že mám prvočísla v řetězci a nemělo by se to... ale výkonově to vychází pořád lepší, než je pokaždé počítat, nebo používat jiné metody ověření dělitelnosti.
Alphard
Profil
Prostě došla paměť. Co to má vlastně dělat? Nechce se mi to detailně studovat, ale soudě dle názvu funkce, nebylo by lepší použít Eukleidův algoritmus?

Doplňuji, to nemluvím o dalších nevhodných věcech, proč seznam prvočísel není aspoň statický? Proč drahou funkci kraceni() voláš 2x se stejnými parametry? Radši to moc nečíst :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: