- Weź dowolną liczbę czterocyfrową, w której istnieją choć dwie różne cyfry.
- Utwórz nową liczbę czterocyfrową segregując cyfry badanej liczby w porządku malejącym.
- Utwórz nową liczbę czterocyfrową, która jest lustrzanym odbiciem liczby z punktu 2.
- Nową liczbą badaną niech będzie wynik odejmowania liczby z punktu 3 od liczby z punktu 2.
- Wróć do punktu 2.
(źródło: Wikipedia)
Za każdym razem, maksymalnie przy dziesiątej iteracji tego algorytmu wynikiem będzie liczba 6174, która następnie będzie się powtarzać. Ta oto liczba nazwana została na cześć odkrywcy stałą Kaprekara.Aby przedstawić funkcjonowanie tego algorytmu, napisałem prosty skrypt w Perlu:
use strict; use warnings; my $randn; if ($ARGV[0]) { $randn = $ARGV[0]; } else { $randn = sprintf '%s', int(rand(9999)) + 1000; } sub findNum { my @num = split(//, shift @_); my $mirrn = join("", sort @num); my $revn = join("", reverse sort @num); print "$revn - $mirrn = ". ($revn - $mirrn) ."\n"; return ($revn - $mirrn); } my $num = &findNum($randn); my $iter = 0; while ($num ne 6174) { $num = &findNum($num); $iter++; die "Nieprawidlowa liczba poczatkowa: $randn\n" unless $iter <= 10; } print "\nLiczba poczatkowa: $randn\nWynik: $num\nLiczba iteracji: ". ($iter+1) ."\n";Skrypt można wywołać z parametrem będącym liczbą początkową, lub bez parametru, w tym przypadku przyjęta zostanie losowa liczba.
W piątym wieku p.n.e. Pitagoras odkrył istnienie tak zwanych liczb zaprzyjaźnionych. Liczby zaprzyjaźnione to para liczb naturalnych, takich że suma dzielników każdej z tych liczb równa się drugiej.
Pierwszą parą, jaką odkrył Pitagoras jest 220 i 284:
- 220 = 1 + 2 + 4 + 71 + 142 (dzielniki 284)
- 284 = 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 (dzielniki 220)
Jak dotąd nie wiadomo, czy istnieje nieskończenie wiele par liczb zaprzyjaźnionych oraz czy istnieje taka para liczb o różnej parzystości. Tym zagadnieniem zajmowało się wiele matematyków, takich jak Kartezjusz, Fermat czy Euler.
Oto skrypt mojego autorstwa, który sprawdza czy podana liczba posiada liczbę zaprzyjaźnioną:
use strict; use warnings; my $fn = $ARGV[0]; sub getNum { my $num = shift @_; my $d = 0; for (my $i = 2; $i <= $num; $i++) { if (!($num % $i)) { $d = $d + ($num / $i); } } return $d; } my $fNum = &getNum($fn); if (&getNum($fNum) == $fn) { print "Odnaleziono liczby zaprzyjaznione: $fn i $fNum\n"; } else { print "Nie odnaleziono liczby zaprzyjaznionej do $fn\n"; }Należy go wywołać podając jako argument szukaną liczbę.

