Problem Józefa Flawiusza
Problem Józefa Flawiusza, znany również jako permutacja Józefa Flawiusza, jest teoretycznym zagadnieniem z zakresu kombinatoryki, które ma zastosowanie w informatyce. Polega na ustawieniu obiektów w okręgu i eliminacji co -tego obiektu, aż pozostanie tylko jeden. Celem jest wskazanie obiektu, który przetrwa. Dla istnieje wzór jawny, a dla innych wartości dostępne są algorytmy o złożoności czasowej oraz .
Historia i odmiany problemu
Nazwa problemu pochodzi od Józefa Flawiusza, historyka rzymsko-żydowskiego, który opisał sytuację, w której wraz z grupą powstańców został otoczony. Aby uniknąć pojmania, postanowili losować, kto z nich ma zabić kolejnego, aż zostanie tylko jedna osoba. Flawiusz przeżył, co zainspirowało matematyków do sformułowania tego problemu.
Pierwszym matematykiem, który przekształcił tę historię w problem matematyczny, był Claude Gaspard Bachet de Méziriac w XVI wieku. W kolejnych wersjach problemu zmieniała się liczba uczestników oraz zasady eliminacji.
Rozwiązania
W przypadku , po pierwszej rundzie eliminacji uczestnicy o numerach parzystych są usuwani. Wprowadza to rekurencyjne wzory, które pozwalają na obliczenie pozycji ocalałego:
- dla ,
- dla .
Ogólny wzór jawny dla można zapisać jako:
Implementacja
Przykładowa implementacja w języku Python 3:
def flawiusz(n):
l = n – (1 << (n.bit_length() - 1))
wynik = 2*l + 1
return wynik
Przypadek ogólny
Problem pozostaje otwarty dla wartości . Istnieją różne podejścia do rozwiązania, w tym algorytmy o złożoności , oraz oparte na programowaniu dynamicznym. Dla dowolnego , rekurencja może być zapisana jako: