Pchełki SQL, odcinek 18: Mnożymy cyklicznie

https://xpil.eu/rook0

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

https://xpil.eu/rook0

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.