Dla czystej przyjemności rozwiązuję sobie zadania programistyczne (ale i tak chyba najbardziej pasuje taki dział :P).
I zacząłem się zastanawiać - czy istnieje jakiś sposób sensowny jak odkryć jakie działanie zostało wykonane na liczbach aby otrzymać dany wynik. Prościej będzie mi to wytłumaczyć na podstawie przykładowego zadania.
Mam skończyć program - otrzymuje on jedną zmienną(n) i jedną zwraca(z) - poza tym nie wiem nic apropo co się w nim wykonuje.
Wiem ,że jeżeli dam mu n=1 z będzie równe 0
dla n=2 z=1
dla n=7 z=91
Co zrobić aby odkryć co dzieje się w środku programu (odkryć algorytm)?
Czy jest na to jakiś sposób "matematyczny" czy po prostu kombinowanie ?
Czy jest na to jakiś sposób "matematyczny" czy po prostu kombinowanie ?
Ogólna metoda nie istnieje. Co więcej, prawie wszystkie algorytmy kryptograficzne opierają się na tym, że istnieją funkcje, których nie da się w łatwy sposób odgadnąć mając nawet milion przykładowych wartości tj. np.
f(0) = 3, f(1) = -4, f(2) = 1234.
Innym zagadnieniem jest aproksymacja funkcji http://pl.wikipedia.org/wiki/Aproksymacja
Można też stworzyć sieć neuronową, która też jest pewną formą aproksymacji. Jednak praca z sieciami neuronowymi wymaga sporego wyczucia, bo co prawda potrafią z dość dużą skutecznością rozwiązywać zagadnienia, których praktycznie nie da się rozwiązać standardowymi metodami, tak metodą prób i błędów trzeba dobrać strukturę sieci neuronowej, by "ucząc się" zwracała uwagę na konkretną cechę problemu. Zbyt prosta sieć nie będzie skuteczna, zbyt złożona sieć nauczy się drobnych szczególików materiałów testowych. Przygotowanie przykładowych próbek do nauki też jest bardzo ważne w przypadku sieci neuronowych. Kiedyś czytałem o tym jak armia USA pracowała nad siecią, która miała rozpoznawać czy na zdjęciu satelitarnym widać instalacje wojskowe czy nie. Sieć nauczyła się rozpoznawać materiały testowe w 100%, ale w praktyce w ogóle nie działała. Okazało się, że w materiałach testowych zdjęcia z instalacjami wojskowymi były znacznie jaśniejsze niż te bez i sieć uznała to za główne kryterium wyboru. Sieć neuronowa nie wie co to jest instalacja wojskowa, uczy się odpowiadając na pytania i dostaje odpowiedź dobrze/źle.
Tak jak napisał Likfidator - ogólnej metody nie ma i z matematycznego punktu widzenia być nie może (jakakolwiek skończona liczba przykładów wejścia i wyjścia nie definiuje jednoznacznie funkcji). Ale w praktyce można próbować dopasować funkcję na podstawie kilku/kilkunastu punktów - próbując dopasować wielomiany kolejnych stopni, funkcje wykładnicze, logarytmiczne, wymierne...
Kombinujesz, jeżeli to jest na papierze.
Jak w formie elektronicznej, to próbujesz uzyskać kod o ile nie był przerzucony jakimś dotfuscatorem.
o ile nie był przerzucony jakimś dotfuscatorem
Obfuskatorem, nie zakładajmy od razu, że to DotNot :D
Równie dobrze może to być "algorytm":
if(n == 1) z = 0;
elseif(n == 2) z = 1;
else z = 91;
(w takim pseudokodzie, bo na golu klamry nie działają)
zadanie polega na tym ze ma byc jak najkrócej to raz , a dwa ,że jeśli da się tylko
if(n == 1) z = 0;
elseif(n == 2) z = 1;
else z = 91;
to daja nastepne zmienne i np dla 5 ma byc iles tam - więc chodzi o znalezienie konkretnego algorytmu :)
Glownie chodziło mi o to czy jest jakiś sposób o którym nie wiem czy po prostu kombinowanie ;)