Questo dipende davvero dalla complessità del codice e della matematica. Il codice stesso dovrebbe - come sempre - essere il più auto-documentabile possibile. Assegna nomi alle variabili correttamente, implementa metodi logici e concisi (piuttosto che mega-funzioni), aggiungi la documentazione in linea dove appropriato (ad esempio quando non è evidente ciò che il codice sta effettivamente facendo).
Se stai utilizzando un algoritmo non ovvio, aggiungi un link a un riferimento alla fonte. Questa è una pratica ragionevole perché offre allo sviluppatore un modo molto veloce per scoprire cosa stai facendo. Come ho detto, questo è utile se si tratta di un algoritmo non ovvio ma complesso. Ciò dovrebbe dimostrare che (a) stai facendo qualcosa che ha senso, e (b) qualcuno ha dimostrato che funziona.
Un buon esempio è un po 'di lavoro che ho fatto intorno alla corrispondenza del testo fuzzy. Ho fatto ricerche approfondite sugli algoritmi e ho implementato quello che è noto come "algoritmo di Smith-Waterman" (che è effettivamente usato per le sequenze di DNA, ma si applica generalmente al "matching"). Quindi, invece di implementare semplicemente l'algoritmo, ho trovato i riferimenti online e incluso un link o due. Come sopra, questo dimostra che (a) il mio algoritmo corrisponde all'algoritmo pubblicato e (b) l'algoritmo è stato rivisto e mostrato come funzionante.
Tuttavia questo non spiega necessariamente come funziona il codice e cosa dovrebbero fare le varie classi. Quando vai a scrivere una "vera" documentazione - una guida per sviluppatori al sistema - dovresti spiegare cosa hai fatto e fornire informazioni sufficienti per il supporto futuro. A mio parere questo documento dovrebbe essere leggibile da una persona tecnicamente agnostica; non ha bisogno di essere "snobbato", ma dovrebbe escludere il gergo e non fare affidamento sulla presunta conoscenza.