Dokonalé číslo je takové přirozené číslo, které má stejnou hodnotu, jako součet všech jeho kladných dělitelů (kromě jeho samého). První dokonalá čísla jsou 6, 28, 496, 8128 a všechna jsou ve tvaru 2^{n-1} \\cdot (2^{n} - 1). Řecký matematik Euklides dokázal, že tento vzorec vrátí vždy dokonalé číslo, pokud je 2^{n} - 1 prvočíslo.

Dosud byla nalezena pouze sudá dokonalá čísla, ale existence lichých nebyla doposud vyvrácena. Dle současných poznatků musí být liché dokonalé číslo vyšší než 10^{300}.

Příklady dokonalých čísel

6 = 3 + 2 + 1
28 = 14 + 7 + 4 + 2 + 1
496 = 248 + 124 + 62 + 31 + 16 + 8 + 4 + 2+ 1
8128 = 4064 + 2032 + 1016 + 508 + 254 + 127 + 64 + 32 + 16 + 8 + 4 + 2 + 1

Kód

    /**
     * Checks whether the number is perfect
     * @param number tested number
     * @return true if the number is perfect, false otherwise
     */
    public static boolean isPerfect(long number) {
        //odd perfect number (probably) does not exist, and even if it does, it has a higher value than long can represent
        if (number % 2 == 1) {
            return false;
        }

        long result = 1; //1 is a trivial divisor
        long i = 2;
        while (i * i <= number) { //until i <= sqrt(number)
            if (number % i == 0) {
                result += i;
                result += number / i;
            }
            i++;
        }
        if (i * i == number) { //perfect square, sqrt(number) was added twice
            result -= i;
        }
        return result == number;
    }
/**
 * Checks whether the number is perfect
 * @param $number tested number
 * @return true if the $number is perfect, false otherwise
 */
function isPerfect($number) {
    if ($number % 2 == 1) {
        return false;
    }

    $result = 1; //1 is a trivial divisor
    $i = 2;
    while ($i * $i <= $number) { //until i <= sqrt(number)
        if ($number % $i == 0) {
            $result += $i;
            $result += $number / $i;
        }
        $i++;
    }
    if ($i * $i == $number) { //perfect square, sqrt(number) was added twice
        $result -= $i;
    }
    return $result == $number;
}

[/language] [/tab] [/tabs]






Místo pro váš banner

Zde je vyhrazené místo pro bannery našich partnerů a zákazníků.