Pchełki Python: narcystycznie

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ć.

Autor: xpil

Po czterdziestce. Żonaty. Dzieciaty. Komputerowiec. Krwiodawca. Emigrant. Rusofil. Lemofil. Sarkastyczny. Uparty. Mól książkowy. Ateista. Apolityczny. Nie oglądam TV. Uwielbiam matematykę. Walę prosto z mostu. Gram na paru instrumentach. Lubię planszówki. Słucham bluesa, poezji śpiewanej i kapel a’capella. || Kliknij tutaj po więcej szczegółów ||

Dodaj komentarz

2 komentarzy do "Pchełki Python: narcystycznie"

Powiadom o
avatar
Sortuj wg:   najnowszy | najstarszy | oceniany
P R
Edytor

Armstrong…Armstrong.. Musi o tego cyklistę chodzić.

wpDiscuz