Los sistemas numéricos asimétricos ( ANS ) [ ‡1 ] [ ‡2 ] son una familia de métodos de codificación de entropía introducidos por Jarosław (Jarek) Duda [ ‡3 ] de la Universidad Jaguelónica , utilizados en la compresión de datos desde 2014 [ ‡4 ] debido a su rendimiento mejorado en comparación con métodos anteriores. [ 1 ] ANS combina la relación de compresión de la codificación aritmética (que utiliza una distribución de probabilidad casi precisa ) con un coste de procesamiento similar al de la codificación Huffman . [ ‡1 ] En la variante ANS tabulada (tANS), esto se logra mediante la construcción de una máquina de estados finitos para operar en un alfabeto grande sin utilizar la multiplicación. [ ‡2 ]
Entre otros, ANS se utiliza en el compresor Facebook Zstandard [ 2 ] [ 3 ] (también utilizado, por ejemplo, en el kernel de Linux , [ 4 ] el navegador Google Chrome , [ 5 ] el sistema operativo Android [ 6 ] , se publicó como RFC 8478 para MIME [ 7 ] y HTTP [ 8 ] ), el compresor Apple LZFSE , [ 9 ] el compresor Google Draco 3D [ 10 ] (utilizado, por ejemplo, en el formato Pixar Universal Scene Description [ 11 ] ) y el compresor de imágenes PIK, [ 12 ] el compresor CRAM DNA [ 13 ] de las utilidades SAMtools , [ 14 ] la biblioteca de compresión de alta velocidad NVIDIA nvCOMP, [ 15 ] el compresor Dropbox DivANS, [ 16 ] el compresor de texturas Microsoft DirectStorage BCPack, [ 17 ] los compresores de imágenes JPEG XL de larga duración [ 18 ] y JPEG AI basados en aprendizaje [ 19 ] .
La idea básica es codificar la información en un único número natural.. [ ‡ 2 ] En el sistema numérico binario estándar, podemos agregar un bitde información aadjuntandoal final de, lo que nos daPara un codificador de entropía, esto es óptimo siANS generaliza este proceso para conjuntos arbitrarios de símbolos.con una distribución de probabilidad adjunta. En ANS, si la información dese adjunta apara resultar en, entonces. De forma equivalente,, dóndees el número de bits de información almacenados en el número, yes el número de bits contenidos en el símbolo. [ ‡ 2 ]
Para la regla de codificación, el conjunto de números naturales se divide en subconjuntos disjuntos que corresponden a diferentes símbolos , como en números pares e impares, pero con densidades que corresponden a la distribución de probabilidad de los símbolos a codificar. Luego, para agregar información del símbolo en la información ya almacenada en el número actual, vamos al númerosiendo la posición de la-aparición del-ésimo subconjunto. [ ‡ 2 ]
Hay formas alternativas de aplicarlo en la práctica : fórmulas matemáticas directas para los pasos de codificación y decodificación (variantes uABS y rANS), o se puede poner todo el comportamiento en una tabla (variante tANS). [ ‡ 1 ] La renormalización se utiliza para prevenir yendo al infinito : transferencia de bits acumulados hacia o desde el flujo de bits. [ ‡ 2 ]
Codificación de entropía
Supongamos que se codifica una secuencia de 1000 ceros y unos, lo que requeriría 1000 bits para almacenar directamente. Sin embargo, si se sabe de alguna manera que solo contiene 1 cero y 999 unos, bastaría con codificar la posición del cero, lo que requiere solobits aquí en lugar de los 1000 bits originales.
Generalmente, tales secuencias de longitudque contieneceros yunos, por alguna probabilidad, se denominan combinaciones . Usando la aproximación de Stirling obtenemos su número asintótico siendo
llamada entropía de Shannon . [ 20 ]
Por lo tanto, para elegir una de esas secuencias necesitamos aproximadamentebits. Todavía lo esbits siSin embargo, también puede ser mucho más pequeño. Por ejemplo, solo necesitamospiezas para.
Un codificador de entropía permite codificar una secuencia de símbolos utilizando aproximadamente los bits de entropía de Shannon por símbolo. Por ejemplo, ANS podría usarse directamente para enumerar combinaciones: asignar un número natural diferente a cada secuencia de símbolos con proporciones fijas de una manera casi óptima. [ ‡ 2 ]
A diferencia de las combinaciones de codificación, esta distribución de probabilidad suele variar en los compresores de datos. Para este propósito, la entropía de Shannon puede verse como un promedio ponderado: un símbolo de probabilidad.contienebits de información. ANS codifica la información en un solo número natural., interpretado como que contienefragmentos de información. Agregar información a partir de un símbolo de probabilidad.aumenta este contenido informativo aPor lo tanto, el nuevo número que contiene ambas informaciones debe ser. [ ‡ 2 ]
Ejemplos motivadores
Consideremos una fuente con 3 letras A, B, C, con probabilidad 1/2, 1/4, 1/4. Es sencillo construir el código de prefijo óptimo en binario: A = 0, B = 10, C = 11. Entonces, un mensaje se codifica como ABC -> 01011.
Vemos que un método equivalente para realizar la codificación es el siguiente:
- Empiece con el número 1 y realice una operación sobre el número correspondiente a cada letra introducida.
- A = multiplicar por 2; B = multiplicar por 4, sumar 2; C = multiplicar por 4, sumar 3.
- Expresa el número en binario y luego elimina el primer dígito 1.
Consideremos una fuente más general con k letras, con probabilidades racionales.. Entonces, realizar la codificación aritmética en el código fuente solo requiere aritmética exacta con números enteros. [ ‡ 1 ]
En general, ANS es una aproximación de la codificación aritmética que se aproxima a las probabilidades reales.por números racionalescon un denominador pequeño. [ ‡ 2 ]
Conceptos básicos de la ANS

Imagina que hay alguna información almacenada en un número natural., por ejemplo, como la secuencia de bits de su expansión binaria. Para agregar información de una variable binaria., podemos usar la función de codificación, que desplaza todos los bits una posición hacia arriba y coloca el nuevo bit en la posición menos significativa. Ahora la función de decodificaciónpermite recuperar el anteriory este pequeño añadido:Podemos empezar conestado inicial, luego usar elfunción sobre los bits sucesivos de una secuencia finita de bits para obtener un resultado finalNúmero que almacena toda esta secuencia. Luego, usando elfuncionar varias veces hastapermite recuperar la secuencia de bits en orden inverso. [ ‡ 2 ]
El procedimiento anterior es óptimo para la distribución de probabilidad uniforme (simétrica) de los símbolos.ANS lo generaliza para que sea óptimo para cualquier distribución de probabilidad (asimétrica) elegida de los símbolos:. MientrasEn el ejemplo anterior se trataba de elegir entre par e impar.En ANS, esta división par/impar de los números naturales se reemplaza por una división en subconjuntos cuyas densidades corresponden a la distribución de probabilidad asumida.: hasta la posición, hay aproximadamenteocurrencias del símbolo. [ ‡ 2 ]
La función de codificacióndevuelve el-ésima aparición de dicho subconjunto correspondiente al símbolo. La suposición de densidad es equivalente a la condiciónSuponiendo que un número naturalcontienefragmentos de información,De ahí el símbolo de probabilidad.está codificado como que contienebits de información según lo requieran los codificadores de entropía . [ ‡ 2 ]
Variantes
Variante binaria uniforme (uABS)
Comencemos con el alfabeto binario y una distribución de probabilidad.,. Hasta la posiciónqueremos aproximadamenteanálogos de números impares (para). Podemos elegir este número de apariciones como, conseguir. Esta variante se llama uABS y da lugar a las siguientes funciones de decodificación y codificación: [ 21 ]
Descodificación:
s = ceil (( x + 1 ) * p ) - ceil ( x * p ) // 0 si fract(x*p) < 1-p, de lo contrario 1 si s = 0 entonces new_x = x - ceil ( x * p ) // D(x) = (new_x, 0), esto es lo mismo que new_x = floor(x*(1-p)) si s = 1 entonces new_x = ceil ( x * p ) // D(x) = (new_x, 1)Codificación:
Si s = 0 , entonces new_x = ceil (( x + 1 ) / ( 1 - p )) - 1 // C(x,0) = new_x Si s = 1 , entonces new_x = floor ( x / p ) // C(x,1) = new_xParaequivale al sistema binario estándar (con 0 y 1 invertidos), para un propósito diferente.se vuelve óptimo para esta distribución de probabilidad dada. [ 21 ] Por ejemplo, paraEstas fórmulas conducen a una tabla para valores pequeños de:
El símbolocorresponde a un subconjunto de números naturales con densidad, que en este caso son posiciones. Como, estas posiciones aumentan en 3 o 4. PorqueAquí, el patrón de símbolos se repite cada 10 posiciones.
La codificaciónSe puede encontrar tomando la fila correspondiente a un símbolo dado.y eligiendo el dadoen esta fila. Luego la fila superior proporciona. Por ejemplo,desde la fila del medio hasta la fila superior.
Imaginemos que quisiéramos codificar la secuencia '0100' comenzando desde. Primeronos lleva a, entoncesa, entoncesa, entoncesa. Utilizando la función de decodificaciónen esta final, podemos recuperar la secuencia de símbolos. Usando la tabla para este propósito,En la primera fila se determina la columna, luego la fila no vacía y el valor escrito determinan la correspondientey.
Variantes de rango (rANS) y transmisión
La variante de rango también utiliza fórmulas aritméticas, pero permite operar sobre un alfabeto grande. [ ‡ 2 ] Intuitivamente, divide el conjunto de números naturales en rangos de tamañoy divide cada uno de ellos de forma idéntica en subrangos con proporciones dadas por la distribución de probabilidad supuesta.
Comenzamos cuantificando la distribución de probabilidad en pasos dedonde se elige n (normalmente de 8 a 12 bits):para algunos números naturales(tamaños de los subrangos).
Denotary una función de distribución acumulativa:
Nótese que la función no es una verdadera función de distribución acumulada (CDF) , ya que la probabilidad del símbolo actual no se incluye en el valor de la expresión. En cambio, representa la probabilidad total de todos los símbolos anteriores. Ejemplo: En lugar de la definición normal de , se evalúa como , puesto que no hay símbolos anteriores.CDF[s]CDF[s]CDF[0]=f[0]CDF[0]=0
Paradenota la función (generalmente tabulada)
símbolo ( y ) = s tal que CDF [ s ] <= y < CDF [ s + 1 ]Ahora la función de codificación es:
C ( x , s ) = ( floor ( x / f [ s ]) << n ) + ( x % f [ s ]) + CDF [ s ]Descodificación:
s = símbolo ( x & máscara ) D ( x ) = ( f [ s ] * ( x >> n ) + ( x & máscara ) - CDF [ s ], s )De esta forma podemos codificar una secuencia de símbolos en un número natural grande x . Para evitar el uso de aritmética de números grandes, en la práctica se utilizan variantes de flujo que imponenpor renormalización: Enviar los bits menos significativos de x hacia o desde el flujo de bits (generalmente L y b son potencias de 2). [ ‡ 2 ]
En la variante rANS, x podría ser un entero de 32 bits, por ejemplo. Para la renormalización de 16 bits (), el decodificador rellena los bits menos significativos del flujo de bits cuando es necesario:
if ( x < ( 1 << 16 )) { x = ( x << 16 ) + read16bits () }Variante tabulada (tANS)

La variante tANS pone todo el comportamiento (incluida la renormalización) paraen una tabla que produce una máquina de estados finitos evitando la necesidad de multiplicación. [ ‡ 2 ]
Finalmente, el paso del bucle de decodificación se puede escribir como:
t = decodingTable ( x ) ; x = t.newX + readBits ( t.nbBits ); //transición de estado writeSymbol ( t.symbol ) ; // símbolo decodificadoEl paso del bucle de codificación:
s = ReadSymbol (); nbBits = ( x + ns [ s ]) >> r ; // número de bits para la renormalización writeBits ( x , nbBits ); // enviar los bits menos significativos al flujo de bits x = encodingTable [ start [ s ] + ( x >> nbBits )];Una codificación tANS específica se determina asignando un símbolo a cadaposición, su número de apariciones debe ser proporcional a las probabilidades asumidas. Por ejemplo, se podría elegir la asignación "abdacdac" para la distribución de probabilidad Pr(a)=3/8, Pr(b)=1/8, Pr(c)=2/8, Pr(d)=2/8. Si los símbolos se asignan en rangos de longitudes que son potencias de 2, obtendríamos la codificación de Huffman . Por ejemplo, se obtendría el código de prefijo a->0, b->100, c->101, d->11 para tANS con la asignación de símbolos "aaaabcdd". [ ‡ 1 ]

Observaciones
En cuanto a la codificación de Huffman, modificar la distribución de probabilidad de tANS es relativamente costoso, por lo que se utiliza principalmente en situaciones estáticas, generalmente con algún esquema de Lempel-Ziv (por ejemplo, ZSTD, [ 2 ] LZFSE [ 9 ] ). En este caso, el archivo se divide en bloques ; para cada uno de ellos, las frecuencias de los símbolos se cuentan de forma independiente, luego, después de la aproximación (cuantización), se escriben en el encabezado del bloque y se utilizan como distribución de probabilidad estática para tANS. [ ‡ 1 ]
En contraste, rANS se usa generalmente como un reemplazo más rápido para la codificación de rango (por ejemplo, CRAM , [ 13 ] LZNA, Draco [ 10 ] ). Requiere multiplicación, pero es más eficiente en memoria y es apropiado para adaptar dinámicamente las distribuciones de probabilidad. [ ‡2 ]
La codificación y decodificación de ANS se realizan en direcciones opuestas, lo que la convierte en una pila de símbolos. Este inconveniente suele resolverse codificando en sentido inverso, tras lo cual se puede decodificar en sentido directo. [ ‡ 2 ] Para la dependencia del contexto, como en el modelo de Markov , el codificador necesita utilizar el contexto desde la perspectiva de la decodificación posterior. Para la adaptabilidad, el codificador debe primero avanzar para encontrar las probabilidades que utilizará (predichará) el decodificador y almacenarlas en un búfer, luego codificar en sentido inverso utilizando las probabilidades almacenadas en el búfer. [ ‡ 2 ]
El estado final de la codificación es necesario para comenzar la decodificación, por lo que debe almacenarse en el archivo comprimido. Este costo puede compensarse almacenando cierta información en el estado inicial del codificador. Por ejemplo, en lugar de comenzar con el estado "10000", comience con el estado "1****", donde "*" son bits adicionales almacenados que pueden recuperarse al final de la decodificación. Alternativamente, este estado puede usarse como una suma de verificación, comenzando la codificación con un estado fijo y comprobando si el estado final de la decodificación es el esperado. [ ‡ 2 ]
Controversia sobre patentes
El autor del novedoso algoritmo ANS y sus variantes tANS y rANS pretendía específicamente que su trabajo estuviera disponible gratuitamente en el dominio público, por razones altruistas. No ha buscado lucrarse con ellos y tomó medidas para asegurar que no se convirtieran en un "campo minado legal", ni que otros los restringieran o se beneficiaran de ellos. [ 1 ] En 2015, Google publicó una patente en EE. UU. y luego a nivel mundial para "Codificación de coeficientes ans booleanos mixtos". [ 22 ] En ese momento, Google le había pedido al profesor Duda que les ayudara con la compresión de video, por lo que estaba íntimamente familiarizado con este campo, ya que el autor original les estaba ayudando.
Duda no quedó satisfecho al descubrir (accidentalmente) las intenciones de Google respecto a la patente, dado que había dejado claro que quería que fuera de dominio público y había ayudado a Google específicamente con ese propósito. [ 1 ] Posteriormente, Duda presentó una solicitud de terceros [ ‡ 5 ] ante la Oficina de Patentes de los Estados Unidos para solicitar su rechazo. La USPTO rechazó su solicitud en 2018, y Google posteriormente abandonó la patente. [ 23 ]
En junio de 2019, Microsoft presentó una solicitud de patente titulada "Características de codificación y decodificación de sistemas de números asimétricos de rango". [ 24 ] La USPTO emitió un rechazo final de la solicitud el 27 de octubre de 2020. [ 24 ] Sin embargo, el 2 de marzo de 2021, Microsoft presentó una declaración explicativa ante la USPTO indicando "El solicitante discrepa respetuosamente con los rechazos", [ 25 ] buscando revocar el rechazo final bajo el programa "After Final Consideration Pilot 2.0". [ 26 ] Después de la reconsideración, la USPTO otorgó la solicitud el 25 de enero de 2022. [ 24 ]
Véase también
Referencias
- 1 2 3 "Google, acusado de intentar patentar tecnología de dominio público" . Bleeping Computer . 11 de septiembre de 2017.
- 1 2 Compresión de datos más pequeña y rápida con Zstandard , Facebook, agosto de 2016.
- ↑ 5 maneras en que Facebook mejoró la compresión a gran escala con Zstandard , Facebook, diciembre de 2018.
- ↑ Zstd Compression For Btrfs & Squashfs Set For Linux 4.14, Already Used Within Facebook , Phoronix, septiembre de 2017.
- ↑ Novedad en Chrome 123 (Content-Encoding) , Google, marzo de 2024.
- ↑ "Zstd en la versión de Android P" . Archivado del original el 26 de agosto de 2020. Consultado el 29 de mayo de 2019 .
- ↑ Compresión Zstandard y el tipo de medio application/zstd (estándar de correo electrónico) .
- ↑ Parámetros del Protocolo de Transferencia de Hipertexto (HTTP) , IANA .
- 1 2 Apple publica el código fuente de su nuevo algoritmo de compresión LZFSE , InfoQ, julio de 2016.
- 1 2 Biblioteca de compresión 3D Google Draco .
- ↑ Google y Pixar añaden la compresión Draco al formato de descripción de escena universal (USD) .
- ↑ Google PIK: nuevo formato de imagen con pérdida para internet .
- 1 2 Especificación del formato CRAM (versión 3.0) .
- ↑ Chen W, Elliott LT (2021). "Compresión de datos genéticos poblacionales mediante entropía de estado finito" . J Bioinform Comput Biol . 19 (5) 2150026. doi : 10.1142/S0219720021500268 . PMID 34590992 .
- ↑ Compresión de datos de alta velocidad mediante GPU NVIDIA .
- ↑ Mejorando la compresión junto con DivANS .
- ↑ Información general de Microsoft DirectStorage .
- ^ Rhatushnyak, Alejandro; Wassenberg, enero; Sneyers, Jon; Alakuijala, Jyrki; Vandevenne, Lode; Versari, Luca; Obryk, Robert; Szabadka, Zoltan; Kliuchnikov, Evgenii; Comsa, Iulia-Maria; Potempa, Krzysztof; Bruse, Martín; Firsching, Moritz; Khasanova, Renata; Ruud van Asseldonk; Boukortt, Sami; Gómez, Sebastián; Fischbacher, Thomas (2019). "Borrador del comité del sistema de codificación de imágenes JPEG XL". arXiv : 1908.03565 [ eess.IV ].
- ↑ Esenlik, Semih; Zhang, Kai; Ascenso, João (2025). "Una descripción general del estándar de codificación de imágenes basado en el aprendizaje JPEG AI". arXiv : 2510.13867 [ eess.IV ].
- ↑ Cover, Thomas M.; Thomas, Joy A. (2006). Elementos de la teoría de la información (2.ª ed.). Wiley. págs. 13–14 . ISBN 978-0-471-24195-9.
- 1 2 Explicación de la compresión de datos , Matt Mahoney
- ↑ "Codificación mixta de tokens booleanos y coeficientes" . Consultado el 14 de junio de 2021 .
- ↑ Nazer, Daniel (30 de agosto de 2018). "Tras el rechazo de la Oficina de Patentes, es hora de que Google abandone su intento de patentar el uso de un algoritmo de dominio público" . Electronic Frontier Foundation .
- 1 2 3 "Características de la codificación y decodificación del sistema de numeración asimétrico de rango" . Consultado el 14 de junio de 2021 .
- ↑ Claburn, Thomas (13 de marzo de 2021). "¿A la tercera va la vencida? Microsoft intenta que su patente de compresión, rechazada dos veces, sea aprobada por examinadores escépticos" . The Register . Consultado el 14 de junio de 2021 .
- ↑ "Después de la consideración final Piloto 2.0" . Oficina de Patentes y Marcas de los Estados Unidos . Consultado el 14 de junio de 2021 .
Fuentes primarias
En el texto, estas referencias van precedidas de una doble daga (‡):
- 1 2 3 4 5 6 J. Duda, K. Tahboub, NJ Gadil, EJ Delp, El uso de sistemas numéricos asimétricos como un reemplazo preciso para la codificación de Huffman , Simposio de Codificación de Imágenes, 2015.
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 J. Duda, Sistemas numéricos asimétricos: codificación de entropía que combina la velocidad de la codificación de Huffman con la tasa de compresión de la codificación aritmética , arXiv:1311.2540, 2013.
- ↑ «Dr. Jarosław Duda (Jarek Duda)» . Instituto de Física Teórica . Universidad Jagellónica de Cracovia . Consultado el 2 de agosto de 2021 .
- ↑ Duda, Jarek (6 de octubre de 2019). "Lista de compresores que utilizan ANS, implementaciones y otros materiales" . Recuperado el 6 de octubre de 2019 .
- ↑ "Protesta a Google" (PDF) . Instituto de Física Teórica. Universidad Jaguelónica de Cracovia, Polonia . Profesor Jarosław Duda.
Enlaces externos
- Duda, Jarek (2 de noviembre de 2008). "Codificación óptima en retículo discreto con restricciones invariantes traslacionales utilizando algoritmos estadísticos". arXiv : 0710.3861 [ cs.IT ]., posiblemente la primera mención de ANS
- Arquitecturas de hardware de alto rendimiento para codificación de entropía de sistemas numéricos asimétricos SM Najmabadi, Z. Wang, Y. Baroud, S. Simon, ISPA 2015
- Codificadores de entropía de nueva generación Implementación de entropía de estado finito (FSE) de tANS por Yann Collet
- rygorous/ryg_rans Implementación de rANS por Fabian Giesen
- jkbonfield/rans_static Implementación rápida de rANS y codificación aritmética por James K. Bonfield
- Compresor de ADN CRAM 3.0 (rANS de orden 1) (parte de SAMtools ) del Instituto Europeo de Bioinformática.
- Implementación para Google VP10
- Implementación para Google WebP
- Biblioteca de compresión 3D Draco de Google
- aom_dsp - aom - Implementación de Git en Google de Alliance for Open Media
- Compresión de datos mediante sistemas numéricos asimétricos - Proyecto de demostraciones de Wolfram
- GST: Texturas supercomprimidas decodificables por GPU GST: Texturas supercomprimidas decodificables por GPU
- Comprender la compresión (libro de A. Haecky y C. McAnlis)
- Algoritmos de compresión sin pérdidas
- Máquinas de estados finitos
- Sistemas de numeración posicional no estándar
- Compresión de datos
- Inventos polacos