Pchełki Python: narcystycznie

https://xpil.eu/Z5qQ0

TL; DR: Dziś będzie troszkę matematyki rekreacyjnej, jak pogardliwie zwykli byli nazywać tego typu łamigłówki Prawdziwi Matematycy, czyli - jak mawiał Wieszcz - ludzie, którzy potrafią policzyć do Dwudziestu bez zdejmowania Butów.

Liczba narcystyczna to taka liczba k-cyfrowa, która jest sumą k-tych potęg własnych cyfr.

Ktoś upierdliwy (są tacy na sali?) mógłby się przypieprzyć do warstwy językowej powyższej definicji - i miałby absolutną rację. Cyfr nie da się podnosić do potęgi. Ale ponieważ żaden z Czytelników tego nie wyłapał, przymkniemy oko.

Czyli jeszcze raz: bierzemy liczbę k-cyfrową, dzielimy ją na pojedyncze cyfry, każdą z tych cyfr podnosimy...

Zastanawiał się ktoś może, dlaczego mówi się "cyfr i liter" a nie "litr i cyfer"? Nie? To dobrze, ja też nie. A co z "szewc i krawiec" vs "krawc i szewiec"? Hm.

... podnosimy, powiadam, do k-tej potęgi, a następnie wyniki owego potęgowania sumujemy. W wyniku dostajemy liczbę, od której zaczęliśmy.

Na przykład 153: 13 + 53 + 33 = 153.

Czy jest takich liczb więcej?

Sprawdźmy:

for n in range(10, 10000):
    wykladnik = len(str(n))
    cyfry = list(map(int, str(n)))
    suma = 0
    for c in cyfry:
        suma += c ** wykladnik
    if suma == n:
        print(n)

Na wyjściu powyższego skryptu dostajemy:

153
370
371
407
1634
8208
9474

Przy okazji, proszę zauważyć, że wykluczyłem liczby 0-9, które są przypadkiem trywialnym.

A co z większymi zakresami? Zmieniłem w powyższym kodzie 10000 na 10000000 i doszły jeszcze cztery dodatkowe liczby narcystyczne:

54748
92727
93084
548834

Dodajemy malutką optymalizację:

for n in range(10, 100000000):
    wykladnik = len(str(n))
    cyfry = list(map(int, str(n)))
    suma = 0
    for c in cyfry:
        suma += c ** wykladnik
        if suma > n:
            break
    if suma == n:
        print(n)

Zwiększamy zakres do 100000000 (stu milijonów):

(po chwili oczekiwania):

1741725
4210818
9800817
9926315
24678050
24678051
88593477

Na liście pojawiły się dwie liczby sąsiadujące ze sobą. Ciekawe, czy jest więcej takich przypadków (nie licząc 370 - 371 powyżej). Hm. Skrypt w Pythonie zaczął już niemiłosiernie mulić, więc pomyślałem sobie, że można by go jeszcze jakoś przyspieszyć. Tylko, kurdę, jak? Tu już mi się oleum skończyło, więc...

{guglguglguglguglgugl...guglgugl...guglguglgugl...}

...ha! Okazuje się, że liczb narcystycznych jest łącznie 88. Jeżeli komuś się akurat popsuła gugielnica, albo jeżeli ktoś jest zbyt leniwy, żeby z niej skorzystać, ale pomimo to zżera go (lub ją) ciekawość, podaję tu pełną listę:

1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834, 1741725, 4210818, 9800817, 9926315, 24678050, 24678051, 88593477, 146511208, 472335975, 534494836, 912985153, 4679307774, 32164049650, 32164049651

Przy okazji widać, że dwie największe liczby narcystyczne też ze sobą sąsiadują.

Dowiedziałem się również, że inna nazwa tych liczb to liczby Armstronga. Nie wiem tylko, czy chodzi o tego trębacza, czy może astronautę. A może o Williama Warda Armstronga, kanadyjskiego matematyka? Hm. Tyle pytań, tak niewiele czasu...

Zaprawdę, powiadam Wam, nie wiadomo, co z tą całą wiedzą robić.

https://xpil.eu/Z5qQ0

2 komentarze

Leave a Comment

Komentarze mile widziane.

Jeżeli chcesz do komentarza wstawić kod, użyj składni:
[code]
tutaj wstaw swój kod
[/code]

Jeżeli zrobisz literówkę lub zmienisz zdanie, możesz edytować komentarz po jego zatwierdzeniu.