Esto realmente depende de lo complicado que sea el código y las matemáticas. El código en sí debería, como siempre, ser tan autodocumentable como sea posible. Nombre las variables correctamente, implemente métodos lógicos y concisos (en lugar de megafunciones), agregue documentación en línea cuando sea apropiado (es decir, cuando no es obvio lo que el código está haciendo realmente).
Si está utilizando un algoritmo no obvio, agregue un enlace a una referencia de la fuente. Esta es una práctica razonable porque le brinda al desarrollador una forma muy rápida de descubrir lo que está haciendo. Como dije, esto es útil si es un algoritmo no obvio pero complejo. Esto debería probar que (a) está haciendo algo que tiene sentido, y (b) alguien ha demostrado que funciona.
Un buen ejemplo es el trabajo que hice sobre la coincidencia de texto difuso. Hice una investigación sustancial en algoritmos e implementé lo que se conoce como 'algoritmo Smith-Waterman' (que en realidad se usa para secuencias de ADN, pero se aplica al 'emparejamiento' en general). Entonces, en lugar de simplemente implementar el algoritmo, encontré referencias en línea e incluí un enlace o dos. Como se indicó anteriormente, esto demuestra que (a) mi algoritmo coincide con el algoritmo publicado, y (b) el algoritmo ha sido revisado y demostrado que funciona.
Sin embargo, esto no necesariamente explica cómo funciona el código y qué se supone que deben hacer las diferentes clases. Cuando vaya a escribir documentación 'real', una guía para desarrolladores del sistema, debe explicar lo que ha hecho y proporcionar suficiente información para el soporte futuro. En mi opinión, este documento debe ser legible por una persona técnicamente agnóstica; no necesita ser "tonto", pero debe excluir la jerga y no confiar en el conocimiento asumido.