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