[
[
['9','add','hl'],
['94','add','hl'],
['104','add','hl'],
['90','add','hl'],
['13','remove','slide-up'],
['2','add','slide-down']
],
[
['18','add','hl'],
['18','remove','hidden'],
['8','remove','indent-1'],
['20','add','hl'],
['20','remove','hidden'],
['91','add','hl'],
['91','remove','slide-left'],
['4','add','hidden'],
['8','add','indent-2'],
['9','remove','hl'],
['9','add','hidden'],
['94','remove','hl'],
['94','add','slide-left'],
['104','remove','hl'],
['104','add','slide-left'],
['90','remove','hl'],
['90','add','slide-right']
],
[
['18','remove','hl'],
['20','remove','hl'],
['91','remove','hl'],
['5','add','hl'],
['6','add','hl'],
['96','add','hl'],
['102','add','hl'],
['99','add','hl'],
['93','add','hl'],
['24','remove','slide-up'],
['13','add','slide-down']
],
[
['28','add','hl'],
['28','remove','hidden'],
['97','add','hl'],
['97','remove','slide-left'],
['30','add','hl'],
['30','remove','hidden'],
['31','remove','indent-2'],
['31','add','hl'],
['31','remove','hidden'],
['94','add','hl'],
['94','remove','slide-left'],
['5','remove','hl'],
['5','add','hidden'],
['6','remove','hl'],
['6','add','hidden'],
['96','remove','hl'],
['96','add','slide-right'],
['102','remove','hl'],
['102','add','slide-left'],
['31','add','indent-3'],
['99','remove','hl'],
['99','add','slide-left'],
['93','remove','hl'],
['93','add','slide-right']
],
[
['28','remove','hl'],
['97','remove','hl'],
['30','remove','hl'],
['31','remove','hl'],
['94','remove','hl'],
['101','add','hl'],
['36','remove','slide-up'],
['24','add','slide-down']
],
[
['102','add','hl'],
['102','remove','slide-left'],
['31','remove','indent-3'],
['99','add','hl'],
['99','remove','slide-left'],
['101','remove','hl'],
['101','add','slide-right'],
['31','add','indent-2']
],
[
['102','remove','hl'],
['99','remove','hl'],
['31','add','hl'],
['103','add','hl'],
['48','remove','slide-up'],
['36','add','slide-down']
],
[
['104','add','hl'],
['104','remove','slide-left'],
['56','add','hl'],
['56','remove','hidden'],
['31','remove','hl'],
['31','add','hidden'],
['103','remove','hl'],
['103','add','slide-right']
],
[
['104','remove','hl'],
['56','remove','hl'],
['20','add','hl'],
['60','remove','slide-up'],
['48','add','slide-down']
],
[
['64','add','hl'],
['64','remove','hidden'],
['65','add','hl'],
['65','remove','hidden'],
['103','add','hl'],
['103','remove','slide-right'],
['93','add','hl'],
['93','remove','slide-right'],
['20','remove','hl'],
['20','add','hidden']
],
[
['64','remove','hl'],
['65','remove','hl'],
['103','remove','hl'],
['93','remove','hl'],
['10','add','hl'],
['73','remove','slide-up'],
['60','add','slide-down']
],
[
['75','remove','hidden'],
['79','add','hl'],
['79','remove','hidden'],
['80','add','hl'],
['80','remove','hidden'],
['82','add','hl'],
['82','remove','hidden'],
['83','add','hl'],
['83','remove','hidden'],
['90','add','hl'],
['90','remove','slide-right'],
['10','remove','hl'],
['10','add','hidden']
],
[
['79','remove','hl'],
['80','remove','hl'],
['82','remove','hl'],
['83','remove','hl'],
['90','remove','hl']
]
]
The starting point is $\lib{prf-real}$.
We can add a cache $\prftable[\cdot]$ so that each output is computed only once.
We can replace the calls to PRF $F$ with corresponding lookups in a lazy random dictionary $R[\cdot]$. Note: There is a \emph{single} dictionary $R[\cdot]$, which the library will access on both $X_1$ and $Y_1 \oplus X_2$. The standard three-hop maneuver has been omitted.
This hybrid contains an if-statement ``if $R[Y_1 \oplus X_2]$ undefined.'' Consider another hybrid in which the body of this if-statement is performed \emph{unconditionally.} The two hybrids behave identically unless/until $R[Y_1 \oplus X_2]$ is already defined. So, to show that the hybrids are indistinguishable, we can trigger a bad event in that case and later show that the bad event has negligible probability.
We can swap the assignment order of $\prftable[X_1 \| X_2]$ and $R[Y_1 \oplus X_2]$.
We can move $\prftable[X_1\|X_2] \gets \bits^\secpar$ earlier. After doing so, it is clear that $R[\cdot]$ does not affect the output of $\prfquery$: It is used only to determine whether to trigger the bad event.
Instead of triggering the bad event as $\prfquery$ is called, we can do so at the end of time. This will not change the bad event's probability.
$\lib{prf-real}$
$\key \gets \bits^\secpar$
$\lib{prf-rand}$
if $\prftable[X_1\|X_2]$ undefined:
$\prftable[X_1\|X_2] \gets \bits^\secpar$
$\mathcal{X} := \mathcal{X} \cup \{ X_1 \| X_2 \}$
return $\prftable[X_1\|X_2]$
for $X_1 \| X_2 \in \mathcal{X}$:
if $R[X_1]$ undefined: $R[X_1] \gets \bits^\secpar$
$Y_2 := F(\key,Y_1 \oplus X_2)$
if $R[ Y_1 \oplus X_2 ]$
undefined:
defined: $\badvar := \mytrue$
$R[ Y_1 \oplus X_2 ] \gets \bits^\secpar$
$\prftable[X_1\|X_2] $
${}:= {}$
$F(\key,Y_1 \oplus X_2)$
$R[ Y_1 \oplus X_2 ]$
${}\gets \bits^\secpar$
$R[ Y_1 \oplus X_2 ] := \prftable[X_1\|X_2]$
return
$Y_2$
$\prftable[X_1\|X_2]$