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:

  1. for n in range(10, 10000):
  2.     wykladnik = len(str(n))
  3.     cyfry = list(map(int, str(n)))
  4.     suma = 0
  5.     for c in cyfry:
  6.         suma += c ** wykladnik
  7.     if suma == n:
  8.         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ę:

  1. for n in range(10, 100000000):
  2.     wykladnik = len(str(n))
  3.     cyfry = list(map(int, str(n)))
  4.     suma = 0
  5.     for c in cyfry:
  6.         suma += c ** wykladnik
  7.         if suma > n:
  8.             break
  9.     if suma == n:
  10.         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ć.

2
Dodaj komentarz

avatar
1 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
xpilel toro Recent comment authors
  Subscribe  
najnowszy najstarszy oceniany
Powiadom o
P R
Edytor
P R

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

%d bloggers like this: