m-am gandit ca ajuta mai mult asa
here goes another try
eu impart permutarea in cicluri astfel: initial ii fixez literei A o alta litera si incerc sa formez un ciclu pe baza acestei presupuneri. dupa ce am reusit trec la prima litera care nu face parte din niciun ciclu anterior, fac alta presupunere si repet rationamentul.
impartirea in cicluri se face astfel:
am considerat permutarea care cifreaza mesajul ca fiind o funcitie bijectiva de tipul f(x) = y, unde x si y sunt litere. mie mi se da, pentru un x, f(y). daca eu fixez un y pentru prima pozitie, este evident ca voi determina si alte valori ale acestei functii. spre exemplu:
A B C D ....
f: _ _ _ _
D B E C ....
daca fixez ca f(A) = C, stiu automat ca f(C) = D, apoi ca F(D) = E, etc.
algoritmul meu se opreste in trei situatii:
1. fie m-am intors la pozitia de la care am inceput si mi-a rezultat ca f(A) = C (pt exemplul de mai sus)
2. fie am ajuns la o contradictie: atribui lui f(x) o valoare, dar f(x) fusese setat anterior cu o alta.
3. incerc sa atribui o valoare de doua ori pentru doua elemente distincte
*cazurile 2 si 3 pot fi privite ca o incalcare a surjectivitatii, respectiv a injectivitatii functiei f.
daca sunt intr-unul din ultimele 2 cazuri, atunci consider alta valoare initiala si reiau algoritmul.
daca nu am ajuns la nico contradictie, inseamna ca am determina o parte din (sau chiar toate) valorile lui f si, prin urmare, voi relua algoritmul din primul x nesetat (daca acesta exista).