Wczoraj szukaliśmy sobie iloczynów palindromicznych. Dziś zajmiemy się zagadnieniem równie fascynującym, a może nawet jeszcze bardziej: poszukamy sześciocyfrowych iloczynów cyklicznych.
Małe wyjaśnienie: "iloczyn cykliczny" to pojęcie, które wymyśliłem naprędce przed chwilą, proszę więc nie traktować go zbyt oficjalnie.
Iloczynem cyklicznym, według mojej tymczasowej definicji, nazywamy iloczyn, w wyniku którego dostajemy liczbę będącą "obróceniem" jednej z liczb mnożonych.
Przykład: 142857 * 2 = 285714. 142857 składa się z tych samych cyfr co 285714, i to nawet w tej samej kolejności, gdyby "nawlec" cyfry na zamkniętą pętlę, ewentualnie zapisać je na pasku papieru i skleić ten pasek w obręcz.
Inny przykład: 142857 * 3 = 428571
I jeszcze jeden: 142857 * 4 = 571428
Jak widać, liczba 142857 jest pod tym względem bardzo "płodna" - tak naprawdę można ją przemnożyć przez dowolną liczbę całkowitą między 1 a 6 i wynik będzie "zapętlony".
Czy jednak istnieją inne takie liczby sześciocyfrowe?
Spróbujmy zaprząc do tego naszego ulubionego SQL-a i zobaczyć, co z tego wyjdzie.
Tradycyjnie już przypominam, że rozwiązywanie problemów numerycznych za pomocą serwera baz danych jest odpowiednikiem obierania jajek za pomocą koparki i młota pneumatycznego: da się, ale po pierwsze, przy większej ilości jajek szybko znajdziemy się w opałach, a po drugie, istnieją o wiele lepsze narzędzia do tego celu.
Ponieważ jednak ta konkretna seria pchełek nazywa się "Pchełki SQL", bierzemy koparkę, bierzemy młot pneumatyczny, bierzemy jajko - i jedziemy z kodem:
;WITH
cte_ord AS (
SELECT 0 n
UNION ALL SELECT n + 1
FROM cte_ord
WHERE n < 9 ) , cte_1m AS ( SELECT ord1.n + ord2.n * 10 + ord3.n * 100 + ord4.n * 1000 + ord5.n * 10000 + ord6.n * 100000 n FROM cte_ord ord1, cte_ord ord2, cte_ord ord3, cte_ord ord4, cte_ord ord5, cte_ord ord6 ) select pos.n pos_n, o.n o_n, m.n m_n, m.n * o.n m_n_tms_o_n from cte_ord o, cte_ord pos, cte_1m m where o.n > 1 and
m.n > 99999 and
m.n * o.n < 1000000 and
pos.n between 1 and 5 and
m.n * o.n = RIGHT(m.n, pos.n) + LEFT(m.n, 6-pos.n)
order by 2;
Jak widać, mnożyć cyklicznie w domenie sześciocyfrowej nie jest tak trudno - jeżeli któryś z Czytelników czuje nagłą potrzebę znalezienia takich cykliczności wśród większych liczb, proszę bardzo. Sky is the limit...
Z racji tego, że mój poprzedni wpis (ten o mnożeniu palindromicznym) spotkał się z burzliwym milczeniem oraz intensywną ciszą w komentarzach, zakładam, że zainteresowanie dzisiejszym wpisem będzie równie burzliwe, a może nawet bardziej. Dlatego nie tłumaczę powyższego kodu, bo jestem leniwy - jeżeli jednak jakiś mentalny samobójca chciałby podłubać sobie tym dłutkiem w mózgu, chętnie dopomogę. Proszę śmiało pytać.
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.