Las matemáticas que uso



Recientemente, se hizo una pregunta en un foro en línea: ¿cuánto demandan las matemáticas bajo las condiciones de un programador real, con qué frecuencia lo usa y cuáles son sus áreas? Y aquí está mi respuesta.

En primer lugar, yo, como casi todos los programadores, uso la lógica booleana , desde el análisis de expresiones lógicas para declaraciones condicionales y criterios de salida, para alinear tales expresiones con, por ejemplo, las leyes de Morgan . La mayor parte de nuestro trabajo limita con el cálculo de predicados de primer orden y otra lógica de predicados en forma de análisis de precondiciones, invariantes y más (aunque parezca que estamos haciendo otras tareas).

Además, a menudo participo en el análisis de la complejidad de los algoritmos. Las dimensiones de los conjuntos de datos que se procesan en estos días son enormes. En una conferencia de Techonomy de 2010 , Eric Schmidt dijo que el volumen de datos creado por la humanidad hoy en solo dos días es igual al volumen de todos los datos existentes en el mundo a partir de 2003. Es importante para mí poder procesar grandes segmentos de estos volúmenes y beneficiarme de ellos. Y en este sentido, comprender la complejidad espacio-temporal de las operaciones que aplicamos a los datos es la clave para determinar si ciertos cálculos son posibles en principio. A diferencia de los tipos más tradicionales de análisis O o análisis theta, los factores constantes a tales escalas tienen un efecto significativo: el factor 2 no cambia la complejidad de tiempo asintótica del algoritmo, pero requerirá un aumento en el número de procesadores de 10 mil a 20 mil, y tal diferencia en el consumo Los recursos serán tangibles. Como resultado, los cálculos se vuelven más sofisticados. Ejemplos: ¿puedo tomar un cálculo lineal y reducirlo a uno logarítmico? ¿Es posible reducir el consumo de memoria en tres veces? Y así sucesivamente.

A menudo necesito calcular la variante más desfavorable del límite superior, por ejemplo, el tamaño de algún conjunto de datos. En muchos casos, tales cálculos pueden ser no triviales. O puede que necesite analizar alguna fórmula de recurrencia para verificar cómo cambia a medida que aumenta la profundidad de la recurrencia . Para esto, yo, entre otras cosas, debo conocer el teorema básico sobre las relaciones de recurrencia y cómo entender los principios de análisis de series numéricas . Y puede parecer increíble, pero a veces significa que necesito calcular la integral (aunque principalmente solo las integrales de Riemann ). ¿O puedo resolver la relación recursiva y obtener un número finito de soluciones ? ¿Tengo que recurrir al álgebra lineal ? Esto lleva a cosas como generar funciones , números de Stirling , cálculos matriciales . Si tiene curiosidad acerca de lo que se incluye en el conjunto de conceptos matemáticos fundamentales necesarios para comprender la informática, consulte el primer volumen de "El arte de la programación" de Donald Knuth o "Matemáticas concretas" de Knut, Ronald Graham y Oren Patashnik.

Hago muchos cálculos básicos en términos de agregación, combinación y transformación de datos, y la combinatoria (contar el número, encontrar simetrías en diferentes dimensiones y más) me ayuda en esto. Creo que los ejemplos de esta área son obvios.

Utilizo muchas matemáticas discretas , en particular para buscar sistemas algebraicos en operaciones en conjuntos de datos especialmente grandes. ¿Es posible mostrar esta o aquella estructura con la ayuda del homomorfismo como un determinado grupo o anillo , lo que será más claro para mí? ¿Hay una opción con una conexión menos estrecha? ¿Puedo aplicar la acción de un grupo a algún conjunto para crear un modelo especulativo de transformación que simplifique el razonamiento? ¿Puedo definir alguna topología para el análisis de datos? Se sorprendería si supiera cuántas cosas se pueden describir utilizando topologías discretas . Y aún menos sorprendente sería la demanda de desigualdad triangular .

Trabajo mucho con la teoría de grafos . "Crear sitios web": requiere no solo la capacidad de colocar imágenes lindas de gatos en la página. Este proceso también implica insertar nodos en el gráfico global de hipervínculos . Agregar una sola página conduce a un aumento potencial en el número de bordes del gráfico, y esto, a su vez, puede tener un efecto que no es obvio a primera vista sobre el rendimiento, el análisis, la clasificación de los motores de búsqueda y otras características. Comprender las consecuencias de tales cambios puede ayudar a obtener información interesante, como cómo crece el gráfico. Resulta que esta dinámica es dolorosamente similar a una ley de poder : la World Wide Web es una red sin escala . ¿Cuál es el camino más corto entre dos nodos de este gráfico? ¿Cómo se verá esa red si intentas presentarla como un gráfico plano o bipartito ? ¿Cuándo es posible cumplir con estas propiedades, si es posible? Pero, ¿qué pasa si no consideramos la red mundial como un gráfico, sino toda la red de carreteras de América del Norte, Europa o Asia?

Hay otras consecuencias de este conocimiento. A menudo, las personas no entienden que las páginas web modernas no son solo documentos HTML con enlaces y otros recursos, sino estructuras de datos en forma de árbol conectadas entre sí en un gráfico . Estos árboles a menudo se rastrean, procesan y actualizan dinámicamente debido a la interacción entre el navegador web del usuario y un servidor (gracias a tecnologías como AJAX ).

Un ejemplo excelente y adecuado es MathJax . O Gmail Comprender cómo funcionan implica cierto nivel de conocimiento de la computación simbólica y el análisis semántico de los elementos de la página. Los autores de MathJax necesitaban escribir un programa capaz de atravesar el árbol generado sobre la base del modelo de objetos del documento , encontrar elementos matemáticos, "guardarlos" y reemplazarlos dinámicamente con nuevos elementos dibujados. Quizás algunos usuarios que solo ven cómo funciona no sean muy impresionantes, pero suceden cosas bastante complicadas. Por lo general, no tengo que hacer algo similar (no trabajo con el front-end), pero todo el tiempo hago cosas similares en Lisp . Tenga en cuenta que Lisp se agudizó originalmente por el procesamiento matemático de la información simbólica: sus macros cubren completamente los problemas del procesamiento de expresiones simbólicas.

Trabajo mucho con series de tiempo . ¿Cómo cambia el consumo de tráfico o recursos? ¿Qué tendencias se pueden destacar? ¿Es este o aquel salto manifestado en la demora en responder a las solicitudes o el consumo de memoria estacionalmente ? ¿Cómo reacciona la tasa de cambio de algo cuando los datos de entrada varían en diferentes dimensiones? ¿Hay alguna correlación con algún evento externo?

Trabajo mucho con el análisis de datos estadísticos, no solo para determinar las características de rendimiento, sino también para comprender los datos como tales. Además de buscar metadatos semánticos en el árbol DOM mencionado anteriormente (por ejemplo, microdatos y microformatos , RDF , otros datos XML con algún esquema específico), también estoy tratando de comprender datos no estructurados . ¿Cuál es la probabilidad de que este texto sea una dirección postal? ¿O son coordenadas gráficas ? ¿En qué contexto aparece? ¿Es spam ? ¿Tiene sentido? ¿Parece el resultado de un generador de texto basado en cadenas de Markov ? ¿Quizás esta es una serie de citas de algún trabajo literario conocido? ¿O un fragmento de una discusión literaria? ¿O tal vez esta es una discusión sobre el spam que contiene un fragmento literario? Todavía me río cada vez que pienso en un correo electrónico no deseado que anuncia medicamentos envueltos en un fragmento del "Maestro y Margarita" de Bulgakov.

Teoría de la categoría . Los tipos en lenguajes de programación de computadoras corresponden aproximadamente a categorías, y las mónadas y los functores se pueden usar para simplificar seria y elegante algunas construcciones. Por ejemplo, en el lenguaje de programación funcional Haskell, las mónadas se usan para E / S y para modelado de estado . Cuando se trata de programas simplificados, es más fácil hacer que funcionen. Es más fácil hablar sobre ellos, es más fácil de entender, cambiar, etc. Los tipos a menudo se pueden determinar sobre la base del razonamiento lógico, lo que conduce a la aparición de casos especiales (que también se pueden usar en problemas de razonamiento generales). Piense en lo que sucede si usa las conclusiones para aplicar funciones lógicas, como las que se usan en prolog , para transformar gráficos en sistemas distribuidos .

Los sistemas distribuidos nos devuelven a la teoría de grafos. A escala real, los bloqueos del sistema, las excavadoras desgarran la fibra, los terremotos, las erupciones volcánicas y los arrastreros de pesca dañan los cables marinos. Para comprender las consecuencias de tales eventos y determinar las mejores formas de responder a ellos, es necesario comprender las características del gráfico de red. Los algoritmos de enrutamiento y el análisis de red están estrechamente relacionados con cosas tales como encontrar la ruta más corta entre los nodos en un gráfico. El algoritmo Dijkstra te ayudará con esto.

Y, sin embargo, ¿cómo puede distribuir la carga de un gran cálculo entre centros de datos ubicados en diferentes partes del mundo? Aquí también necesitará algunos conocimientos de física: en la escala de Internet, la velocidad de la luz se convierte en un "cuello de botella". La disipación de calor , la densidad de corriente por unidad de área y más son ejemplos de lo que los programadores deben tener en cuenta al trabajar con tareas del mundo real. ¿Debo alojar un centro de datos en Islandia? La refrigeración barata y las fuentes de energía geotérmica crean condiciones atractivas, pero ¿qué pasa con el retraso mínimo para los usuarios que puedan estar interesados ​​en alquilar equipos en dicho centro de datos? ¿Cuál es la distancia a lo largo del arco de un gran círculo entre, por ejemplo, Islandia y Londres, o Berlín y Amsterdam? Calcular todo esto es bastante simple, pero para esto es necesario tener cierto conocimiento matemático. ¿Podemos enviar fibra desde Islandia a otro centro? ¿Cuál es el retraso promedio? ¿Cuál es la probabilidad de una ruptura del cable submarino en el Mar del Norte durante 12 meses de operación? ¿Y por 48 meses?

Por supuesto, la teoría de los algoritmos , la teoría de los autómatas , el análisis , la gramática formal y los lenguajes regulares son áreas de conocimiento con las que los programadores tratan constantemente. A menudo trabajo con análisis y coincidencia de patrones . Al trabajar con datos del mundo real, incluso los conjuntos de tamaño no muy grande pueden contener elementos que pueden causar un comportamiento patológicamente deficiente cuando se utilizan, por ejemplo, técnicas de retroceso . Al usar expresiones regulares para unir datos, debo tener cuidado y asegurarme de que estas expresiones sean realmente regulares .

Al usar una máquina con memoria de almacenamiento para analizar la gramática libre de contexto (que, por cierto, ocurre cada vez que envía una solicitud a un servidor HTTP ), necesito asegurarme de limitar la profundidad de recursión para evitar agotar la pila de llamadas del procesador, lo que requiere comprensión principios subyacentes de la computación y las matemáticas en las que se basan.

Si necesito escribir mi propio algoritmo de descenso recursivo para una gramática inusual y no puede coincidir con LALR (1) (por lo que no puedo simplemente usar yacc o bison ), debo tener cuidado o mantener la pila de estados separada de la recursión procesal. Esta comprensión también es necesaria si voy alrededor del árbol DOM (o cualquier estructura de datos definida recursivamente). Algunos lenguajes de programación consideran que esto es una dificultad en el trabajo de un programador y lo eluden utilizando pilas segmentadas . Por supuesto, sería genial si pudiera definir mi colección de algunos de los recursos analizados en forma de una función (en el sentido matemático). ¿Y qué genial sería si se tratara de algún tipo de problema de optimización de programación lineal ?

Tenga en cuenta que ninguno de los anteriores es ningún conocimiento esotérico. Todo esto se basa en la experiencia con tareas y datos del mundo real. Por supuesto, no hago todo esto todos los días, pero la mayoría de este conocimiento lo aplico regularmente, y solo algunos, de vez en cuando. Probablemente, la observación, la experiencia y la heurística tienen más influencia en el proceso de lo que deberían (los modelos heurísticos son a menudo incompletos e inexactos). ¿Tengo suficiente conocimiento matemático para calcular el error promedio entre la realidad y mi modelo heurístico?

Esta es la esencia de la informática, así como también cómo interactúan con la programación y las realidades de la informática moderna. Ser un profesional de TI no es lo mismo que ser un experto en la teoría de sistemas informáticos, y como muchos señalan correctamente, ese experto está mucho más cerca de un matemático aplicado que de un artesano especializado. En ningún caso quiero menospreciar la importancia de tales profesionales, ya que son útiles y son universalmente respetados, pero solo quiero señalar que la informática es otra cosa.

(Por cierto, yo mismo no soy un experto en informática. Estudié matemáticas puras y mi ocupación profesional está mucho más cerca de la ingeniería).

imagen

Source: https://habr.com/ru/post/es411731/


All Articles