Quando Alan Turing ha scoperto il computer, c'erano diversi modelli per il computer proposto. Turing ha dimostrato che alcuni (3) di questi modelli potevano simularsi a vicenda E calcolare la funzione Ackermann, mentre gli altri modelli potevano simularsi a vicenda ma non la funzione Ackermann (quindi non potevano simulare il 3). Pertanto, questi 3 modelli (Turing Machine, von Neumann e uno che non conosco), sono stati scelti come architettura per un computer. Ciò non significa che la funzione Ackermann sia il limite del computer, ma suppongo che sia una scienza ardua. Non sono a conoscenza di alcuna funzione calcolabile che cresce più velocemente della funzione Ackermann.
Ora, non penso che ci sia un problema pratico che corrisponda alla tua domanda, ma forse possiamo costruirne uno. Dobbiamo tuttavia porre dei vincoli sull'input. Dato che non possiamo usare O (n), non possiamo controllare l'intero input. In effetti, non possiamo nemmeno controllare la lunghezza dell'input in quanto sarebbe O (log n). Quindi, abbiamo bisogno come primo parametro di una rappresentazione della lunghezza del resto dell'input, ad esempio c tale che Ackermann (c) sia la lunghezza dell'input. Poiché anche questo non è adatto, chiediamo come primo valore nel nostro input il parametro c, in modo che bb (c) sia circa la lunghezza dell'ingresso, dove bb è la funzione di castoro occupato. Questa funzione è incomutabile ma bb (c) esiste sicuramente. Quindi, l'algoritmo procede come:
for (int i=0; i<c; i++) {
if (input[i] == null) {
return false;
}
}
return true;
Lo scopo dell'algoritmo è verificare che se c è l'inverso di bb, se quindi la lunghezza di input è maggiore di bb (c).
Se esiste una funzione calcolabile che cresce più velocemente della funzione Ackermann, penso che possiamo usarla al contrario per creare un algoritmo che risponda alla tua domanda su qualsiasi input.