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

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:

  1. ;WITH 
  2.     cte_ord AS (
  3.         SELECT 0 n
  4.         UNION ALL SELECT n + 1
  5.         FROM cte_ord
  6.         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
  7.     m.n > 99999 AND
  8.     m.n * o.n < 1000000 AND
  9.     pos.n BETWEEN 1 AND 5 AND
  10.     m.n * o.n = RIGHT(m.n, pos.n) + LEFT(m.n, 6-pos.n)
  11. 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ć.

Dodaj komentarz

Bądź pierwszy!

avatar
  Subscribe  
Powiadom o