Reducir el tiempo de descarga usando números primos

Recientemente ha surgido un problema en la programación con el que podría beneficiarme enormemente de la experiencia de los matemáticos adecuados. El problema del mundo real es que las aplicaciones a menudo necesitan descargar grandes cantidades de datos de un servidor, como videos e imágenes, y los usuarios pueden enfrentar el problema de no tener una gran conectividad (por ejemplo, 3G) o pueden tener un plan de datos costoso.

Sin embargo, en lugar de descargar un archivo completo, he estado tratando de demostrar que es posible simplemente descargar una especie de "reflejo" del mismo y luego usar la poderosa computación del teléfono inteligente para reconstruir con precisión el archivo localmente usando probabilidad.

La forma en que funciona es así:

  1. Un archivo se divide en sus bits (1,0,0,1, etc.) y se presenta en un patrón predeterminado en forma de cubo. Como ir de adelante hacia atrás, de izquierda a derecha y luego hacia abajo en una fila, hasta completar. El patrón no importa, siempre y cuando se pueda revertir después.
  2. Para reducir el tamaño del archivo, en lugar de solicitar todo el cubo de datos (el equivalente a descargar todo el archivo), solo descargamos 3 lados 2D. A estos lados los llamo la reflexión a falta de un término mejor. Tienen el contenido del cubo mapeado en ellos.
  3. Luego, el reflejo se usa para reconstruir el cubo de datos en 3D usando probabilidad, algo así como pedirle a una computadora que haga un gran Sudoku tridimensional. Crear el reflejo y reconstruir los datos a partir de él es computacionalmente pesado, y por mucho que a las computadoras les encanta hacer matemáticas, me gustaría aligerar un poco su carga.

La forma en que me imagino es como un cubo de Rubik transparente de 10x10. En tres de los lados, la luz brilla a través de cada fila. Cada celda por la que viaja tiene un valor predeterminado y está activada o desactivada (ya sea 1 o 0 binario). Si está encendido, magnifica la luz por su valor. Si está apagado, no hace nada. Todo lo que vemos es la cantidad final de luz que sale de cada fila, después de viajar a través del cubo desde el otro lado. Usando los tres lados, la computadora necesita determinar qué valores (ya sea 1 o 0) hay dentro del cubo.

Por el momento estoy usando números primos normales como valores de celda para reducir el tiempo de cálculo, pero tengo curiosidad por saber si hay otro tipo de primo (u otro tipo de número completamente) que podría ser más efectivo. Estoy buscando una serie de valores que tenga la combinación más baja posible de componentes dentro de esa serie.

Aquí hay un diagrama aproximado:

ingrese la descripción de la imagen aquí

Puede ser útil imaginar que la luz brilla en las flechas verdes y sale con algún valor en las flechas rojas. Esto sucede para cada fila, en cada una de las tres direcciones. Nos quedan solo tres lados 2D de números, que se usan para reconstruir lo que hay dentro del cubo.

Si miras donde sale el 14 a la izquierda, puede haber dos combinaciones posibles, (3 + 11 y 2 + 5 + 7). Si por el bien de los argumentos asumiéramos que son 3 y 11 (de color verde), entonces podríamos decir que en la coordenada donde existen 3 y 11, hay celdas activas (aumentando la luz por su valor). En términos de datos, diríamos que está activado (binario 1).

En la práctica, rara vez podemos decir con certeza (para 2 y 3 podríamos) qué valor interno tiene en función de su reflejo en la superficie, por lo que se asigna una probabilidad para cada coordenada o celda. Algunos números nunca se reflejarán en la superficie, como el 1, el 4 o el 6, ya que no pueden estar compuestos únicamente por números primos.

Lo mismo sucede en la dirección vertical, donde la salida es 30, que tiene múltiples posibilidades de las cuales dos corresponden a la posibilidad que se muestra en la dirección horizontal con una salida de 14, de color azul y rosa (ya que dan en el 23, lo mismo que 3 en la dirección horizontal).

Esta probabilidad también se suma a esa coordenada y repetimos en la dirección de adelante hacia atrás, haciendo lo mismo por última vez. Después de hacer esto para cada celda en todo el cubo, tenemos un conjunto de tres probabilidades de que una celda esté encendida o apagada. Luego se usa como punto de partida para ver si podemos completar el cubo. Si no se 'desbloquea' probamos con una combinación diferente de probabilidades y así sucesivamente hasta que hayamos resuelto el Sudoku 3D.

ingrese la descripción de la imagen aquí

El paso final del método es una vez que se resuelve el cubo, la información binaria se extrae y se organiza en el patrón inverso al que se presentó en el servidor. Luego, esto se puede cortar (por ejemplo, para varias imágenes) o se puede usar para crear un video o algo así. En teoría , podría toser descargar algo como Avatar 3D (280 GB) en unos 3 minutos con wifi decente. Sin embargo, resolverlo (no importa construir la salida de píxeles) llevaría un tiempo, y aquí es donde tengo curiosidad sobre el uso de una alternativa a los números primos.

Es posible que hayas adivinado que mi capacidad matemática va por un precipicio muy empinado más allá de la programación de rutina. Hay tres áreas de preocupación/inconvenientes de este método:

  1. es basura en niveles bajos de transferencia de datos. Un cubo de 10 x 10 x 10, por ejemplo, tiene un 'área de superficie' más grande que el volumen. Esto se debe a que, si bien cada celda puede contener un bit (ya sea 1 o 0), cada celda de superficie debe tener un mínimo de 8 bits (un carácter es un byte u 8 bits). Ni siquiera podemos tener 'nada', ya que necesitamos que null se comporte como un tipo de marcador de posición para mantener intacta la estructura. Esto también explica por qué en el diagrama anterior, un cubo de 1000x1000x1000 celdas tiene sus áreas de superficie multiplicadas por 4 caracteres (el milésimo primo es 7919 - 4 caracteres) y el cubo de 10'000 (al cubo) tiene sus áreas de superficie multiplicadas por 6 caracteres (10'000th prime es 104729, seis caracteres). El objetivo es mantener al mínimo la longitud total de los caracteres en el lado 2D. Usar letras podría funcionar, ya que podríamos pasar de aZ con 52 símbolos, antes de pagar doble burbuja por el siguiente carácter (el equivalente a "10"). Hay 256 caracteres ASCII únicos, por lo que ese es el límite superior allí.
  2. los factoriales siguen siendo demasiado altos usando números primos. ¿Hay una serie de números que tienen caracteres cortos (para evitar el problema anterior) y tienen muy pocos padres posibles? Me inclino por algún subconjunto de números primos, pero me faltan las matemáticas para saber cuál, ¿algún tipo de Fibonacci invertido? Cuantas menos combinaciones posibles, más rápido la computadora resolverá el cubo.
  3. Todavía no he probado si es posible usar un tercer, cuarto o enésimo lado para aumentar la capacidad del cubo o la precisión del reflejo. Usar un octaedro (amarillo debajo) en lugar de un cubo podría ser mejor, solo duele un poco el cerebro para imaginar cómo podría funcionar. Supongo que tendería hacia una esfera, pero eso está más allá de mi capacidad.

ingrese la descripción de la imagen aquí

EDITAR:

Gracias por tu útil aporte. Muchas respuestas se han referido al principio del casillero y al problema de demasiadas combinaciones posibles. También debo corregir que un cubo de 1000x requeriría 7 dígitos y no 4 como dije anteriormente, ya que la suma de los primeros 1000 primos es 3682913. También debo enfatizar que la idea no es comprimir en el sentido común de la palabra, como sacar píxeles de una imagen, pero más como enviar planos sobre cómo construir algo, y confiar solo en el cálculo y el conocimiento en el extremo receptor para completar los espacios en blanco. Hay más de una respuesta correcta, y se marcará como correcta la que tenga más votos. Muchas gracias por las detalladas y pacientes explicaciones.

Sé tanto sobre el tema que estás abordando como sobre la vida en el planeta Neptuno. Dado que, desde la perspectiva de la caja negra, parece que la compresión de imágenes ya se ha estudiado con respecto al almacenamiento de gráficos como archivos "jpeg" (por ejemplo, *.jpg). La idea es que el software gráfico típico le permita especificar el nivel de compresión que se utilizará para almacenar el archivo *.jpg. Cuanto mayor sea la compresión, más datos se perderán y menor será el tamaño del archivo. Entonces, si pudiera estudiar el algoritmo de compresión jpeg, podría evitar reinventar la rueda.
Escuché lo que dices sobre la rueda (y prácticamente me gustaría usarla para la transferencia de imágenes y videos), pero en teoría, el mismo método podría usarse para cualquier dato binario, como textos, siempre que pueda reconstruirse. al otro lado. Un jpg se transfiere al máximo (digamos x MB) y está listo para funcionar cuando llega. Queremos transferir, digamos x/n MB, y luego reconstruir al llegar.
Aparte, las probabilidades no se calculan sobre la marcha para una fila determinada; en cambio, el valor de salida de una fila se usa como clave para desbloquear un diccionario de matriz de probabilidades, que luego se aplica a toda la fila en una vez. Se cargan con anticipación (y siempre serán los mismos) manteniendo el cálculo solo para resolver el cubo.
La tomografía de rayos X intenta hacer esto, aunque no puede optar por reemplazar densidades con números primos, etc. La transformada de Radon es relevante. Pero si los datos originales contienen 1000 bits, entonces los datos transmitidos deben decir cuál de los 2 1000 posibles imágenes, por lo que los datos transmitidos también necesitan 1000 bits. La compresión se debe a que los píxeles vecinos en las imágenes reales son abrumadoramente similares entre sí, por lo que lo suficientemente cerca es lo suficientemente bueno.
¡Sí, como una radiografía! Pero con valores únicos para cada uno de los huesos o lo que sea que atraviese. Lo siento, no sigo el pensamiento de 2 elevado a 1000. Un cubo de 1000 bits tendría un reflejo de 3 lados de 10x10; en ese nivel costaría más transferir el reflejo que solo el binario original (10 (ancho) x 10 (alto) x 3 (lados) x 8 (bytes) por carácter) x 2 (caracteres) = 4800 bits). Necesito buscar la transformada de Radon.
Una observación básica: Hay 2 norte diferentes cadenas de bits de longitud norte . Si su algoritmo comprime cada cadena de longitud norte hasta una longitud más pequeña metro , entonces tiene (muchas) menos cadenas de salida posibles para usar que la cantidad de entradas posibles, por lo que muchos archivos de entrada tendrán la misma representación comprimida, por lo que el procedimiento de descompresión no tiene forma de distinguirlos.
Podría valer la pena analizar la descomposición del valor principal, creo que suena espiritualmente relacionado con lo que propones. di que tienes norte píxeles que son cada escala de grises, entonces el espacio de todas esas imágenes se puede modelar como un norte espacio vectorial real dimensional. La imagen es un punto en este espacio. La idea de la descomposición de valores principales es, dado un gran conjunto de imágenes, identificar un pequeño número ( << norte ) de vectores base en este ritmo que capturan la mayor parte de la variación de los datos en la imagen. Proyectar cada imagen en este subespacio es efectivamente una forma de compresión.
Hay un contenido mínimo de información en un archivo. Básicamente, no puede comprimirlo por debajo de este nivel de contenido. La compresión de archivos funciona porque la mayoría de los archivos son muy redundantes: el contenido de información real es mucho más pequeño que el tamaño del archivo. Pero reconozca que hay un límite y que hay algoritmos que se acercan razonablemente a él. solo podrás vencerlos en pequeñas cantidades. Con las imágenes y el sonido, a menudo puede ir un poco más allá al permitir cierta pérdida de información sin una degradación notable de la calidad de imagen/sonido ("algoritmos con pérdida"), según el uso.
Tengo la sensación de que esto no es eficiente en un sentido teórico de la información.
para profundizar en lo que publicó @Karl, creo que esto implica que todas las cadenas de una cierta longitud de bits tienen un límite superior en su complejidad de kolmogorov-chaitin, lo que definitivamente no es cierto, algunas cadenas requerirán más bits de los que están disponibles ipso facto esto no puede trabajar. Creo que incluso más simplemente podría mostrar que no hay una función inyectiva de cadenas binarias de longitud n a cadenas binarias de longitud n-1
No he votado sobre esto, pero si lo hiciera, estaría tentado a votar en contra debido a dos cosas: (1) la pregunta sugiere que usted desconoce por completo algunos principios básicos de la teoría de la información (por ejemplo, el principio del casillero) que evitar que esto funcione tan bien como parece pensar que lo haría (2) también sugiere que realmente cree que puede superar el rendimiento de otros algoritmos de compresión con este enfoque. Para mí, eso sugiere un cierto nivel de arrogancia y desdén por la experiencia existente en esta área. Estoy seguro de que no tenías la intención de que pareciera de esa manera, pero para mí lo es.
(cont.) Si su pregunta se ha escrito de una manera que sugiera que alguien busca entender, por ejemplo, en la línea de "No estoy familiarizado con el funcionamiento de la compresión real, así que no entiendo qué podría salir mal con esto; ¿Puedes ayudarme a entender?", entonces obtendría la impresión completamente opuesta. De todos modos, ya que preguntaste, pensé que apreciarías esta perspectiva sobre por qué una persona podría rechazar tu pregunta. (Y sí, entiendo que mi pensamiento es diferente al de muchas otras personas que consideran que esta es una buena pregunta; está bien, no estoy tratando de discutir la votación correcta o incorrecta).
Es posible que desee ver el entrelazado. El enfoque de esos algoritmos es lo suficientemente similar a lo que está haciendo, por lo que puede tomar prestado de ellos.
Esto también me recuerda un poco a los códigos turbo que se crearon con el objetivo de maximizar el ancho de banda del canal.
@DavidZ Pido disculpas a usted y a cualquier otra persona por la impresión de que fue una pregunta arrogante formulada o redactada de manera arrogante. Esa no era mi intención en absoluto, estoy genuinamente interesado en recibir comentarios de personas que saben más que yo en esta área y trataron de escribirlo de esa manera.
@DavidZ Conceptualmente, podríamos estar superándonos en el tema de la compresión. La idea no es tomar datos y eliminar la redundancia y transferirlos, es ser agnóstico de los datos (el contenido en sí) y usar suficientes sugerencias sobre su estructura para poder recrearlos en el otro lado. Estamos transfiriendo planos de construcción, no los materiales de construcción. Es cierto que los planos de construcción faltan muchas páginas donde el capataz tiene que adivinar un poco antes de comenzar.
Otra observación básica: si su algoritmo pudiera reducir cualquier cadena de bits de longitud n a longitud m < n, entonces repetir el algoritmo varias veces conduciría eventualmente a reducir cada entrada a 1 bit
Puede que me equivoque, pero esto parece un poco demasiado abierto para tener una respuesta concreta y parece más adecuado para una discusión o investigación abierta (que no son particularmente adecuados para el formato de preguntas y respuestas de este sitio). Aunque la compresión, y específicamente la compresión de video, son campos bien estudiados. La única forma en que es probable que supere lo que ya existe es enfocarse de manera muy efectiva en patrones específicos que comúnmente existen en los datos del mundo real. Tal vez su idea pueda hacer eso, pero en este momento parece estar tratando de construir algún algoritmo teórico de propósito general, lo que parece inútil.
@BlueRaja-DannyPflughoeft lol eso sería divertido. Sin embargo, no sé si la información realmente se pierde a medida que desciende en un bit. Se vuelve más dependiente de las reglas que lo crean (las que lo construyen en la computadora). π es 1 byte pero puedes extrapolar mucho de él, si sabes cómo leerlo. Prácticamente, aunque los cubos pequeños son inútiles y un cubo de 3x3 no podría contener suficiente información sobre sí mismo para reconstruirse. Los 9 bits del cubo solo pueden recrear una letra, por lo que hay un límite inferior.
Un enfoque diferente que podría considerar para resolver el problema es aprovechar el hecho de que cada dispositivo que quiere descargar algo ya tiene varios gigabytes de datos que se conocen universalmente: el sistema operativo. Si pudiera indexar esos datos, partes de la descarga podrían estar formadas por referencias a los datos conocidos y reconstruirse. Los problemas serían tener diferentes versiones del archivo para cada sistema operativo cliente y tener que crear nuevas versiones cuando se publiquen las actualizaciones del sistema operativo.
@AaronF ese es un concepto genial, como una biblioteca almacenada en cada dispositivo que podemos extraer para obtener más datos.
Tenga en cuenta que el video al que la mayoría de la gente está expuesta ya está bastante comprimido. El tamaño del video sin comprimir probablemente sea unas docenas de veces más grande que el video que realmente recibe en algún lugar como Netflix o en un disco que compra. Tratar de comprimir un video ya comprimido sería una mala idea (y probablemente ni siquiera sea posible con su idea). Deberá comenzar con el video sin comprimir y no solo hacer algo que pueda igualar o superar las proporciones de compresión existentes, sino también hacerlo mientras el video se ve decente. Eso no va a ser fácil, por decir lo menos.
@BernhardBarker, la idea del cubo es independiente de lo que está "comprimiendo". Si funcionara, reconstruiría el video en su formato ya comprimido. Simplemente toma el binario y lo pasa, no cambia ningunos ni ceros.
@JohnnyRockex Me doy cuenta de que se puede usar para cualquier tipo de datos, pero la compresión basada en cubos solo sería efectiva si el algoritmo apunta a los patrones que existen en sus datos cuando se representan como un cubo. Definitivamente hay algunos patrones de este tipo en el video sin comprimir (pero puede que no sean los patrones que desea); probablemente no haya tales patrones en el video ya comprimido, que puede convertir en un galimatías en su lugar. La compresión con pérdida para datos ya comprimidos es una mala idea en general, porque cuanto más se comprime, más datos se pierden (y para los datos sin pérdida, por lo general, simplemente no se comprime).
No estoy tratando de disuadirlo, en caso de que suene como tal, sino que solo estoy tratando de asegurarme de que tenga una idea precisa de lo que ya existe, algunos de los conceptos básicos de la teoría de la compresión, qué resultados realmente podría esperar y cuánto trabajo probablemente tenga que realizar para obtener un algoritmo que pueda competir con lo que existe. La compresión es un tema interesante, pero si te lo tomas en serio, te sugiero que empieces investigando las investigaciones existentes sobre el tema. Por supuesto, si solo está experimentando con la compresión por diversión, también está bien.
@JohnnyRockex exactamente :-) Es una idea que tuve hace unos años, pero no he llegado a desarrollar un PoC. Es posible que en realidad no funcione muy bien en la práctica, y no funcionaría en absoluto en el ejemplo que diste del archivo de video de 280 GB (los sistemas operativos son solo de 5 a 15 gigabytes más o menos), pero para ciertos tipos de datos podría ser bueno . También podría tener inconvenientes muy extraños: la descarga de datos a, por ejemplo, Windows puede ser de solo 2 MB, pero a Android puede ser de 2 GB, y las actualizaciones del sistema operativo pueden causar grandes dolores de cabeza. ¿Pero podría valer la pena investigar si tienes tiempo?
Las respuestas a continuación muestran que no puede enviar planes con una solución única utilizando menos bits (¡porque el código no es más que planes en primer lugar!), pero podría enviar planes incompletos. si obliga al capataz a adivinar cada bit, entonces el teléfono de destino podría enumerar sqrt (2 ^ n) archivos diferentes y dejar que el usuario/teléfono escoja cuál quiere. Pero tenga en cuenta que si ya está usando la compresión adecuada, entonces cada uno de esos archivos será razonable, muchos harán casi lo que usted quería. El teléfono/usr no podrá encontrar el archivo deseado sin más pistas, esas pistas toman datos.
Yo tampoco voté porque no quería votar negativo en una pregunta con tanto contexto y esfuerzo. Pero como señaló otra persona, no es del todo absurdo rechazar una publicación de este tipo. Lo que se podría mejorar: ( 1 ) más enfoque en el método/algoritmo sugerido ( 2 ) Una justificación de por qué los números primos deberían ayudar a mejorar la compresión (esto está lejos de ser obvio) ( 3 ) Una comparación con el nuevo método con métodos que ya están disponibles
"enviar planos sobre cómo construir algo y confiar en el cálculo y el conocimiento en el extremo receptor para completar los espacios en blanco" es compresión en el sentido tradicional
@ user253751 Lo estoy diferenciando de la compresión que en realidad va al binario y lo reorganiza para eliminar la redundancia. Sí, ambos usan planos para reconstruir, pero el método anterior solo usa planos. Sin embargo, falla conceptualmente.
@JohnnyRockex, es posible que tenga una mala comprensión de cómo funciona la compresión, entonces, no existe tal cosa como "reorganizarla para eliminar la redundancia" y tampoco existe tal cosa como "ir al binario"
@ user253751 Si optimizamos una imagen para web, ¿cambia el binario?
Tus últimos comentarios dejan claro que no sabes prácticamente nada de compresión. La compresión no tiene nada que ver con el binario, la optimización para la web o la eliminación de la redundancia. Haría bien en aprender combinatoria básica seguida de teoría básica de la información, en lugar de continuar repitiendo su afirmación de que su pregunta no se trata de compresión, cuando claramente no importa lo que piense o diga.
@ user21820 Supongo que el binario de una imagen antes de la optimización (por ejemplo, 4 mb) y después de la optimización (por ejemplo, 0,5 mb) no puede ser idéntico, ya que la cantidad total de bits se reduce considerablemente.
No sé por qué pareces creer que mi comentario anterior es incorrecto. Tu comentario después de eso solo sirve para confirmar lo que dije.
@ user21820 en primer lugar, el hecho de que haya Internet entre nosotros no significa que no podamos ser amistosos caballeros o damas. En segundo lugar, si está seguro de que el binario subyacente no cambia, ¿cómo afecta la optimización al tamaño del archivo en el nivel más granular?
¿Cómo puedo siquiera responder a sus 'preguntas' cuando simplemente no tienen sentido? digo de nuevo; necesita aprender combinatoria básica y teoría básica de la información, de lo contrario, solo está perdiendo su tiempo y el tiempo de otras personas.
Ya no estoy seguro de que estemos hablando de compresión. Pongamos un alfiler en él, pero gracias por la entrada. Honestamente, aprecio discutir con otros y aprender de ellos, y es una gran plataforma para eso. Revisaré esas áreas de estudio y seguiré investigando.

Respuestas (6)

La compresión universal sin pérdidas es imposible, esto no puede funcionar. El conjunto de cadenas binarias de longitud norte no es inyectiva al conjunto de cadenas binarias de longitud norte 1 .

Hay 2 norte cadenas binarias de longitud norte . Llamemos al conjunto de todas las cadenas binarias de longitud dada S k . Cuando k = norte 1 , hay | S norte 1 | = 1 + 2 + 2 2 . . . + 2 norte 1 = 2 norte 1

Desde 2 norte > | S norte 1 | , el principio del casillero implica que no existe una función inyectiva del conjunto de todas las cadenas binarias de longitud norte a cualquier S k para k < norte . Esto significa que un esquema perfecto de compresión sin pérdidas como el descrito es imposible ya que constituiría tal función.

Además, para cualquier número norte existe una cadena de longitud norte cuya complejidad Kolmogorov-Chaitin es norte .

Si asume que este no es el caso, tiene alguna función gramo : PAG X dónde pag X PAG es un programa que codifica una cadena X X cuya complejidad C ( X ) < | X | . tal que gramo ( pag X ) = X y | pag X | < | X | . También sabemos que X y pag X pag y . De nuevo por el principio del casillero si todos 2 norte cadenas de longitud norte tener un programa cuya longitud es menor que norte , de los cuales sólo puede haber 2 norte 1 , debe haber un programa que produzca dos cadenas diferentes, de lo contrario, el conjunto más grande no está cubierto. Nuevamente, esto es absurdo, por lo que al menos una de estas cadenas tiene una complejidad de al menos su propia longitud.

Editar:A las preguntas sobre la compresión con pérdida, parece poco probable que este esquema sea ideal para la gran mayoría de los casos. No tiene forma de controlar dónde y cómo induce errores. Los esquemas de compresión como H.264 aprovechan la estructura visual inherente de una imagen para lograr una mejor fidelidad en tamaños más bajos. El método propuesto elegiría indiscriminadamente una solución para el sistema de ecuaciones que genera, lo que probablemente introduciría artefactos notables. Creo que también es posible que estos sistemas estén sobredeterminados, usando espacio innecesario, mientras que una DCT es una descomposición ortogonal. La solución de estas ecuaciones probablemente también tendría que encontrarse usando un solucionador SAT/SMT, cuyo tiempo de ejecución también haría que la descompresión muy costoso si no intratable, mientras que las técnicas basadas en DCT están bien estudiadas y optimizadas para el rendimiento,

Todo el crédito por una excelente pregunta en la que ha gastado mucha energía creativa. Este es un comentario en lugar de una respuesta porque es demasiado largo para el cuadro de comentarios habitual.

Tiene una idea interesante y continúe investigándola, pero ¿sabía que la compresión de datos ya tiene una base de investigación muy amplia? Es posible que desee investigar en caso de que su idea, o algo similar, ya esté disponible. Hay un artículo de Wikipedia sobre la compresión como punto de entrada al tema.

Algunas observaciones son:

  1. Los archivos de sonido, películas e imágenes utilizados por la mayoría de las aplicaciones están altamente comprimidos, generalmente (pero no siempre) utilizando algoritmos imperfectos con una pérdida de datos asociada. Formatos como zip, jpeg, mp3, mov e incluso png, por lo tanto, no están 'listos para funcionar al recibirlos', pero a veces necesitan un procesamiento extenso antes de su uso. Los algoritmos se han desarrollado mucho en los últimos 50 años y, en algunos casos, son muy sofisticados.

  2. En general, la compresión explota la regularidad en los datos originales (como una foto, donde gran parte de la imagen puede ser similar, o texto donde el mensaje puede usar solo una pequeña cantidad de palabras diferentes) y funciona peor o no funciona en absoluto cuando el archivo los datos son verdaderamente aleatorios.

  3. En algunas aplicaciones, la pérdida de datos puede ser aceptable, por ejemplo, en una imagen o música donde el ojo o el oído realmente no pueden ver ni escuchar pequeñas imperfecciones, y en estos casos se pueden obtener niveles muy altos de compresión (por ejemplo, una reducción del 90 % en el tamaño ). Pero para muchos propósitos, necesita resultados perfectos garantizados, ya que la pérdida de precisión simplemente no será aceptable, por ejemplo, en un archivo de programa de computadora o en un texto. Los datos a menudo todavía se pueden comprimir, aprovechando la regularidad existente, pero no se garantiza un ahorro en todos los casos.

Un comentario final sobre estas observaciones es que aplicar la compresión dos veces rara vez es efectivo porque los datos regulares una vez comprimidos se vuelven mucho menos regulares y menos susceptibles a una mayor compresión, por lo que tratar de comprimir un archivo jpg o mp3 generalmente no ahorrará nada e incluso puede costar espacio. .

Gracias por su respuesta. Me imagino que la mayoría de las optimizaciones son inteligentes, como en el caso de una imagen de un cielo azul, por ejemplo, podría buscar esa regularidad en forma de píxeles azules similares, y si desde las coordenadas (0,0) a (1000,0) es todo azul, córtalo. El método del cubo anterior es comparativamente tonto o apático. Si se usara para ese cielo azul, no está "quitando ningún píxel" (sin pérdida), por lo que podría ejecutarse en una imagen ya optimizada. El trabajo pesado es el poder de procesamiento para "adivinar" los datos. No está optimizando la imagen en ese sentido, sino capturando una sombra de sus datos y reconstruyéndola.
Sugeriría vincular, citar o parafrasear esta sección , ya que es directamente relevante para lo que OP está tratando de lograr.
Creo que esta es una excelente respuesta a esta pregunta, pero vale la pena señalar que los algoritmos de compresión más utilizados en la web son bien conocidos por no ser óptimos y tener sucesores existentes, pero JPG, PNG, MP3, MP4, etc. son comúnmente admitidos y conocidos, por lo que las personas se adhieren a ellos.
Me parece que la idea aquí es que hagas el cubo y luego tengas algún tipo de IA entrenada para adivinar el relleno. (En otras palabras, la forma exacta del cubo no es tan relevante para la idea central como tener la IA para adivinar el resto de los datos dados una parte. Uno podría simplemente eliminar cada byte de por medio, digamos, y luego haz lo mismo [eso es 50% de compresión].)
La información adicional, entonces, está en la red neuronal de la IA.
+10 si pudiera. Sin olvidar que un algoritmo ampliamente utilizado es Deflate, que hace que combinaciones como comprimir (comprimir) archivos PDF y PNG con gzip o PKZIP-2 sean bastante inútiles, ya que todos usan Deflate.

Comenzaré confesando que no leí la descripción completa de su esquema de compresión en detalle. Realmente no necesito hacerlo, ya que lo que está tratando de lograr es un esquema de compresión de datos sin pérdidas independiente de la entrada, y eso es imposible.

Teorema 1: no existe un esquema de compresión sin pérdidas que mapee cada archivo de longitud norte bits a un archivo de longitud inferior a norte pedacitos

La prueba se sigue fácilmente del principio del casillero y del hecho de que hay 2 norte archivos distintos de norte pedacitos pero solo 2 norte 1 archivos distintos de menos de norte pedacitos Esto implica que cualquier mapeo de esquema de compresión norte -archivos de bits a archivos de menos de eso norte Los bits deben asignar al menos dos archivos de entrada al mismo archivo de salida y, por lo tanto, no pueden tener pérdidas.

Teorema 2: No existe un esquema de compresión sin pérdidas para el cual la longitud promedio de los archivos de salida sea más corta que la longitud promedio de los archivos de entrada (con promedios tomados de todos los archivos de entrada posibles como máximo). norte bits de longitud, para cualquier entero no negativo norte ).

Este teorema más fuerte es un poco más complicado de probar. Para ser breve, supondré que está familiarizado con la notación básica de la teoría de conjuntos, como R S por la unión, R S para la intersección y R S = { X R : X S } por la diferencia de los conjuntos R y S .

Necesitamos un poco de notación adicional. Específicamente, deja Len ( X ) indicar la longitud del archivo X , y deja Len ( S ) = X S Len ( X ) denota la longitud total sumada de todos los archivos en el conjunto S . Así, la longitud media de los archivos en S es Len ( S ) | S | , dónde | S | es el número de archivos en S . También Len ( R S ) = Len ( R ) + Len ( S ) para dos conjuntos disjuntos de archivos R y S .

Ahora deja F ser un esquema de compresión sin pérdidas, es decir, una función de asignación de archivos a archivos, vamos A ser el conjunto de todos los archivos de longitud máxima norte pedacitos, y dejar B = { F ( X ) : X A } Sea el conjunto de archivos obtenidos aplicando F a cada archivo en A . Desde F no tiene pérdidas, debe mapear cada archivo de entrada en A a un archivo de salida distinto; de este modo | B | = | A | , y así también | A B | = | B A | .

Desde A es el conjunto de todos los archivos como máximo norte bits de largo, se sigue que Len ( X ) norte si y solo si X A . De este modo

Len ( A B ) norte | A B | = norte | B A | Len ( B A )
(donde la segunda desigualdad es estricta a menos que A = B , lo que implica que A B = B A = ).

Además, desde A B es disjunto de ambos A B y B A ,

Len ( A ) = Len ( A B ) + Len ( A B ) Len ( A B ) + Len ( B A ) = Len ( B ) .
Y desde | A | = | B | , como se señaló anteriormente, por lo tanto tenemos Len ( A ) | A | Len ( B ) | B | (donde, de nuevo, la desigualdad es estricta a menos que A = B ).


PD. Entonces, ¿cómo funcionan los esquemas de compresión sin pérdidas del mundo real ? En pocas palabras, se basan en el hecho de que la mayoría de los archivos "naturales" (que contienen datos de imagen o sonido sin comprimir, código de programa, texto, etc.) tienden a ser muy repetitivos y muy diferentes a un archivo aleatorio de longitud similar. Básicamente, esos archivos "naturales" forman solo un pequeño subconjunto de todos los archivos de su longitud, y el software de compresión inteligente puede identificar dichos archivos repetitivos y acortarlos, mientras aumenta (ligeramente) la longitud de otros archivos de entrada de aspecto más aleatorio.

También es posible hacer esto de manera que se garantice que nunca aumentará la longitud de ningún archivo en más de un pequeño número fijo de bits, incluso en el peor de los casos. De hecho, es posible tomar cualquier esquema de compresión sin pérdidas F y convertirlo en un esquema F que es casi tan eficiente y solo aumenta la longitud de cualquier archivo de entrada en un bit como máximo: simplemente defina

F ( X ) = { ( 0 , F ( X ) ) si  Len ( F ( X ) ) < Len ( X ) ( 1 , X ) de lo contrario,
dónde ( b , X ) denota anteponer el bit b al archivo X .

Es cierto que no puedes hacer un esquema de compresión sin pérdidas de esta manera. Pero el OP mencionó el envío de videos e imágenes, cosas que no necesariamente necesitan compresión sin pérdidas. ¿Podría esto ser la base de quizás un buen método de compresión con pérdida para aquellos, o no tendría ninguna ventaja sobre los métodos existentes (por ejemplo, H.264 y similares)? Básicamente, la idea parece ser utilizar algún tipo de conjetura sobre los datos "más probables", no los datos exactos que en realidad se cifraron. Así que estamos hablando de compresión con pérdida. No obstante, todavía hay un límite estricto cuando muerdes
suficiente información que tus ojos comienzan a notar.
Cuando dice "No existe un esquema de compresión sin pérdidas para el cual la longitud promedio de los archivos de salida sea más corta que la longitud promedio de los archivos de entrada (con promedios tomados de todos los archivos como máximo de 𝑛 bits de longitud, para cualquier número entero no negativo 𝑛) ." Supongo que quiere decir "todos los archivos posibles", en lugar de "todos los archivos que tengo en mi disco duro en este momento". Pero no tiene mucho valor discutir "todos los archivos posibles", porque el 99,9% de ellos no existen. Los archivos no contienen bits aleatorios.
@The_Sympathizer, si entiendo correctamente la pregunta de OP, están tratando de lograr una técnica de compresión con pérdida independiente del formato de archivo. La mayoría de las técnicas de compresión con pérdida se basan en la eliminación de información que los sentidos humanos pueden pasar por alto, esto varía según el tipo de información, por lo que tenemos diferentes técnicas para diferentes formatos. Es posible que una técnica común no funcione porque puede eliminar un cierto % de información de, digamos, audio y no notarlo, pero puede eliminar el mismo % de información del video y es posible.
@syfluqs sí, la idea es que sea independiente de lo que se transfiere, por lo que no hay una reducción específica del formato en el contenido, como se podría tener con un optimizador de imágenes. Tal vez debería haber enfatizado mejor que la idea es confiar en un cómputo pesado a nivel de servidor y móvil, y asumir un ancho de banda bajo. Estamos pidiendo a las computadoras que creen y resuelvan acertijos, no que los descompriman de acuerdo con instrucciones conocidas.
@Ilmari Karonen: muchas gracias por su respuesta detallada, aprecio el tiempo que tomó. Necesitaré más que las pocas lecturas completas para comprender los conceptos que está discutiendo en él, y lo usaré como punto de partida para futuras investigaciones. A riesgo de sonar muy estúpido frente a personas que no lo son, ¿en qué se diferencia conceptualmente el método anterior de nosotros resolviendo sudokus? Completamos los datos faltantes usando matemáticas y terminamos el rompecabezas con más datos de los que comenzamos. En ese sentido, no estamos decodificando datos "comprimidos", estamos creando nuevos datos basados ​​en reglas.
@JohnnyRockex La diferencia es que los sudokus son un tipo de sistema muy cuidadosamente restringido, de modo que solo se necesitan unos pocos cuadrados para identificar de manera única todo el rompecabezas. No tenemos tanta suerte con los datos informáticos. El peor de los casos de una gran cantidad de datos altamente impredecibles en realidad ocurre por diseño en criptografía.
@CortAmmon Sin embargo, conceptualmente, son diferentes en grado, no amables. Podríamos escribir un programa hoy que resuelva un sudoku de 3x3 instantáneamente. Mañana lo hacemos 9x9, luego 100x100, 10(3), 10(4) y así sucesivamente. ¿En qué punto del camino hacia un sudoku de 10k en cubos fallan las reglas para resolver el rompecabezas? La proporción de datos conocidos a desconocidos aumenta (que es lo que queremos) y se necesita más potencia/tiempo de la computadora, pero no le estamos pidiendo algo diferente, simplemente subiendo de nivel la dificultad. El objetivo es diseñar el cubo lo más fácil posible de resolver mientras se aumenta la proporción de datos conocidos a desconocidos.
@Johnny La diferencia es que en un Sudoku, las filas, columnas y cuadros deben obedecer reglas fijas, que nos permiten resolver el rompecabezas. Una imagen general (u otro archivo) no está restringida de esa manera. Sin embargo, la mayoría de los datos útiles/interesantes tienen varios tipos de patrones, y un compresor puede codificar esa información de patrón de una manera más compacta. La parte complicada es extraer esos patrones porque no existe un algoritmo general que pueda hacerlo para todos los patrones posibles.
Pero ciertamente es posible crear un compresor que busque ciertos tipos de patrones. Por lo tanto, usamos diferentes compresores para texto, imágenes y audio.
Espero que sea posible crear un compresor basado en ML que se especialice en comprimir imágenes de gatos (técnicas prestadas de Deep Fakes) que funcione significativamente mejor que JPEG. Pero si le das al compresor gato una foto de un pez, fallará miserablemente. ;)
@Johnny Ilmari y algunos de los otros han mencionado el principio del casillero. Este es el principio central que muestra por qué un compresor universal no puede comprimir todos los archivos. El principio del casillero surge en muchas partes de las matemáticas, no solo en la compresión de datos, y hay numerosas preguntas que lo involucran en este sitio. Si se toma en serio el diseño de algoritmos de compresión, debe comprender este principio.
@PM2Ring en Sudokus sabemos que cada cuadrado debe contener números del 1 al 9, y usamos la ausencia de un número como 7 para implicar la regla de que debe existir un 7 en algún lugar de ese cuadrado. Los números en el reflejo del cubo implican la regla de que en algún lugar del cubo debe haber datos binarios en esa fila. No tiene restricciones en el sentido de que podría estar en cualquier coordenada en el punto de creación, al igual que un Sudoku no siempre tiene que seguir el mismo patrón fijo.
@PM2Ring Sí, necesito profundizar más en el principio del casillero, absolutamente. Entiendo los contornos aproximados de esto, pero el hecho de que siga apareciendo en las respuestas implica que aún hay más por entender.
@JohnnyRockex Sí, pero hay muchos problemas de Sudoku que no se pueden resolver como imaginas: tienen múltiples soluciones, por lo que no hay forma de saber cuál es la correcta. Este es el principio del casillero: si hay más soluciones (también conocidas como archivos posibles en el mundo) que representaciones (su buena idea para los reflejos), entonces no siempre puede encontrar la solución correcta dada una representación.
Puede ser útil mirar las Matemáticas del Sudoku . En particular, vale la pena señalar que solo una pequeña fracción de Latin Squares (cada valor aparece en cada fila y cada columna) son Sudoku (cada valor aparece en cada cuadrícula de 3x3). Para un 9x9, 0.0000012 de ellos son rompecabezas de Sudoku. Y ahí es cuando ya asumes que es un cuadrado latino. El Sudoku en realidad comienza con bastante estructura que conoces desde el principio. Hace que el proceso de resolución sea factible.

Como otros han señalado, esto no puede funcionar por razones generales.

Sin embargo, puede estar más interesado en comprender dónde se descompone su análisis para este esquema específico.

Considere un cubo de norte 3 pedacitos En cada fila hay 2 norte diferentes combinaciones, así que si puedes almacenar k valores para cada entrada en uno de los tres lados, en el mejor de los casos puede reducir el número de posibilidades a 2 norte / k .

En tu ejemplo para norte = 1000 y al usar números primos, debe y puede almacenar no valores reales hasta 7919, sino la suma de los primeros 1000 números primos, lo que requiere 7 dígitos decimales. En cualquier caso, habría 10000000 valores diferentes para codificar 2 1000 10 300 diferentes combinaciones, por lo que en el mejor de los casos, un valor en el lado corresponde a 10 293 diferentes combinaciones de bits en esa fila. Incluso proyectar en las diferentes direcciones no hará una diferencia significativa.

Si desea que esto funcione, necesita muchos más dígitos para almacenar sus sumas, o ir a una dimensión muy alta en lugar de 3. En ambos casos, los datos adicionales requeridos para transmitir serán iguales a nuestra cantidad original de datos.

Gracias por su respuesta. Para su primer punto, mi error, los primos en el lado del cubo son como coordenadas, y la salida máxima posible es la suma de esas coordenadas: 3682913, que son 7 dígitos. Esta sería una fila llena de binarios, poco probable pero posible. Donde hay menos, no necesitamos transferir 7 caracteres. Incluso suponiendo una proporción igual a 1/0, aunque la suma de los primeros 500 números primos es 824693, aún son 6 dígitos, no los 4 dígitos que indiqué en la pregunta.
En el segundo punto, esos son números grandes :P Así que vamos pequeños para empezar e ignoramos el costo de los datos, tomamos un cubo de Rubik de 3x3x3 y asignamos aleatoriamente cualquiera de las 27 celdas como activadas o desactivadas, cada fila tiene 8 combinaciones posibles, ¿bien? Una computadora normal se lo comería, pero en algún lugar del camino hacia n = 1000, deja de funcionar, no por ninguna razón matemática, sino porque no tenemos Deep Thought en nuestros bolsillos. Con la advertencia de que aún no he entendido completamente las otras respuestas, ¿se desglosa esto en el concepto o la práctica/poder de cómputo?
@JohnnyRockex Me temo que se rompe el concepto. Si desea que la suma de su fila limite fuertemente el número de combinaciones que dan lugar a la misma suma, necesita números muy grandes. Por ejemplo, para que cada combinación dé una suma única, no puede usar menos de norte bits para la suma (por ejemplo, utilizando la secuencia sencilla 1,2,4,8,... de modo que la suma sea simplemente la representación binaria de los bits en esa fila).
@JohnnyRockex (continuación) Tan pronto como su suma máxima sea menor que eso, digamos 100 bits para norte = 1000 (para compresión por un factor 10 / 3 ), habrá sumas que correspondan a 2 1000 100 10 270 combinaciones No hay forma de identificar cuál simplemente mezclando valores por proyección en 3 direcciones.
correcto, entonces perdemos tanta información en la suma que no podemos recuperarla después y decir con precisión que este bit está en esa coordenada. Si tuviéramos que mantener suficientes datos de coordenadas de identificación, la reflexión sería inútilmente grande.

Extrapolando lo que dijo, el uso de números primos dañará la compresión de datos, no la ayudará.

Supongamos que tenemos una secuencia de 8 bits: ( b 0 , b 1 , b 2 , b 3 , b 4 , b 5 , b 6 , b 7 ).

Podríamos hacer un producto de números primos para codificar esa secuencia de bits: X = 2 b 0 × 3 b 1 × 5 b 2 × 7 b 3 × 11 b 4 × 13 b 5 × 17 b 6 × 19 b 7 .

Pero ahora el rango de valores posibles de X es [ 1 , 9699690 ] , que necesitaría 24 bits para representar en notación estándar. Esto es mucho peor que nuestros 8 bits originales.

Sin embargo, los productos de números primos se pueden usar para pruebas matemáticas teóricas: https://en.wikipedia.org/wiki/G%C3%B6del_numbering

Es un comentario, simplemente no encaja.

Como uno de esos tipos con conexiones lentas, agradezco los esfuerzos.

Youtube es bueno para mí exactamente porque tiene videos de 144p, y si algo es interesante o lo necesito, puedo elegir qué xxxp configurar.

Pero tiene sus problemas de conmutación y almacenamiento en búfer que probablemente no tendría si esa variedad de resoluciones se implementara o lograra de manera diferente.

En los viejos tiempos de los módems, se veía con más frecuencia, una imagen que comienza con unos pocos píxeles enormes y luego se detalla a medida que se descargan más datos. No estoy seguro de qué compresión era, pero parece un jpeg con esteroides. Esos fragmentos de datos podrían definirse como n-streams para video o múltiples imágenes, y podría brindar un control más preciso del lado del usuario, pero estableciendo un límite en la cantidad de canales para solicitar, o ajustarlo automáticamente.

Entonces, tal vez mire no en la dirección de cuánto comprimir, sino en cómo controlar la calidad. Todos los formatos de compresión de tasa de bits fija y tasa de bits variable hacen que varíe la calidad o intente mantener la calidad. Pero producen un blob de datos, y administrar diferentes resoluciones puede ser un desafío en el lado del servidor, por lo que el usuario no tiene tantas opciones (me alegro de que haya algunos lugares donde uno tiene), retrasos en la calidad de cambio, etc., etc.

Entonces, tal vez, como sugerencia, aborde el problema desde una perspectiva diferente: un control de calidad más flexible en el lado del usuario y del servidor. Transición más fluida de una calidad a otra y similares.

Las personas con conexiones más lentas ya hacen compromisos y seguro que aprecian los lugares que ofrecen opciones adecuadas. De la misma manera que no hay alternativa para YouTube para mí porque la menor calidad que he visto fue 360p y es de la mejor calidad para mí (con algunas dificultades, si el clima es bueno, por así decirlo) si ellos (alternativas) tienen tales opciones en absoluto . A veces no me importaría 100p o no necesitaría video en absoluto hasta que lo haga, y cuando lo haga, me gustaría no descartar el búfer de 1 minuto ya existente, sino agregarlo para mejorar la calidad.

Por lo tanto, las mejores herramientas, opciones y enfoques para luchar contra todos esos compromisos pueden ser más apreciados que un algoritmo sorprendente que funciona un 10 % mejor que todos los algoritmos existentes en cualquier dato. Al variar la calidad, obtengo una reducción del 90% de los datos la mayor parte del tiempo: cuando los detalles comienzan a ser importantes, entonces sí, es hora de armas pesadas como esperar un búfer y otras opciones disponibles.

En general, intercambiar recursos de usuario por menos transferencia de datos no es imposible, y no es necesariamente un problema puramente matemático, como 5 oraciones que describen un manzano o una imagen, y el lado del usuario ai genera uno o encuentra visualmente similar en un diccionario, etc. Pero es un problema un poco más amplio.

Acabo de notar que .png todavía tiene esa opción de detalización gradual, esta imagen es un ejemplo i.stack.imgur.com/fZzVE.png La imagen con texto no es el mejor uso para ella, pero me di cuenta hace un momento.
Ese es el entrelazado de Adam7 . Por lo general, los pases iniciales se representan como cuadrados grandes, no como píxeles individuales. He usado Adam7 cuando escribo cosas como programas de exploración de fractales porque lo hace mucho más rápido para navegar.