Testigos para software matemático

11

Yo, como muchas personas, soy un usuario entusiasta de software matemático como Mathematica y Maple. Sin embargo, me siento cada vez más frustrado por los muchos casos en que dicho software simplemente le da la respuesta incorrecta sin previo aviso. Esto puede ocurrir al realizar todo tipo de operaciones, desde sumas simples hasta la optimización, entre muchos otros ejemplos.

Me he estado preguntando qué se podría hacer con este grave problema. Lo que se necesita es alguna forma de permitir que el usuario verifique la exactitud de una respuesta que se le da para que tenga cierta confianza en lo que se le dice. Si tuviera que obtener una solución de un colega de matemáticas, él / ella podría simplemente sentarse y mostrarle su trabajo. Sin embargo, esto no es factible para una computadora en la mayoría de los casos. ¿Podría la computadora darle un testigo simple y fácilmente comprobable de la exactitud de su respuesta? Es posible que la verificación tenga que hacerse por computadora, pero es de esperar que verificar el algoritmo de verificación sea mucho más fácil que verificar el algoritmo para producir el testigo en primer lugar. ¿Cuándo sería factible y cómo podría formalizarse exactamente?

En resumen, mi pregunta es la siguiente.

¿Podría ser posible, al menos en teoría, que el software matemático proporcione una prueba comprobable breve junto con la respuesta que ha solicitado?

Un caso trivial en el que podemos hacer esto de inmediato es la factorización de enteros, por supuesto, o muchos de los problemas clásicos de NP completo (por ejemplo, circuito hamiltoniano, etc.).

Comunidad
fuente
¿Puedes dar un ejemplo donde la respuesta producida es incorrecta? Por supuesto, es posible generar una prueba verificable de la exactitud de los cálculos, pero dicha prueba no necesita ser fácil de verificar a mano, simplemente porque el software generalmente usa algoritmos altamente no triviales que son más eficientes que los más intuitivos.
Mahdi Cheraghchi
Di dos ejemplos en la pregunta, pero los colores del enlace pueden no ser fáciles de ver. Haga clic en "sumas" u "optimización".
1
¿ Algo de lo que hicieron Manuel Blum y Sampath Kannan en dl.acm.org/citation.cfm?id=200880 ?
Andrej Bauer el
Es posible que desee echar un vistazo a Algoritmos de certificación .
Pratik Deoghare
sí, muchos sistemas de software simbólico se tratan como "cajas negras" y esta también es una estrategia corporativa para proteger los secretos comerciales. (1) pruebe las alternativas de código abierto (2) considere la "mejor práctica" de ingeniería de software de "pruebas unitarias". brevemente, la idea sería crear "comprobaciones de cordura" de los resultados, por ejemplo, sustituyendo valores conocidos, otras manipulaciones, inversas, etc. por pruebas bien construidas, es poco probable que tanto la fórmula como la prueba fallen de una manera que proporcione un "falso positivo".
vzn

Respuestas:

5
  1. El concepto de "testigos" o "pruebas verificables" no es totalmente nuevo: como se menciona en los comentarios, busque el concepto de "certificado". Se me ocurrieron tres ejemplos, hay más (en los comentarios y en otros lugares):

    • Kurt Mehlhorn describió en 1999 un problema similar en los algoritmos de geometría computacional (por ejemplo, errores menores en las coordenadas pueden producir grandes errores en los resultados de algún algoritmo), resuelto de manera similar en la biblioteca Leda , al insistir en que cada algoritmo produce un "certificado" de su respuesta además de la respuesta misma.

    • Demaine, López-Ortiz y Munro en 2000 utilizaron los conceptos de certificados (los llaman "pruebas") para mostrar límites inferiores adaptativos en el cálculo de la unión y la intersección (y la diferencia, pero esta es trivial) de conjuntos ordenados. No excluya su trabajo porque no utilizaron certificados para protegerse contra errores informáticos: demostraron que aunque el certificado puede ser lineal en el tamaño de la instancia en el peor de los casos, a menudo es más corto y, por lo tanto, puede "comprobarse" "en tiempo sublineal (dado acceso aleatorio a la entrada como una matriz ordenada o un B-Tree), y en particular en un tiempo inferior al requerido para calcular dicho certificado.

    • He estado usando el concepto de certificados en varios otros problemas desde que vi a Ian Munro presentando su implementación en Alenex 2001 , y en particular para las permutaciones (disculpas por el enchufe descarado, viene otro), donde el certificado es más corto en el mejor de los casos que en el peor de los casos, lo que produce una estructura de datos comprimidos para permutaciones. Una vez más, verificar el certificado (es decir, el orden) lleva más tiempo lineal, menos que calcularlo (es decir, ordenarlo).

  2. El concepto no siempre es útil para la verificación de errores: existen problemas en los que la verificación del certificado lleva tanto tiempo como la producción (o simplemente la producción del resultado). Se me ocurren dos ejemplos, uno trivial y otro complicado, Blum y Kannan (mencionados en los comentarios) dan otros.

    • nn
    • El certificado para el casco convexo en dos y tres dimensiones, si los puntos se dan en orden aleatorio, toma tantos bits para codificar como las comparaciones para calcular [FOCS 2009] (otro conector descarado).

La biblioteca Leda es el esfuerzo más general (que yo sepa) para hacer que los algoritmos deterministas de producción de certificados sean la norma en la práctica. El trabajo de Blum y Kannan es el mejor esfuerzo que vi para que sea la norma en teoría, pero sí muestran los límites de este enfoque.

Espero eso ayude...

Jeremy
fuente
Gracias eso es muy interesante. Con respecto a su punto 2. Creo que estoy hablando de algo un poco diferente. El problema no son los errores en el código, sino algoritmos que sabemos que pueden dar una respuesta incorrecta. Además, a nivel mundano, ni siquiera sé cómo sería un certificado útil para muchas funciones matemáticas. Por ejemplo, para una suma infinita o, por ejemplo, la minimización de una función.
Para ser un poco más claro. Parece que es muy difícil idear algoritmos probablemente correctos para muchos problemas matemáticos. Sin embargo, vivimos con algoritmos que pueden cometer errores sin avisarnos (y de hecho son demostrablemente incorrectos) por razones prácticas. La esperanza de que no sea (tan) difícil diseñar correctores de corrección probables para el mismo conjunto de problemas.
Me estoy alejando de mi experiencia, pero pensé que los errores de cálculo generalmente fueron causados ​​por errores de redondeo con resultados intermedios (fue claramente el caso en los ejemplos que motivaron a Leda) en operaciones básicas (multiplicaciones, divisiones, etc.) en lugar de errores en los algoritmos Pensé que los sistemas algebraicos como el arce y el matlab evitaban esos :(
Jeremy
Es una pregunta interesante y tal vez alguien aquí lo sepa con certeza. Sin embargo, muchas de las respuestas incorrectas de las que estoy hablando no son para cálculos numéricos, por lo que esto implica al menos prima facie que los problemas son más de lo que usted describe. No conozco la complejidad de calcular límites / sumas infinitas, etc., pero supongo que, en general, son intratables en el peor de los casos, por lo que las heurísticas que a veces dan la respuesta incorrecta son necesarias / útiles. mathematica.stackexchange.com/questions/tagged/bugs no es poco informativo para hacerse una idea de las cosas que van mal.
CS teórico tiene el concepto de autocomprobación, que se aplica a muchos problemas en álgebra lineal. Una de las ideas básicas es que, para muchos problemas, la solución se puede verificar (quizás con un poco de información adicional) más fácilmente de lo que se puede calcular. Ver, por ejemplo, https://doi.org/10.1016/0022-0000(93)90044-W .
Neal Young