Asymmetric Numeral Systems
# Asymmetric Numeral Systems

Asymmetric Numeral Systems (ANS, asymmetrische Zahlensysteme) sind eine Familie von Entropiekodierungen, die von Jarosław „Jarek“ Duda an der Jagiellonen-Universität entwickelt wurden. ANS kombiniert die Kompressionsrate der arithmetischen Kodierung, die eine nahezu exakte Wahrscheinlichkeitsverteilung nutzt, mit einem zur Huffman-Kodierung vergleichbaren Rechenaufwand.
ANS findet unter anderem Verwendung in den Kompressionsalgorithmen Zstandard und LZFSE, bei der Kompression der Bildformate PIK und JPEG XL.

## Entropiekodierung

Die Sequenz von 1000 Nullen und Einsen würde bei direkter Speicherung 1000 Bits umfassen. Wenn über die Sequenz bekannt ist, dass sie nur eine Eins und 999 Nullen enthält, ist es ausreichend, nur die Stelle der Eins zu speichern, wodurch nur noch $\lceil \log _{2}(1000)\rceil =10$ Bits benötigt werden.
Die Anzahl von Kombinationen aus $n$ Symbolen mit $pn$ Einsen und $(1-p)n$ Nullen entspricht bei einer Wahrscheinlichkeit von $p\in (0,1)$ für Einsen nach der Stirlingformel näherungsweise
${n \choose pn}\approx 2^{nh(p)}{\text{ für große }}n{\text{ und }}h(p)=-p\log _{2}(p)-(1-p)\log _{2}(1-p).$
Daher sind zur Speicherung einer solchen Sequenz ungefähr $nh(p)$ Bits erforderlich, wobei $h(p)$ der Entropie eines Symbols entspricht. Im Falle von $p=1/2$ sind also weiterhin $n$ Bits erforderlich, bei asymmetrischer Wahrscheinlichkeit allerdings weit weniger. Beispielsweise werden bei $p=0{,}11$ nur noch etwa $n/2$ Bits benötigt.
Ein Entropiekodierer ermöglicht die Kodierung einer Symbolfolge mit einer ungefähr der Entropie entsprechenden Anzahl von Bits pro Symbol.

## Grundkonzept von ANS

Die grundlegende Idee ist, Informationen in eine einzelne natürliche Zahl $x$ zu kodieren. Im üblichen Binärsystem kann ein Bit $s\in \{0,1\}$ an Information mithilfe der Kodierfunktion $C(s,x)=2x+s$ zu $x$ hinzugefügt werden, sodass $x'=C(s,x)=2x+s$. Durch Anwendung der Kodierfunktion verschieben sich alle Bits um eine Stelle und $s$ wird an der niedrigstwertigen Stelle ergänzt. Die Dekodierfunktion $D(x')=((x'{\bmod {2}}),\lfloor x'/2\rfloor )$ ermöglicht die Extraktion der vorherigen Zahl $x$ sowie des hinzugefügten Symbols $s$. Durch mehrfache Anwendung der Kodierfunktion kann eine Sequenz kodiert und durch mehrfache Anwendung der Dekodierfunktion in umgekehrter Reihenfolge wieder dekodiert werden.
Das beschriebene Vorgehen ist optimal, wenn die Wahrscheinlichkeitsverteilung der beiden möglichen Symbole symmetrisch ist, also $p_{0}=p_{1}=1/2$. Dieser Prozess wird von ANS für beliebige Mengen von Symbolen $s\in S$ mit einer zugehörigen, oft asymmetrischen Wahrscheinlichkeitsverteilung $(p_{s})_{s\in S}$ generalisiert.
Nach dem Hinzufügen der Information von $s$ zu $x$ ist $x'=C(s,x)\approx x/p_{s}$ bzw. $\log _{2}(x')=\log _{2}(C(s,x))\approx \log _{2}(x)+\log _{2}(1/p_{s})$, wobei $\log _{2}(x)$ der Anzahl von Bits an Information in der Zahl $x$ und $\log _{2}(1/p_{s})$ der ungefähren Anzahl von Bits des Symbols $s$ entsprechen.

## Varianten
### Uniforme binäre Variante (uABS)

Die binäre Variante mit ungefähr gleichverteilten Symbolen $s\in \{0,1\}$ mit $p_{1}=p$ und $p_{0}=1-p$. Die Kodierfunktion $C(s,x)$ und die Dekodierfunktion $D(x)$ ergeben sich wie folgt:
${\begin{aligned}C(s,x)&={\begin{cases}\left\lceil {\frac {x+1}{1-p}}\right\rceil &{\textrm {falls}}\ s=0\\\left\lfloor {\frac {x}{p}}\right\rfloor &{\textrm {falls}}\ s=1\end{cases}}\\D(x)&=(s,x_{s})\\s&=\lceil (x+1)p\rceil -\lceil xp\rceil \\x_{1}&=\lceil xp\rceil \\x_{0}&=x-x_{1}=x-\lceil xp\rceil \end{aligned}}$

### Range-Variante (rANS)

Die Range-Variante benutzt ebenfalls arithmetische Formeln, erlaubt aber im Gegensatz zu uABS ein größeres Alphabet. Es kann als Modifikation eines Stellenwertsystems gesehen werden, bei dem manche aufeinanderfolgenden Ziffern zu Bereichen vereinigt wurden.
Die Wahrscheinlichkeitsverteilung $(p_{s})_{s\in S}$ der Symbolmenge $S=\{0,1,\dots ,n-1\}$ wird näherungsweise durch Brüche der Form $p_{s}\approx l_{s}/m$ mit $l_{s}\in \mathbb {N}$ und m=∑$_s$l$_s${\textstyle m=\sum _{s}l_{s}} beschrieben. Das Symbol $s$ dem Bereich $\{b_{s},\dots ,b_{s+1}-1\}$ mit b$_s$=∑$_{i=0}$$^{s−1}${\textstyle b_{s}=\sum _{i=0}^{s-1}} eines Stellenwertsystems zur Basis $m$ zugeordnet. Aus Position $y$ eines Symbols im Stellenwertsystem kann das Symbol durch s(y)=min{s:y<∑$_{i=0}$$^s$l$_i$}{\textstyle s(y)=\min \, \{s:y<\sum _{i=0}^{s}l_{i}\}} bestimmt werden. Die Kodierfunktion $C(s,x)$ und die Dekodierfunktion $D(x)$ ergeben sich wie folgt:
${\begin{aligned}C(s,x)&=m\left\lfloor {\frac {x}{l_{s}}}\right\rfloor +b_{s}+(x{\bmod {l}}_{s})\\D(x)&=\left(s,l_{s}\left\lfloor {\frac {x}{m}}\right\rfloor +(x{\bmod {m}})-b_{s}\right)\;{\textrm {mit}}\ s=s(x{\bmod {m}})\end{aligned}}$
Im Kodierer liegen üblicherweise $l_{s}$, $b_{s}$ und $s(y)$ tabellarisch vor, idealerweise auch $l(y)=l_{s(y)}$ und $b(y)=b_{s(y)}$, um eine bessere Laufzeit zu erzielen.
Wenn $m$ als Potenz von 2 gewählt wird, können die Multiplikationen und Divisionen durch schnellere bitweise Verschiebungen und $x{\bmod {m}}$ durch bitweises UND ersetzt werden. Dadurch ist bei der Dekodierung nur noch eine Multiplikation erforderlich.

### Tabellarische Variante (tANS)

Die tabellarische Variante verpackt den gesamten Ablauf für $x\in [L,2L-1]$ in eine Tabelle, die einen endlichen Automaten beschreibt. Dadurch ist es möglich, gänzlich auf Multiplikationen zu verzichten.