Liczby doskonałe

Liczby doskonałe to liczby naturalne, które są równe sumie swoich dzielników właściwych (tj. dzielników mniejszych od danej liczby).

Na przykład:

Liczba 6 - jej dzielniki to 1, 2, 3, i 6. Suma właściwych dzielników (czyli bez samej 6) to 1 + 2 + 3 = 6, więc 6 jest liczbą doskonałą.

Liczba 28 - jej dzielniki to 1, 2, 4, 7, 14, i 28. Suma właściwych dzielników (bez samej 28) to 1 + 2 + 4 + 7 + 14 = 28, więc 28 jest liczbą doskonałą.

Liczby doskonałe są znane od czasów starożytnych i mają wiele ciekawych właściwości oraz zastosowań w teorii liczb.

Pierwsze kilka liczb doskonałych to:

  • 6
  • 28
  • 496
  • 8128

Istnieje twierdzenie związane z liczbami doskonałymi i liczbami pierwszymi Mersenne’a, które mówi, że każda parzysta liczba doskonała ma postać 2p−1(2p−1), gdzie 2p−1 jest liczbą pierwszą Mersenne’a.

Na przykład:

  • Dla p=2, 22−1=3 jest liczbą pierwszą, więc liczba doskonała to 22−1×(22−1)=2×3=6 Dla p=3, 23−1=7 jest liczbą pierwszą, więc liczba doskonała to 23−1×(23−1)=4×7=28
  • Dla p=4, 24-1=15 nie jest liczbą pierwszą
  • Dla p=5, 25−1=31 jest liczbą pierwszą, więc liczba doskonała to 25−1×(25−1)=16×31=496
  • itd.

Wszystkie znane liczby doskonałe są parzyste. Nie wiadomo, czy istnieją nieparzyste liczby doskonałe, chociaż wiele dowodów wskazuje na to, że jeśli istnieją, to muszą być bardzo duże.

Algorytm do wyszukiwania liczb doskonałych

1. Znajdź liczby pierwsze Mersenne’a

Liczba pierwsza Mersenne’a ma postać 2p−1, gdzie p jest liczbą pierwszą.

2. Generuj liczby doskonałe

Używając liczby pierwszej Mersenne’a 2p−1, wygeneruj liczbę doskonałą jako 2p−1×(2p−1)

Implementacja algorytmu do wyszukiwania liczb doskonałych w języku Python

Poniższy kod w Pythonie znajduje liczby doskonałe, korzystając z powyższego algorytmu

def is_prime(n):
    if n <= 1:
        return False
    if n <= 3:
        return True
    if n % 2 == 0 or n % 3 == 0:
        return False
    i = 5
    while i * i <= n:
        if n % i == 0 or n % (i + 2) == 0:
            return False
        i += 6
    return True
def find_perfect_numbers(limit):
    perfect_numbers = []
    p = 2  # Start with the smallest prime number
    while len(perfect_numbers) < limit:
        mersenne_prime = (2 ** p) - 1
        if is_prime(mersenne_prime):
            perfect_number = (2 ** (p - 1)) * mersenne_prime
            perfect_numbers.append(perfect_number)
        p += 1
    return perfect_numbers

#Ustal limit liczby doskonałych, które chcesz znaleźć
limit = 4
perfect_numbers = find_perfect_numbers(limit)
print(perfect_numbers)

Komentarze